본문 바로가기

JSP & Servlet

회원가입, 로그인, 로그아웃 21. 03. 16.

lombok 라이브러리

- vo 만들 때 생성자, getter, setter, toString 등을 이클립스에서 자동생성하면 스크롤이 너무 길어지는데, 라이브러리를 쓰면 @(어노테이션)으로 짧게 표시 가능.

.jar 위치


-- Member.java

package vo; // 컴포넌트

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

//@Getter
//@Setter
//@NoArgsConstructor
//@AllArgsConstructor
//@ToString

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Member {
	private String userid;
	private String password;
	private String name;
	private String email;
	private String birthDate;
	private String regDate;

//	===============================================================
//	public String getUserid() {
//		return "커스텀 게터";
//	}
//	public static void main(String[] args) {
//		System.out.println(new Member());
//	}
}

 

- 변수 선언 시 꿀팁!

SQL Developer에서 만들어서 긁어오기.

 

SELECT 'private String ' || lower(COLUMN_NAME) || ';'
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'MEMBER';

 

 

 


-- MemberService.java

package service;

import vo.Member;

public interface MemberService {
	// 최소한 서비스는 인터페이스로 구현해야 함. > 이유는 다음에
	
	// 가입
	public abstract void join(Member member); // public abstract는 생략 가능
	// 로그인
	Member login(Member member);
	// 로그아웃
	void logout(Member member);
	
	// id를 통한 회원찾기
	Member findBy(String userid);
}

-- MemberDao .java : DB관련 작업. 연동

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import util.DBConn;
import vo.Member;

public class MemberDao {

	public void join(Member member) {
		Connection connection = DBConn.getConnection();
		// 문장 작성
		try {
//		Statement stmt = connection.createStatement();
//		String sql = "INSERT INTO MEMBER(USERID, PASSWORD, NAME, EMAIL, BIRTHDATE) VALUES\r\n" + 
//				"(' " + member.getUserid() + " ', '" + member.getPassword() + ""
//					+ "', '" + member.getName() + "', '" + member.getEmail() + "', "
//						+ "TO_DATE('" + member.getBirthDate() + "', 'YYMMDD'))";
//		// 작성 문장을 실행
//		stmt.executeUpdate(sql);
//		==============================================================================
		// 전처리 문장을 선언
		String sql = "INSERT INTO MEMBER(USERID, PASSWORD, NAME, EMAIL, BIRTHDATE) VALUES\r\n" + 
				"(?, ?, ?, ?, TO_DATE(?, 'YYMMDD'))";
		
		// 전처리 문장 생성
		PreparedStatement pstmt = connection.prepareStatement(sql);
		
		int idx = 1;
		pstmt.setString(idx++, member.getUserid());
		pstmt.setString(idx++, member.getPassword());
		pstmt.setString(idx++, member.getName());
		pstmt.setString(idx++, member.getEmail());
		pstmt.setString(idx++, member.getBirthDate());
		
		// 실행
		pstmt.executeUpdate();
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		
		// insert
	}

	public Member login(Member member) {
		Member result = null;
		Connection conn = DBConn.getConnection();
		String sql = "SELECT USERID, PASSWORD, NAME, EMAIL, TO_CHAR(BIRTHDATE, 'YYMMDD'), TO_CHAR(REGDATE, 'YYMMDD')\r\n" + 
				"FROM MEMBER WHERE USERID = ? AND PASSWORD = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, member.getUserid());
			pstmt.setString(2, member.getPassword());
			
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				int idx = 1;
				result = new Member(
					rs.getString(idx++),
					rs.getString(idx++),
					rs.getString(idx++),
					rs.getString(idx++),
					rs.getString(idx++),
					rs.getString(idx++)
				);
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
		
	}
//	public static void main(String[] args) {
//		Member member = new Member("il", "1234", null, null, null, null);
////		new MemberDao().join(member);
//		System.out.println(new MemberDao().login(member));
//	}
}

- PreparedStatement 이용!!

- PreparedStatement변수명.setString(몇 번째 물음표인지 숫자로 표시,들어갈 값

- DAO (Data Access Object) : 데이터베이스의 데이터에 접근하는 트랜잭션 객체. DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

- 사용자가 필요한 Interface를 DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용할 수 있도록 반환해 줌.


 

-- MemberServiceImpl.java

package service;

import dao.MemberDao;
import lombok.Getter;
import vo.Member;

@Getter
public class MemberServiceImpl implements MemberService {
	private MemberDao memberDao = new MemberDao();
	
	@Override
	public void join(Member member) {
		// TODO Auto-generated method stub
		memberDao.join(member);
	}

	@Override
	public Member login(Member member) {
		// TODO Auto-generated method stub
		return memberDao.login(member);
	}

	@Override
	public void logout(Member member) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Member findBy(String userid) {
		// TODO Auto-generated method stub
		return null;
	}
}

 


-- Join.java

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import service.MemberService;
import service.MemberServiceImpl;
import vo.Member;

@WebServlet("/join")
public class Join extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 페이지 포워드
		req.getRequestDispatcher("join.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8"); // 한글처리
		
		String userid = req.getParameter("userid");
		String password = req.getParameter("password");
		String name = req.getParameter("name");
		String email = req.getParameter("email");
		String birthDate = req.getParameter("birthDate");
		
		Member member = new Member(userid, password, name, email, birthDate, null);
		System.out.println(member);
		MemberService service = new MemberServiceImpl();
		service.join(member);
		
		// get으로 리다이렉트
		resp.sendRedirect("login");
	}
}

 

-- 실행했을 때 연결될 join.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<title>2021. 3. 16. 오전 11:27:18</title>
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
	<h1>회원가입</h1>	
	<form method="post">
		<fieldset>
			<legend>가입</legend>
			<ul>
				<li><label>아이디 <input type="text" name="userid"></label></li>
				<li><label>비밀번호 <input type="password" name="password"></label></li>
				<li><label>이름 <input type="text" name="name"></label></li>
				<li><label>이메일 <input type="text" name="email"></label></li>
				<li><label>생년월일 <input type="text" name="birthDate"></label></li>
				<li><button>가입하기</button>
				<a href="join"><button type="button">가입취소</button></a>
				</li>
			</ul>
		</fieldset>
	</form>
</body>
</html>

 

join.jsp 실행 화면

 

 

 

join.java에서 db에 넣기 전에(service.join이랑 리다이렉트 주석처리) 콘솔에 멤버 찍어보고 한글 안 깨지는지 확인

 

주석 지우고 join.java 실행하면 회원가입 후 로그인 페이지로 이동.

 

요청은 다 컨트롤러에서 하는 것.

 

-- Login.java

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import service.MemberService;
import service.MemberServiceImpl;
import vo.Member;

@WebServlet("/login")
public class Login extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 페이지 포워드
		req.getRequestDispatcher("login.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 아이디, 패스워드 값 확인 (파라미터로 넘어옴)
		req.setCharacterEncoding("utf-8"); // HTTP 세상은 1바이트라. 한글처리
		
		Member member = new Member();
		member.setUserid(req.getParameter("id"));
		member.setPassword(req.getParameter("pw"));
		
//		System.out.println(member);
		MemberService service = new MemberServiceImpl();
		
		// 분기
		Member result = service.login(member);
		System.out.println(result);
		if(result != null) {
			// 로그인 성공시
			HttpSession session = req.getSession(); // 세션생성
			session.setAttribute("member", result);
			
			String idsave = req.getParameter("idsave");
			System.out.println(idsave);
			if(idsave != null) {
				// 쿠키사용
				Cookie cookie = new Cookie("idsave", member.getUserid());
				// 시간 안 정하면 세션이랑 시간이 똑같음.
				cookie.setMaxAge(60 * 60 * 24 * 365);
				resp.addCookie(cookie);
			}
			else {
				for(Cookie cookie : req.getCookies()) {
					if(cookie.getName().equals("idsave")) {
						cookie.setMaxAge(0);
						resp.addCookie(cookie);
					}
				}
			}
		}
		resp.sendRedirect("login");
	}
	
}

 

- 아이디 저장 체크시 쿠키 생성.

- 체크 해제하고 로그인 성공하면 쿠키 삭제하고 그 결과값을 응답해야 함. 

  ( cookie.setMaxAge(0); resp.addCookie(cookie); )

 

 

-- login.jsp

 

<%@page import="vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<title>2021. 3. 15. 오전 11:38:24</title>
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
	<%
		String idsave = null;
		for(Cookie cookie : request.getCookies()) {
			if(cookie.getName().equals("idsave")) {
				idsave = cookie.getValue();
			}
			/* out.println(cookie);
			out.println(cookie.getName());
			out.println(cookie.getValue());
			out.println(cookie.getMaxAge());
			out.println("<hr>");  */
			
		}
	%>
	<form method="post">
		<% if(session.getAttribute("member") == null) { // 로그인 안 된 상태 %>
		<ul>
			<li>
				아이디 <input type="text" name="id" value=<%=idsave == null ? "" : idsave %>>
				비밀번호 <input type="password" name="pw">
			</li>
			<li>
				<label>아이디 저장 <input type="checkbox" name="idsave" <%=idsave == null ? "" : "checked" %>></label>
			</li>
			<li>
				<button>로그인</button>
				<a href="join"><button type="button">회원가입</button></a>
			</li>
		</ul>
		<% } else {  // 로그인 상태 %>
		<ul>
			<li><%=((Member)session.getAttribute("member")).getName()%> 님 환영합니다. <button formaction="logout">로그아웃</button></li>
		</ul>
		<% } %>
	</form>
	
</body>
</html>

 

- getAttribute 리턴 타입이 Object라서 Member로 캐스팅 해 줌.


 

-- Logout.java

 

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/logout")
public class Logout extends HttpServlet{
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		arg0.getSession().invalidate();
		arg1.sendRedirect("login");
	}
}

 

- 세션 종료 = 로그아웃