Search
Duplicate

νšŒμ› κ°€μž…

νšŒμ› κ°€μž…

νšŒμ› κ°€μž… κΈ°λŠ₯을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

ν™”λ©΄

μž‘μ—… μˆœμ„œ

1.
join.jsp
2.
users.sql
4.
UserDAO.java
5.
UserService.java
6.
UserServiceImpl.java
7.
UserServlet.java
8.
script.js
a.
아이디 쀑볡 체크 비동기 μš”μ²­
b.
μœ νš¨μ„± 검사

μ½”λ“œ

join.jsp

<%@ include file="/layout/jstl.jsp" %> <%@ include file="/layout/common.jsp" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>projectπŸ’» - ALOHA CLASS🌴</title> <jsp:include page="/layout/meta.jsp" /> <jsp:include page="/layout/link.jsp" /> </head> <body> <jsp:include page="/layout/header.jsp" /> <%-- [Contents] ######################################################### --%> <main> <div class="px-4 py-5 mt-5 text-center"> <h1 class="display-5 fw-bold text-body-emphasis">νšŒμ› κ°€μž…</h1> </div> <!-- νšŒμ› κ°€μž… μ˜μ—­ --> <div class="container shop p-1 p-md-2 p-lg-4 mb-5" > <div class="row justify-content-center"> <div class="col-12 col-md-10 col-lg-6"> <form action="${ root }/users/join" name="joinForm" method="post"> <input type="hidden" name="duplicaed" id="duplicaed" value="false" /> <div class="input-group mx-0 mb-3 row"> <label for="username" class="input-group-text col-md-4" id="lb_username">아이디</label> <input type="text" class="form-control col-md-6" name="username" id="username" placeholder="아이디" required> <button type="button" onclick="clickIdCheck()" class="btn btn-success col-md-2">쀑볡확인</button> </div> <div class="input-group mx-0 mb-3 row"> <label for="password" class="input-group-text col-md-4" id="lb_password">λΉ„λ°€λ²ˆν˜Έ</label> <input type="password" class="form-control col-md-8" name="password" id="password" placeholder="λΉ„λ°€λ²ˆν˜Έ" required> </div> <div class="input-group mx-0 mb-3 row"> <label for="password_confirm" class="input-group-text col-md-4" id="lb_password_confirm">λΉ„λ°€λ²ˆν˜Έ 확인</label> <input type="password" class="form-control col-md-8" name="password_confirm" id="password_confirm" placeholder="λΉ„λ°€λ²ˆν˜Έ 확인" required> </div> <div class="input-group mx-0 mb-3 row"> <label for="name" class="input-group-text col-md-4" id="lb_name">이름</label> <input type="text" class="form-control col-md-8" name="name" id="name" placeholder="이름" required> </div> <div class="input-group mx-0 mb-3 row"> <label for="email" class="input-group-text col-md-4" id="lb_email">이메일</label> <input type="text" class="form-control col-md-8" name="email" id="email" placeholder="이메일"> </div> <div class="d-grid gap-2 mt-5 mb-5"> <input type="button" class="btn btn-lg btn-primary" value="κ°€μž…" onclick="checkUser()" /> <a href="javascript: history.back()" class="btn btn-lg btn-secondary">μ·¨μ†Œ</a> </div> </form> </div> </div> </div> </main> <%-- [Contents] ######################################################### --%> <jsp:include page="/layout/footer.jsp" /> <jsp:include page="/layout/script.jsp" /> <script> async function clickIdCheck() { // 아이디 μœ νš¨μ„± 검사 let username = document.getElementById("username").value let usernameCheck = /^[a-zA-Z0-9γ„±-γ…Žγ…-γ…£κ°€-힣]{5,20}$/ let msg = 'μ•„μ΄λ””λŠ” ν•œκΈ€, 영문자, 숫자 5~20 자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”.' if(!usernameCheck.test(username)) { alert(msg) return false } let check = await idCheck() if( check ) { alert('μ€‘λ³΅λœ 아이디 μž…λ‹ˆλ‹€.') } else { alert('μ‚¬μš© κ°€λŠ₯ν•œ 아이디 μž…λ‹ˆλ‹€.') } } </script> </body> </html>
HTML
볡사

users.sql

DROP TABLE IF EXISTS users; CREATE TABLE `aloha`.`users` ( `no` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `id` VARCHAR(64) NOT NULL UNIQUE, `username` VARCHAR(100) NOT NULL UNIQUE, `password` VARCHAR(100) NOT NULL, `name` VARCHAR(100) NOT NULL, `email` VARCHAR(100) NULL, `created_at` TIMESTAMP NOT NULL DEFAULT now(), `updated_at` TIMESTAMP NOT NULL DEFAULT now() ) COMMENT = 'νšŒμ›';
SQL
볡사
package board.DTO; import java.util.Date; import com.alohaclass.jdbc.annotation.Column; import com.alohaclass.jdbc.annotation.Pk; import com.alohaclass.jdbc.annotation.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Table("users") @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Users { @Pk private int no; private String id; private String username; private String password; @Column(exist = false) private String passwordConfirm; private String name; private String email; private Date createdAt; private Date updatedAt; }
Java
볡사

UserDAO.java

package board.DAO; import com.alohaclass.jdbc.dao.BaseDAOImpl; import board.DTO.Users; public class UserDAO extends BaseDAOImpl<Users> { }
Java
볡사

UserService.java

package board.Service; import board.DTO.Users; public interface UserService { // νšŒμ›κ°€μž… public int join(Users user); // 아이디 쀑볡 확인 public boolean idCheck(String username); }
Java
볡사

UserServiceImpl.java

package board.Service; import java.util.HashMap; import java.util.Map; import org.mindrot.jbcrypt.BCrypt; import board.DAO.UserDAO; import board.DTO.Users; public class UserServiceImpl implements UserService { private UserDAO userDAO = new UserDAO(); @Override public int join(Users user) { try { // λΉ„λ°€λ²ˆν˜Έ μ•”ν˜Έν™” String password = user.getPassword(); String encodedPassword = BCrypt.hashpw(password, BCrypt.gensalt()); user.setPassword(encodedPassword); // νšŒμ› 등둝 int result = userDAO.insert(user); return result; // 등둝 성곡 } catch (Exception e) { e.printStackTrace(); } return 0; // 등둝 μ‹€νŒ¨ } @Override public boolean idCheck(String username) { Map<String, Object> map = new HashMap<>(); map.put("username", username); Object user = null; try { user = userDAO.selectBy(map); } catch (Exception e) { e.printStackTrace(); } // 아이디 쀑볡X if( user == null ) { return false; } return true; } }
Java
볡사

UserServlet.java

package board.servlet; import java.io.IOException; import java.util.UUID; import board.DTO.Users; import board.Service.UserService; import board.Service.UserServiceImpl; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/users/*") public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserService userService = new UserServiceImpl(); /** * [GET] */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // url : /users/idCheck String root = request.getContextPath(); String path = request.getPathInfo(); // /idCheck // /idCheck - 아이디 쀑볡 확인 if( path.equals("/idCheck") ) { System.out.println("아이디 쀑볡 확인..."); String username = request.getParameter("username"); boolean check = userService.idCheck(username); response.getWriter().print(check); } // /join - νšŒμ›κ°€μž… ν™”λ©΄ if( path.equals("/join") ) { String url = "/page/join.jsp"; request.getRequestDispatcher(url).forward(request, response); } } /** * [POST] */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String root = request.getContextPath(); // /Board String path = request.getPathInfo(); // /join // /join - νšŒμ›κ°€μž… if( path.equals("/join") ) { System.out.println("νšŒμ›κ°€μž… μš”μ²­ 처리..."); String username = request.getParameter("username"); String password = request.getParameter("password"); String name = request.getParameter("name"); String email = request.getParameter("email"); Users user = Users.builder() .id( UUID.randomUUID().toString() ) .username(username) .password(password) .name(name) .email(email) .build(); int result = userService.join(user); // νšŒμ›κ°€μž… 성곡 if( result > 0 ) { response.sendRedirect(root + "/"); } // νšŒμ›κ°€μž… μ‹€νŒ¨ else { response.sendRedirect(root + "/join.jsp?error=true"); } } } }
Java
볡사

script.js

1.
아이디 쀑볡 체크 비동기 μš”μ²­
2.
μœ νš¨μ„± 검사
β€’
아이디 쀑볡 체크 비동기 μš”μ²­
// 아이디 쀑볡 확인 function idCheck() { let username = document.getElementById('username').value let url = `/Board/users/idCheck` let data = { 'username' : username, } return new Promise((resolve, reject) => { // jQuery 둜 AJAX μš”μ²­ $.ajax({ type : 'GET', // μš”μ²­ λ©”μ†Œλ“œ url : url, // μš”μ²­ URL data : data, // μš”μ²­ 데이터 contentType : 'application/json', // μš”μ²­ 데이터 νƒ€μž… dataType : 'html', // 응닡 데이터 νƒ€μž… // μš”μ²­ 성곡 success : function(response, status) { // response : 응닡 데이터 // status : 응닡 μƒνƒœ if( response == '' ) { alert('응닡 λ©”μ‹œμ§€κ°€ μ—†μŠ΅λ‹ˆλ‹€') } resolve(response == 'true' ? true : false) }, // μ—λŸ¬ error : function(xhr, status) { // xhr : XMLHttpRequest 객체 // status : 응닡 μƒνƒœ alert('μ—λŸ¬ λ°œμƒ') reject('error') } }) }) }
JavaScript
볡사
β€’
μœ νš¨μ„± 검사
/** * νšŒμ› κ°€μž… - μœ νš¨μ„± 검사 */ async function checkUser() { let form = document.joinForm // 아이디 쀑볡 확인 let idDuplicated = await idCheck() if( idDuplicated ) { alert('μ€‘λ³΅λœ 아이디 μž…λ‹ˆλ‹€.') return false } if( validateUser() ) { form.submit() // μœ νš¨μ„± 검사 톡과 return true } } function validateUser() { let form = document.joinForm let username = form.username let password = form.password let password_confirm = form.password_confirm let name = form.name let email = form.email let msg = '' // 아이디 μœ νš¨μ„± 검사 let usernameCheck = /^[a-zA-Z0-9γ„±-γ…Žγ…-γ…£κ°€-힣]{5,20}$/ msg = 'μ•„μ΄λ””λŠ” ν•œκΈ€, 영문자, 숫자 5~20 자둜 μž…λ ₯ν•΄μ£Όμ„Έμš”.' if (!check(usernameCheck, username, msg)) return false // λΉ„λ°€λ²ˆν˜Έ μœ νš¨μ„± 검사 let passwordCheck = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/ msg = 'λΉ„λ°€λ²ˆν˜ΈλŠ” 영문자, 숫자, 특수문자λ₯Ό ν¬ν•¨ν•˜μ—¬ 8자 μ΄μƒμœΌλ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”.' if (!check(passwordCheck, password, msg)) return false // λΉ„λ°€λ²ˆν˜Έ 확인 검사 msg = 'λΉ„λ°€λ²ˆν˜Έμ™€ λΉ„λ°€λ²ˆν˜Έ 확인이 λΆˆμΌμΉ˜ν•©λ‹ˆλ‹€.' if( password.value != password_confirm.value ) { alert(msg) return false } // 이름 μœ νš¨μ„± 검사 let nameCheck = /^[a-zA-Zγ„±-γ…Žγ…-γ…£κ°€-힣]{1,20}$/ msg = '이름은 ν•œκΈ€ λ˜λŠ” 영문 20자 μ΄λ‚΄λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”.' if (!check(nameCheck, name, msg)) return false // 이메일 μœ νš¨μ„± 검사 let emailCheck = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i msg = '이메일 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.' if (!check(emailCheck, email, msg)) return false return true } // μ •κ·œν‘œν˜„μ‹ μœ νš¨μ„± 검사 ν•¨μˆ˜ function check(regExp, element, msg) { if(regExp.test(element.value)) { return true } alert(msg) element.select() element.focus() return false }
JavaScript
볡사