시각적으로 보여지는 부분과 데이터를 처리하는 부분을 분리하여 유연한 구조를 설계


Model
Controller
View


Model1 vs Model2

→ Model1은 잘 사용하지않는다.
MVC Pattern


Main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
display:inline;
}
</style>
</head>
<body>
<fieldset>
<legend> Main </legend>
<a href="./Join.jsp"> <button> 회원가입 </button> </a>
<a href="./Login.jsp"> <button> 로그인 </button> </a>
</fieldset>
</body>
</html>
Join.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
display:inline;
}
</style>
</head>
<body>
<fieldset>
<legend> 회원가입 </legend>
<!-- action에 적을 때
servlet을 요청 : url mapping값(확장자X)
jsp로 요청 : 해당 jsp로 가기 위한 상대경로 -->
<form action="JoinProgram">
<table>
<tr>
<td> ID : </td>
<td> <input type="text" name="id"> </td>
</tr>
<tr>
<td> PW : </td>
<td> <input type="password" name="pw"> </td>
</tr>
<tr>
<td> NAME : </td>
<td> <input type="text" name="name"> </td>
</tr>
<tr>
<td><input type="submit" value="회원가입"></td>
</tr>
</table>
</form>
</fieldset>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
fieldset {
display: inline;
}
</style>
</head>
<body>
<fieldset>
<legend> 로그인 </legend>
<form action="LoginProgram" method="post">
<table>
<tr>
<td> ID : </td>
<td> <input type="text" name="id"> </td>
</tr>
<tr>
<td> PW : </td>
<td> <input type="password" name="pw"> </td>
</tr>
<tr>
<td><input type="submit" value="로그인"></td>
</tr>
</table>
</form>
</fieldset>
</body>
</html>
loginSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
display: inline;
}
</style>
</head>
<body>
<%
String name = request.getParameter("name");
// MemberDTO login_dto = request.getAttribute("name");
// String name = login_dto.getName();
%>
<fieldset>
<h3>로그인 성공!</h3>
<%= name %>님 환영합니다~!
<!-- ${login_dto.name}님 환영합니다~! -->
</fieldset>
</body>
</html>
loginFail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
display: inline;
}
</style>
</head>
<body>
<fieldset>
<h3> 로그인 실패 </h3>
<a href="./Main.jsp"> <button> 메인 </button> </a>
<a href="./Login.jsp"> <button> 로그인 </button> </a>
</fieldset>
</body>
</html>
JoinProgram.java
@WebServlet("/JoinProgram")
public class JoinProgram extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[JoinProgram]");
// Join.jsp에서 보낸 id, pw, name 3가지 데이터를
// 받아와서 console창에 출력
// post방식 디코딩
response.setContentType("utf-8");
// id, pw, name 데이터 받아오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
System.out.println("id : " + id);
System.out.println("pw : " + pw);
System.out.println("name : " + name);
// DTO(Data Transfer Object) 묶기
MemberDTO dto = new MemberDTO(id, pw, name);
// 회원가입 기능이 있는 join메소드 호출
int row = new MemberDAO().join(dto);
// MemberDAO dao = new MemberDAO();
// dao. join(dto);
// 성공 실패 여부 확인
// 성공 -> Login.jsp
// 실패 -> Main.jsp
String moveURL;
if(row > 0) {
System.out.println("회원가입 성공");
moveURL = "./Login.jsp";
}else {
System.out.println("회원가입 실패");
moveURL = "./Main.jsp";
}
response.sendRedirect(moveURL);
}
}
LoginProgram.java
@WebServlet("/LoginProgram")
public class LoginProgram extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[LoginProgram]");
response.setContentType("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
System.out.println("id : " + id);
System.out.println("pw : " + pw);
MemberDTO dto = new MemberDTO(id, pw);
String name = new MemberDAO().login(id, pw);
String moveURL;
if(name != null) {
// 로그인 성공
// sendRedirect 페이지 이동 방식
name = URLEncoder.encode(name, "UTF-8");
System.out.println("로그인 성공");
response.sendRedirect("./loginSuccess.jsp?name="+name);
// forwarding 페이지 이동 방식
// RequestDispatcher rd = request.getRequestDispatcher("./loginSuccess.jsp");
// request.setAttribute("login_dto", login_dto);
// rd.forward(request, response);
}else {
// 로그인 실패
System.out.println("로그인 실패");
response.sendRedirect("./loginFail.jsp");
}
}
}
MemberDAO.java
public class MemberDAO {
// DAO(Data Access Object) : DB에 접근하는 객체
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
// DB연결 메소드
public void db_conn() {
try {
// 1. ojdbc6.jar 라이브러리 불러오기
// C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
// webapp -WEB-INF -lib 폴더에 넣기
// 2. OracleDriver class 불러오기
// OracleDriver : Java와 DB 사이에 통로를 만들어주는 역할
Class.forName("oracle.jdbc.driver.OracleDriver");
// 3. DB에 접속하기 위한 카드키 설정(주소, 계정, 비번)
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "service";
String pw = "12345";
// 4. DB에 접속 -> 접속 성공 시 Connection 객체로 반환
conn = DriverManager.getConnection(url, user, pw);
} catch (Exception e) {
e.printStackTrace();
}
}
// DB연결 종료 메소드
public void db_close() {
try {
if(psmt != null) psmt.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 회원가입 메소드
public int join(MemberDTO dto) {
int row = 0;
try {
db_conn();
// 5. SQL 쿼리 작성 -> ? : 바인드변수 -> 성능향상을 위해(soft parsing)
String sql = "insert into Member1 values(?, ?, ?)";
// 6. SQL문장을 DB에 전달 -> 전달 성공 시 PrepareStatement 객체로 반환
psmt = conn.prepareStatement(sql);
// 7. 바인드변수 값 채우기
// psmt.set자료형(물음표의 순서, 넣을 값)
psmt.setString(1, dto.getId());
psmt.setString(2, dto.getPw());
psmt.setString(3, dto.getName());
// 8. 실행
// executeUpdate : DB에 변화가 생겼을 때, select구문을 제외한 모든 구문
// executeQuery : DB에 질의할 때, select구문
// int로 return하는 이유 : 몇 개의 행이 변화되었는지 알려주는 것!
row = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally { // 무조건 (열려있으면 닫으세요)
db_close();
} return row;
}
// 로그인 메소드
public String login(String id, String pw) {
// 1. DB연결 메소드 호출
db_conn();
String name = null;
try {
// 2. 쿼리문 작성
String sql = "select * from Member1 where id= ? and pw= ?";
// 3. SQL문 DB에 전달 -> PrepareState객체 생성(psmt)
psmt = conn.prepareStatement(sql);
// 4. 받아온 id와 pw를 SQL문에 셋팅
psmt.setString(1, id);
psmt.setString(2, pw);
rs = psmt.executeQuery();
while(rs.next()) {
name = rs.getString("name");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. DB연결 종료 메소드 호출
db_close();
} return name;
}
}
MemberDTO.java
public class MemberDTO {
// DTO(Data Transfer Object) : 데이터 전달 객체
// 테이블 형태 그대로 생성
// 필드
private String id;
private String pw;
private String name;
// 메소드
// 생성자 메소드 : 객체를 초기화 하기 위한 메소드
// MemberDTO dto = new MemberDTO(id, pw, name);
public MemberDTO(String id, String pw, String name) {
this.id = id;
this.pw = pw;
this.name = name;
}
// 로그인을 위한 생성자 메소드
public MemberDTO(String id, String pw) {
this.id = id;
this.pw = pw;
}
// Getter (불러오는거기때문에 매개변수 필요없다.)
public String getId() {
return id;
}
public String getPw() {
return pw;
}
public String getName() {
return name;
}
}