Search
Duplicate
moon
sun

회원가입

회원가입

클라이언트
1.
회원 가입 정보 입력
a.
form 요청
i.
method=”post”
ii.
입력 정보
1.
아이디
2.
비밀번호
3.
비밀번호 확인
4.
이름
5.
이메일
2.
응답 메시지에 따라 화면 이동
서버
1.
회원 가입 정보 전달 받음
2.
User 객체 생성
3.
서비스
4.
DAO
5.
DB
a.
insert
6.
응답
a.
성공 : 201 CREATED
i.
“SUCCESS”
ii.
리다이렉트 : /login
b.
실패
i.
“FAIL”
ii.
리다이렉트 : /signup?error

작업 순서

1.
users 테이블 생성
a.
DDL
2.
DTO
a.
User.java (DTO) 생성
3.
DAO
a.
JDBConnection.java (DB 연결 객체)
b.
UserDAO.java (DAO) 생성
4.
Utils
a.
PasswordUtils.java
5.
Service
6.
JSP
a.
회원 가입 요청 페이지
i.
signup.jsp
b.
회원 가입 처리 페이지
i.
signup_pro.jsp

users 테이블 생성

DDL

DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `no` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '회원번호', `username` VARCHAR(100) NOT NULL COMMENT '아이디', `password` VARCHAR(100) NULL COMMENT '비밀번호', `name` VARCHAR(20) NOT NULL COMMENT '이름', `email` VARCHAR(100) NULL COMMENT '이메일', `enabled` BOOLEAN NULL COMMENT '휴면여부', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일자', `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '수정일자' );
SQL
복사
AUTO_INCREMENT : 기본키(PRIMARY KEY)에 적용할 수 있고, 값을 지정하지 않고 데이터를 추가하면 일식 자동으로 증가한다
PRIMARY KEY : 기본키로 지정. 값이 고유해야하고, NULL 일 수 없다.
BOOLEAN : TINYINT(1) 로 지정된다. true 이면 1, false 이면 0
DEFAULT CURRENT_TIMESTAMP : 기본값을 현재 날짜 시간 값으로 지정

DTO

User.java (DTO) 생성

package shop.DTO; import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Users { private int no; private String username; private String password; private String name; private String email; private Boolean enabled = true; private Date createdAt; private Date updatedAt; }
Java
복사
@Data : getter, setter, 기본 생성자, toString 자동 생성 @NoArgsConstructor : 기본 생성자 @AllArgsConstructor : 모든 매개변수가 있는 생성자 @Builder : 빌더 패턴
Users user = Users.builder() .username(username) .password(password) .name(name) .email(email) .enabled(true) .build();
SQL
복사

DAO

1.
JDBConnection.java (DB 연결 객체)
2.
UserDAO.java (DAO) 생성

JDBConnection.java (DB 연결 객체)

package shop.DAO; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class JDBConnection { public Connection con; // 연결된 드라이버에 SQL을 요청할 객체를 생성하는 클래스 public Statement stmt; // SQL 실행 요청을 하는 클래스 public PreparedStatement psmt; // Statement 에서 ? 파라미터 확장기능을 추가로 제공하는 클래스 public ResultSet rs; // SQL 실행 결과를 받아오는 클래스 // 기본 생성자 public JDBConnection() { // JDBC 드라이버 로드 // MySQL try { // mysql-connector-j.xxx.jar 드라이버의 클래스를 로드한다. Class.forName("com.mysql.cj.jdbc.Driver"); // DB에 연결 // - 연결에 필요한 정보 : URL, id, pw // URL : jdbc:mysql://도메인:[PORT]/[스키마]?옵션파라미터 // * 내 PC의 IP주소 : localhost : 127.0.0.1 // * 3306 : MySQL 데이터베이스의 기본 포트 // * ~/aloha : 스키마 String url = "jdbc:mysql://127.0.0.1:3306/aloha?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false"; String id = "aloha"; String pw = "123456"; // 자바 프로그램에서 JDBC 드라이버를 연결시켜주는 클래스 // getConnection() 메소드로 DB에 연결 요청하고 생성된 Connection 객체를 반환받는다. con = DriverManager.getConnection(url, id, pw); System.out.println("DB 연결 성공"); } catch (Exception e) { System.err.println("DB 연결 실패"); e.printStackTrace(); } } }
Java
복사

UserDAO.java (DAO) 생성

package shop.DAO; import shop.DTO.Users; public class UserDAO extends JDBConnection { /** * 회원 가입 * @param user * @return */ public int signup(Users user) { int result = 0; String sql = " INSERT INTO users(username, password, name, email, enabled )" + " VALUES ( ?, ?, ?, ?, ? ) "; try { psmt = con.prepareStatement(sql); psmt.setString(1, user.getUsername()); psmt.setString(2, user.getPassword()); psmt.setString(3, user.getName()); psmt.setString(4, user.getEmail()); psmt.setBoolean(5, user.getEnabled()); result = psmt.executeUpdate(); } catch (Exception e) { System.err.println("회원 등록 시, 예외 발생"); e.printStackTrace(); } return result; } }
Java
복사

Utils

📁 Bcrypt 암호화 알고리즘 라이브러리
jdk11, tomcat10~
~jdk11, tomcat10

PasswordUtils.java

package shop.utils; import org.mindrot.jbcrypt.BCrypt; /** * 암호화 유틸 */ public class PasswordUtils { // Bcrypt 암호화 알고리즘으로 암호화 public static String encoded(String password) { // SALT : 암호화 결과를 달라지게 하는 임의의 데이터 return BCrypt.hashpw(password, BCrypt.gensalt()); } // 비밀번호 검증 public static boolean check(String password, String encodedPassword) { return BCrypt.checkpw(password, encodedPassword); } }
Java
복사

Service

package shop.Service; import shop.DTO.Users; public interface UserService { // 회원가입 public int signup(Users user); }
SQL
복사
package shop.Service; import shop.DAO.UserDAO; import shop.DTO.Users; import shop.utils.PasswordUtils; public class UserServiceImpl implements UserService { private UserDAO userDAO = new UserDAO(); @Override public int signup(Users user) { // 비밀번호 암호화 // * 암호화 알고리즘 : SHA-256, Bcrypt ... // 123456 ---> FIJ3124890J12/@3J9 String encodedPassword = PasswordUtils.encoded(user.getPassword()); user.setPassword(encodedPassword); // 회원 정보 등록 요청 int result = userDAO.signup(user); if( result > 0 ) System.out.println("회원 가입 성공!"); else System.out.println("회원 가입 실패!"); // 회원 기본 권한 등록... return result; } }
SQL
복사

JSP

1.
회원 가입 요청 페이지
a.
signup.jsp
2.
회원 가입 처리 페이지
a.
signup_pro.jsp

회원 가입 서블릿

SignupServlet.java

package shop.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import shop.DTO.Users; import shop.service.UserService; import shop.service.UserServiceImpl; import java.io.IOException; @WebServlet("/signup") public class SignupServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserService userService = new UserServiceImpl(); protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // forward 방식으로 회원가입 페이지로 이동(signup.jsp) request.getRequestDispatcher("/signup.jsp").forward(request, response); } protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 회원 객체 매핑 String username = request.getParameter("username"); String password = request.getParameter("password"); String name = request.getParameter("name"); String email = request.getParameter("email"); Users user = Users.builder() .username(username) .password(password) .name(name) .email(email) .enabled(true) .build(); // 회원가입 처리 int result = userService.signup(user); String root = request.getContextPath(); if( result > 0 ) { // 성공 -> 로그인 페이지로 이동 response.sendRedirect(root + "/login.jsp"); } else { // 실패 -> 다시 회원가입 페이지로 이동 response.sendRedirect(root + "/signup.jsp?error=0"); } } }
Java
복사

회원 가입 요청 페이지

signup.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원 가입</title> </head> <body> <h1>회원 가입</h1> <c:if test="${ param.error == 0 }"> <p style="color: red;">회원가입에 실패하였습니다.</p> </c:if> <form action="signup_pro.jsp" method="post"> <p> <label for="username">아이디</label> <input type="text" name="username" id="username" /> </p> <p> <label for="password">비밀번호</label> <input type="password" name="password" id="password" /> </p> <p> <label for="name">이름</label> <input type="text" name="name" id="name" /> </p> <p> <label for="email">이메일</label> <input type="text" name="email" id="email" /> </p> <div> <input type="submit" value="회원가입" /> </div> </form> </body> </html>
HTML
복사

로그인 페이지 (임시)

login.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인</title> </head> <body> <h1>로그인</h1> </body> </html>
HTML
복사

메인 화면

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>메인</title> </head> <body> <h1>메인 화면</h1> <hr> <h5>회원가입</h5> <a href="signup">회원가입</a> </body> </html>
HTML
복사