IT&코딩/Spring

Spring - 5일차 (MVC2 모델 실습)

솔론 2022. 12. 15. 17:45
728x90
반응형

■  springController

 

■ com.care.cf.member

 

□ 컨트롤러 (MemberController)

 

package com.care.cf.member;

import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MemberController {
	
	@Autowired
	private MemberServiceImpl service;
	
	// index 요청이 들어올 경우 실행할 기능
	// http://localhost:8085/cf/index
	@RequestMapping("/index")
	public String index() {
		
		System.out.println("index() 요청이 옴");
		return "index";
	}
	
	// http://localhost:8085/cf/
	@RequestMapping("/")
	public String root() {
		System.out.println("root() 요청이 옴");
		return "index";
	}
	
	/*
	 *  @RequestMapping("/index") : GET or POST 둘 다 받아 동작하는 기능.
	 *  @RequestMapping(value = "login", method = RequestMethod.GET)
	 *   : GET 메소드로 요청하는 상황에서만 받아서 동작하는 기능
	 */
	// http://localhost:8085/cf/login
	@RequestMapping(value = "login", method = RequestMethod.GET) // GET만 받는다.
	public void login() {
		/*
		 * return "login";
		 * 위 코드는 RequestMapping이 value와 동일하기에 생략가능.
		 * 다르면 무조건 작성해야 함.
		 */
	}
	
	@RequestMapping(value = "login", method = RequestMethod.POST)
	public String login(String pw, String id) {
		
		System.out.println("아이디 : " + id);
		System.out.println("비밀번호 : " + pw);
		String msg = service.login(id, pw);
		
		if(msg.equals("로그인 성공")) {
			return "index";
			// response.sendRedirect('index');
			// return "redirect:index";
			// return "forward:index";
			
			// 이 경우에 index 페이지로 가도 url은 login으로 나온다. 
			// 이 경우엔 클라이언트가 직접 index를 요청하게 만들어야 한다.
			// 따라서 요청 - 응답 / 요청 - 응답의 과정을 거쳐야 한다.
			// 이 경우에 쓰는 게 response.sendRedirect('index');
			// 이를 간편하게 나타난 것이 return "redirect:index";
			// return "forward:index"; 포워드는 바로 jsp를 찾아서 실행시키는 게 아니라 맵핑을 찾는다.
			// return "index";와 표면적으로는 차이점이 없지만, 차이점은 메소드가 호출되었다는 점이다.
			// boardList처럼 db에서 데이터를 찾아서 화면에 뿌리는 형식에서는 foward가 필요할 것이다.
			
		} else {
			return "login";
		}
	}
	
	@Autowired private HttpSession session;
	@RequestMapping("logout")
	public String logout() {
		session.invalidate();
		return "index";
	}
	
	// http://localhost:8085/cf/register
	@GetMapping("register")
	public String register() {
		return "member/register"; // views 폴더 안에 새 폴더를 만들었기 때문에 경로를 생략할 수 없다.
	}
	
	// http://localhost:8085/cf/register
	@PostMapping("register")
	public String register(Model model,
			@RequestParam("id")String i,
			@RequestParam("pw")String p,
			@RequestParam("name")String n){
		System.out.println("아이디 : " + i);
		System.out.println("비밀번호 : " + p);
		System.out.println("이름 : " + n);
		
		String msg = service.insert(i, p, n);
		model.addAttribute("msg", msg);
		
		if(msg.equals("회원 가입 완료")) {
			return "index";
		} else {
			//   /WEB-INF/views/
			return "member/register";
		}
		
	}
	
	// 페이지를 달라하는 건 전부 GET
	// POST는 폼의 method에 명시할 때만 
	// POST를 쓸 수 있는 곳 : 사용자의 입력값이 입력되는 곳.
	
	// Mapping을 왜 나누는가?
	// 화면에 페이지를 달라는 건 GET Mapping
	
	@RequestMapping("list")
	public String list(Model model) {
		
		model.addAttribute("members", service.selectAll());
		return "list";
	}
	
	@GetMapping("update")
	public String update() {
		String id = (String)session.getAttribute("id");
		if(id==null)
			return "login";
		else {
			return "update";
		}
	}
	
	@PostMapping("update")
	public String update(MemberDTO member) {
		System.out.println("아이디 : " + member.getId());
		System.out.println("비밀번호 : " + member.getPw());
		System.out.println("이름 : " + member.getName());
		
		member.setId((String)session.getAttribute("id"));
		String msg = service.update(member);
		
		if(msg.equals("회원 수정 완료"))
			return "index";
		else {
			return "update";
		}
	}
	
	@GetMapping("delete")
	public String delete() {
		String id = (String)session.getAttribute("id");
		if(id==null)
			return "login";
		else {
			return "delete";
		}
	}
	
	@PostMapping("delete")
	public String delete(String pw, String confirmPw, Model model) {
		String id = (String)session.getAttribute("id");
		String msg = service.delete(id, pw, confirmPw);
		model.addAttribute("msg", msg);
		
		if(msg.equals("회원 삭제 완료"))
			return "index";
		else {
			return "delete";
		}
	}
}

 

ㅁ DTO (MemberDTO)

 

package com.care.cf.member;

public class MemberDTO {
	private String id;
	private String pw;
	private String name;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
		
}

 

□ DAO (IMemberDAO & IMemberDAOImpl)

 

인터페이스와 DAO 

 

IMemberDAO.java

package com.care.cf.member;

import java.util.ArrayList;

public interface IMemberDAO {
	public void insert(MemberDTO member);

	public MemberDTO selectId(String id);

	public void delete(MemberDTO deleteMember);

	public ArrayList<MemberDTO> selectAll();

	public void update(MemberDTO updateMember);
	
}

 

IMemberDAOImpl.java

 

package com.care.cf.member;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.springframework.stereotype.Repository;

@Repository
public class MemberDAOImpl implements IMemberDAO{
	private Connection con;
	
	public MemberDAOImpl() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "spring1212";
		String password = "oracle";
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void insert(MemberDTO member) {
		PreparedStatement ps = null;
		String sql = "INSERT INTO db_basic VALUES(?,?,?)";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, member.getId());
			ps.setString(2, member.getPw());
			ps.setString(3, member.getName());
	
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(ps != null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	@Override
	public MemberDTO selectId(String id) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM db_basic WHERE id=?";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, id);
			rs = ps.executeQuery();
			if(rs.next()) {
				MemberDTO member = new MemberDTO();
				member.setId(rs.getString("id"));
				member.setPw(rs.getString("pw"));
				member.setName(rs.getString("name"));
				return member;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs != null) rs.close();
				if(ps != null) ps.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	@Override
	public void delete(MemberDTO deleteMember) {
		PreparedStatement ps = null;
		String sql = "DELETE FROM db_basic WHERE id=?";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, deleteMember.getId());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(ps != null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	@Override
	public ArrayList<MemberDTO> selectAll() {
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM db_basic";
		ArrayList<MemberDTO> members = new ArrayList<MemberDTO>();
		try {
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				MemberDTO member = new MemberDTO();
				member.setId(rs.getString("id"));
				member.setPw(rs.getString("pw"));
				member.setName(rs.getString("name"));
				members.add(member);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs != null) rs.close();
				if(ps != null) ps.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return members;

	}

	@Override
	public void update(MemberDTO updateMember) {
		PreparedStatement ps = null;
//		String sql = "UPDATE db_basic SET pw=? WHERE id=?";
		String sql = "UPDATE db_basic SET pw=?, name=? WHERE id=?";
		
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, updateMember.getPw());
			ps.setString(2, updateMember.getName());
			ps.setString(3, updateMember.getId());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(ps != null) ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

 

□ Service

 

IMemberService.java

 

package com.care.cf.member;

import java.util.ArrayList;

public interface IMemberService {
	public String insert(String id, String pw, String name);
	
	public void selectId(String id);

	public String delete(String id, String pw, String confirmPw);
	
	public ArrayList<MemberDTO> selectAll();

	public String update(MemberDTO member);
	
}

 

IMemberServiceImpl.java

 

package com.care.cf.member;

import java.util.ArrayList;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberServiceImpl implements IMemberService {
	
	@Autowired
	private MemberDAOImpl memberDao;
	
	@Override
	public String insert(String id, String pw, String name) {
		
		if(id == "" || id == null) {
			return "비정상적인 아이디입니다.";
		}
		
		MemberDTO check = memberDao.selectId(id);
		if(check == null) {
			MemberDTO member = new MemberDTO();
			member.setId(id);
			member.setPw(pw);
			member.setName(name);
			memberDao.insert(member);
			return "회원 가입 완료";
		} else {
			return "이미 가입된 아이디입니다.";
		}
	}

	@Override
	public void selectId(String id) {
		
		MemberDTO member = memberDao.selectId(id);
		
		if(member == null) {
			System.out.println("아이디 정보가 존재하지 않습니다.");
		} else {
			System.out.println("## 검색결과 ##");
			System.out.println();
			System.out.println("아이디  : " + member.getId());
			System.out.println("비밀번호  : " + member.getPw());
			System.out.println("이름: " + member.getName());
			
		}
	}

	@Override
	public String delete(String id, String pw, String confirmPw) {
		if(pw.equals(confirmPw) == false) {
			return "비밀번호 확인 후 다시 입력하세요.";
		}
		
		MemberDTO deleteMember = memberDao.selectId(id); 
		if(deleteMember != null) {
			if(deleteMember.getPw().equals(pw)) {
				memberDao.delete(deleteMember);
				return "회원 삭제 완료";
			}
			return "비밀번호를 정확하게 입력하세요";
		} else {
			return "정보가 존재하지 않습니다.";
		}
	}

	@Override
	public ArrayList<MemberDTO> selectAll() {
		return memberDao.selectAll();
	}

	@Override
	public String update(MemberDTO member) {
		MemberDTO check = memberDao.selectId(member.getId());
		
		if(check != null) {
				memberDao.update(member);
				return "회원 수정 완료";
		} else {
			return "정보가 존재하지 않습니다.";
		}	
	}
	
	@Autowired private HttpSession session;
	public String login(String id, String pw) {
		MemberDTO member = memberDao.selectId(id);
		if(member == null) {
			return "정보가 존재하지 않습니다.";
		}
		if(member.getPw().equals(pw) == false) {
			return "비밀번호가 일치하지 않습니다.";
		}
		
		session.setAttribute("id", member.getId());
		session.setAttribute("name", member.getName());
		
		return "로그인 성공";
	}

}

 


 

■ View 영역 

 

□  인덱스

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>

<style>
	a{text-decoration: none;}
</style>

</head>
<body>

	<a href="index">인덱스</a>
	
	<c:choose>
		
		<c:when test="${empty sessionScope.id }">
			<a href="login">로그인</a>
			<a href="register">회원가입</a>
		</c:when>
		
		<c:otherwise>
			<a href="logout">로그아웃</a>
			<a href="list">회원목록</a>
			<a href="update">회원수정</a>
			<a href="delete">회원삭제</a>
		</c:otherwise>
	
	</c:choose>		

</body>
</html>

 

□ 회원가입

 

register.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>

	<c:url value="/" var="contextRoot"/>
	<h3>${msg }</h3>
	<form action="register" method="post">
		<input type="text" name="id" placeholder="아이디"/><br>
		<input type="password" name="pw" placeholder="비밀번호"/><br>
		<input type="text" name="name" placeholder="이름"/><br>
		<input type="submit" value="회원가입"/>
		<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
	</form>

</body>
</html>

 

□ 로그인

 

login.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
	<%--
		지금 사용 중인 프로젝트의 컨텍스트를 구해서 contextRoot라는 변수에 저장함
	--%>
	<c:url value="/" var="contextRoot"/>
	
	<form action="login" method="post">
		<input type="text" name="id" placeholder="아이디"/><br>
		<input type="password" name="pw" placeholder="비밀번호"/><br>
		<input type="submit" value="로그인"/>
		<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
	</form>

	<%--
		action에 /쓰면 최상위 톰캣부터 시작
		그냥 login으로 쓰면 상대경로 /cf/ 뒤부터 시작.
	 --%>

</body>
</html>

 

□ 회원목록

 

list.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list</title>

<style>
	a{text-decoration: none;}
</style>

</head>
<body>
	
	<h2>회원 목록</h2>
	
	<c:choose>
	
		<c:when test="${empty members }">
			<h3>회원의 정보가 없습니다.</h3>
		</c:when>
		
		<c:otherwise>
				<table border="1">
					<tr>
						<th>아이디</th>
						<th>비밀번호</th>
						<th>이름</th>
					</tr>
		
					<c:forEach items="${members }" var="member">
						<tr>
							<td>${member.id }</td>
							<td>${member.pw }</td>
							<td>${member.name }</td>
						</tr>
					</c:forEach>
				</table>
		</c:otherwise>
	
	</c:choose>
	
	<br><br>
	<a href="index">인덱스 페이지로 이동</a>
	
</body>
</html>

 

□ 회원정보 수정

 

update.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>update</title>
</head>
<body>

	<c:url value="/" var="contextRoot"/>
	
	<form action="update" method="post">
		<input type="text" readonly="readonly" value="${sessionScope.id }"/><br>
		<input type="password" name="pw" placeholder="비밀번호"/><br>
		<input type="text" name="name" value="${sessionScope.name }"/><br>
		<input type="submit" value="회원수정"/>
		<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
	</form>

</body>
</html>

 

□ 회원 탈퇴(삭제)

 

delete.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>delete</title>

<script>
	function check(){
		if(confirm("탈퇴하시겠습니까?"))
			document.getElementById('f').submit();
	}
	
</script>
<style type="text/css">
	h3{color : red}
</style>

</head>
<body>
	
	<c:url value="/" var="contextRoot"/>
	<h3>${msg }</h3>
	<form action="delete" method="post" id="f">
		<input type="text" value="${sessionScope.id }" readonly="readonly" /><br>
		<input type="password" name="pw" placeholder="비밀번호"/><br>
		<input type="password" name="confirmPw" placeholder="비밀번호 확인"/><br>
		<input type="button" value="회원탈퇴" onclick="check();"/>
		<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
	</form>

</body>
</html>

 

 

728x90
반응형