JSP [09] 로그인

totwo·2024년 7월 13일

JSP/Servlet/JSTL

목록 보기
9/15
post-thumbnail

전에 회원가입을 통해 사용자의 정보(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>
		<% } %>

profile
Hello, World!

0개의 댓글