
전에 회원가입을 통해 사용자의 정보(email, pw, phone, addr)를 DB에 저장했다면,
이제 로그인 기능을 만들어야 하는데
이때 객체지향 5원칙(SOLID) 에서
S를 뜻하는 단일 책임 원칙 SRP(Single Responsibility Principle)을 생각하면 된다.
- 단일 책임 원칙이란?
: 하나의 객체는 하나의 동작만의 책임한다.
→ 그렇기 때문에 로그인 Servlet은 회원가입 Servlet과 따로 만들어야 한다.
회원가입이나 로그인은 회원들의 정보가 저장된 DB에 접근해야 하는 건 똑같기 때문에
이때 MVC패턴의 View, Controller, Model(DTO, DAO)로 구성하면 된다.
- View : 사용자에게 보여지는 인터페이스. Controller에게 받은 Model의 데이터를 사용자에게 보여준다.
- Controller : Model과 View 사이에서 데이터 흐름을 제어한다.
- DAO : DataBase와 접근하여 주고 받는 역할
- DTO : Data 전달을 위해 사용하는 데이터 객체. getter/setter
데이터 전달을 위해 데이터 객체 DTO로 데이터를 묶어주고,
DB와 접근하여 데이터를 주고 받을 수 있는 (회원가입, 로그인을 할 JDBC가 담긴) DAO를 만들기로 한다!
전에 회원가입을 위해 만들어놨던 Servlet을 Controller와 DAO로 분리하고,
로그인 Controller 기능을 할 Servlet을 하나 만들어주면 된다.
[DTO - 데이터 객체]
public class MemberDTO {
// 한사람 회원의 정보를 저장하는 클래스 (private 사용!!)
private String email;
private String pw;
private String phone;
private String addr;
// 로그인을 위해 만든 생성자
public MemberDTO(String email, String pw) {
this.email = email;
this.pw = pw;
}
// 회원가입을 위해 만든 생성자
public MemberDTO(String email, String pw, String phone, String addr) {
this.email = email;
this.pw = pw;
this.phone = phone;
this.addr = addr;
}
// getter, setter 생성
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
[DAO - 회원가입, 로그인]
public class MemberDAO {
// (1) 회원가입
public int join(MemberDTO dto) {
int cnt = 0;
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_id = "hr";
String db_pw = "12345";
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
String sql = "INSERT INTO MEMBER VALUES (?,?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, dto.getEmail());
psmt.setString(2, dto.getPw());
psmt.setString(3, dto.getPhone());
psmt.setString(4, dto.getAddr());
cnt = psmt.executeUpdate();
if (cnt > 0) {
System.out.println("추가 성공");
} else {
System.out.println("추가 실패");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("동적 로딩 실패");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("권한 확인 실패");
} finally {
try {
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("자원 반납 실패");
}
}
return cnt;
}
// (2) 로그인
public MemberDTO login(MemberDTO dto) {
MemberDTO info = null;
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String db_id = "hr";
String db_pw = "12345";
String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
conn = DriverManager.getConnection(db_url, db_id, db_pw);
String sql = "SELECT * FROM MEMBER WHERE EMAIL=? AND PW=?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, dto.getEmail());
psmt.setString(2, dto.getPw());
rs = psmt.executeQuery();
if (rs.next()) {
// 로그인 성공
String email = rs.getString("EMAIL");
String pw = rs.getString("PW");
String phone = rs.getString("PHONE");
String addr = rs.getString("ADDR");
info = new MemberDTO(email, pw, phone, addr);
}
// rs는 커서라는 개념.
// 로그인 시 커서는 해당 컬럼의 위치를 가리킨다 (내려온다)
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("동적 로딩 실패");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("권한 확인 실패");
} finally {
try {
if (rs != null)
rs.close();
if (psmt != null)
psmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("자원 반납 실패");
}
}
return info;
}
}
[회원가입 Controller]
// ** Join Controller (Servlet)**
@WebServlet("/JoinService")
public class JoinService extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("EUC-KR");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String phone = request.getParameter("phone");
String addr = request.getParameter("addr");
MemberDAO dao = new MemberDAO();
MemberDTO dto = new MemberDTO(email, pw, phone, addr);
int cnt = dao.join(dto);
if (cnt > 0) {
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
response.sendRedirect("main.jsp");
}
}
[로그인 Controller]
// ** Login Controller(Servlet) **
@WebServlet("/LoginService")
public class LoginService extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
String pw = request.getParameter("pw");
MemberDTO dto = new MemberDTO(email, pw);
MemberDAO dao = new MemberDAO();
MemberDTO info = dao.login(dto); // 로그인 성공시 받아오는 정보(email,pw,phone,addr)가져오기
// 로그인 성공 실패 판별
if (info != null) {
System.out.println("로그인 성공");
HttpSession session = request.getSession();
session.setAttribute("info", info);
} else {
System.out.println("로그인 실패");
}
response.sendRedirect("main.jsp");
}
}
[ View에서 로그인시 환영문구가 뜨도록 배너 만들기 ]
<!-- 로그인/회원가입 기능 전에 만들어놓고-->
<%
MemberDTO info = (MemberDTO)session.getAttribute("info");
// session에 info가 없으면 null
%>
<section id="banner" class="major">
<div class="inner">
<header class="major">
<% if(info != null){%>
<h1><%= info.getEmail() %>님 환영합니다.</h1>
<% }else{ %>
<h1>로그인을 먼저 진행해주세요</h1>
<% } %>
