lombok 라이브러리
- vo 만들 때 생성자, getter, setter, toString 등을 이클립스에서 자동생성하면 스크롤이 너무 길어지는데, 라이브러리를 쓰면 @(어노테이션)으로 짧게 표시 가능.
-- 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.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");
}
}
- 세션 종료 = 로그아웃
'JSP & Servlet' 카테고리의 다른 글
회원제 게시판(03), 파일첨부 21. 03. 22. (0) | 2021.03.22 |
---|---|
회원제 게시판(02), JSTL과 EL 21. 03. 19. (0) | 2021.03.19 |
자바빈, 예외처리, 파일 업로드, 회원제 게시판 만들기(01) 21. 03. 18. (0) | 2021.03.18 |
index 페이지에서 로그인, 로그아웃 처리 21. 03. 17. (0) | 2021.03.17 |
01장- JSP 입문, 03장- Servlet의 핵심 사항들, 05장- 내장 객체 조금 21. 03. 15. (0) | 2021.03.15 |