회원가입
•
기능 설명
•
작업 순서
•
실습 코드
•
테스트
•
결과 화면
(결과 화면 사진)
기능 설명
회원 가입 기능은 사용자의 정보를 해당 사이트(서버)에 저장하는 기능입니다.
- 사용자는 화면에서 사용자 정보(아이디, 비밀번호 등)을 입력합니다.
- 사용자 정보와 함께 서버에 가입 요청을 보냅니다.
- 서버에서는 사용자의 정보를 DB 에 저장 후, 응답합니다.
•
회원 가입 화면
•
유효성 검사
•
회원 가입 요청
•
회원 가입 처리
•
회원 가입 처리 후 응답
회원 가입 화면
사용자가 가입 정보를 입력하는 화면입니다.
유효성 검사
사이트의 정책에 따라, 아이디, 비밀번호 등 유효한 값만 입력이 가능하도록 검사하는 과정입니다.
•
null 체크
•
아이디 중복 검사
•
비밀번호 조건 검사
•
이메일 형식 검사
null 체크
값을 입력하지 않아서, null, “”(빈 문자열) 등이 서버로 요청되지 않도록 확인합니다.
null, “”(빈 문자열) 등이 서버로 요청되면, NullPointerException 등이 발생할 수 있습니다.function checkNull(value) {
return (value === null || value.trim() === '');
}
JavaScript
복사
null 및 “”(빈 문자열) 체크는 자주 사용되는 조건으로 공통 함수로 정의하여 재사용하는 것이 좋습니다.아이디 중복 검사
아이디는 고유한 값입니다. DB 에서도 기본키(PK), 고유키(UK) 등으로 지정하기 때문에, 이미 있는 아이디가 요청된다면 서버 측에서 에러가 발생할 수 있습니다.
중복된 아이디를 요청하게 되면, 데이터베이스에서 무결성 제약 조건에 위배될 수 있습니다.(아이디 중복 검사 화면)
아이디 중복 검사는 비동기 처리를 통해 구현할 수 있습니다. 아이디 중복 검사에 대하여 동기식 form 요청을 하게 되면 화면 이동을 하면서 입력한 정보가 사라지거나 요청을 여러 화면에 걸쳐서 진행해야합니다.
따라서, 아이디 중복 검사는 화면 이동 없이 비동기 요청을 보내어 중복 여부에 대한 응답 데이터를 받아와 그 여부를 UI 및 검사 여부에 포함시킵니다.
•
아이디 중복 검사 버튼
<button type="button" onclick="clickIdCheck()" class="btn btn-success col-md-2">중복확인</button>
HTML
복사
•
아이디 중복 검사 비동기 처리
// 아이디 중복 확인
function idCheck() {
let username = document.getElementById('username').value
let url = `${root}/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
복사
비밀번호 조건 검사
비밀번호는 사이트의 보안 정책에 따른 패턴에 매핑되는지 확인합니다.
예를 들면, 8 자 이상의 영문자, 숫자, 특수 문자를 모두 포함하는 지를 검사합니다.
이렇게 조건이나 패턴이 복잡한 유효성을 검사하는 경우에는 정규 표현식을 사용하는 것이 좋습니다.정규표현식이란?
: 특정 패턴을 찾거나 매칭하기 위한 문자열의 집합을 정의하는데 사용되는 형식 언어
정규 표현식에 대하여는 아래 페이지에서 조금 더 상세히 다루고 있습니다.•
정규 표현식을 사용하여 비밀번호 유효성 검사
// 비밀번호 유효성 검사
let passwordCheck = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
msg = '비밀번호는 영문자, 숫자, 특수문자를 포함하여 8자 이상으로 입력해주세요.'
if (!check(passwordCheck, password, msg)) return false
JavaScript
복사
이메일 형식 검사
이메일 형식이 올바른지 정규 표현식을 이용하여 검사합니다.
사용자의 가입 정보로 이메일을 많이 사용하는데, 때로는 이메일로 인증 번호 또는 링크를 발송하여 사용자 인증이나 비밀번호 찾기 기능 등과 연동하는 경우가 있습니다.
이 때, 이메일 형식이 올바르지 않다면, 이메일이 발송되지 않을 수 있습니다. 따라서 이메일 형식 패턴이 올바른지 검사하여 입력 받습니다. 이메일 형식은 OOOO@OOOO.com 이와 같은 패턴으로 다소 복잡한 형식을 가지고 있습니다.
이메일 형식은 정규 표현식을 사용하면 쉽게 검사할 수 있습니다.// 이메일 유효성 검사
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
JavaScript
복사
회원 가입 요청
입력한 데이터가 모두 유효한지 검사 후, POST 방식으로 form 요청을 보냅니다.
서버 측에서 입력한 데이터에 대한 이름은 input 태그의 name 속성 값으로 인식합니다.
GET 방식으로 주요 데이터를 요청하게 되면, URL 에 노출이 되므로 보안 상 위험합니다.
name=”파라미터명” 과 request.getParameter(”파라미터명”) 이 일치해야 요청한 값을, 서버 측에서 정확히 전달 받을 수 있습니다.•
회원 가입 요청 form
<form action="join_pro.jsp" name="joinForm" method="post">
<input type="hidden" name="duplicaed" id="duplicaed" value="false" />
<div class="input-group 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 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 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 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 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 d-md-flex justify-content-md-between">
<a href="javascript: history.back()" class="btn btn-lg btn-secondary">취소</a>
<input type="button" class="btn btn-lg btn-primary" value="가입" onclick="checkUser()" />
</div>
</form>
HTML
복사
회원 가입 처리
클라이언트 측에서 요청한 사용자 정보를 전달 받고, 이를 데이터 전송 객체(DTO)에 담아 회원 가입 처리 로직으로 전달합니다.
•
Servlet or JSP
•
DTO
•
Service
•
DAO
Servlet or JSP
회원 가입 화면에서, 요청을 받아 처리할 Servlet 또는 JSP 코드를 작성합니다.
•
join_pro.jsp
<%--
회원 가입 처리
--%>
<%@page import="users.service.UserService"%>
<%@page import="users.service.UserServiceImpl"%>
<%@page import="users.model.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Users user = new Users();
String username = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
user.setUsername(username);
user.setPassword(password);
user.setName(name);
user.setEmail(email);
// 회원 정보 등록 요청
UserService userService = new UserServiceImpl();
int result = userService.join(user);
String root = request.getContextPath();
if( result > 0 ) {
// 로그인 화면으로 이동
response.sendRedirect(root + "/users/login.jsp");
} else {
// 회원가입 페이지로 이동
response.sendRedirect(root + "/users/join.jsp?error");
}
%>
HTML
복사
DTO
계층 간에, 여러 데이터 담아 주고 받을 객체를 정의합니다.
•
Users
package users.model;
import java.util.Date;
import lombok.Data;
@Data
public class Users {
private String id;
private String username;
private String password;
private String name;
private String email;
private Date regDate;
private Date updDate;
}
HTML
복사
Service
처리 로직(비즈니스 로직)을 작성합니다.
- 인터페이스와 구현 클래스로 정의합니다.
•
UserService
•
UserServiceImpl
•
UserService
package users.service;
import users.model.Users;
public interface UserService {
// 회원가입
public int join(Users user);
// 아이디 중복 확인
public boolean idCheck(String username);
}
Java
복사
•
UserServiceImpl
package users.service;
import users.data.UserDAO;
import users.model.Users;
public class UserServiceImpl implements UserService {
private UserDAO userDAO = new UserDAO();
/**
* 회원가입
*/
@Override
public int join(Users user) {
int result = userDAO.join(user);
if( result > 0 ) {
System.out.println("회원 가입 처리 성공!");
} else {
System.out.println("회원 가입 실패!");
}
// 기본 회원 권한을 추가...
return result;
}
/**
* 아이디 중복 확인
*/
@Override
public boolean idCheck(String username) {
boolean result = userDAO.idCheck(username);
return result;
}
}
Java
복사
DAO
데이터 베이스에 접근하는 객체로, 사용하는 DBMS 에서 제공하는 JDBC 드라이버를 사용합니다.
•
UserDAO
package users.data;
import java.sql.SQLException;
import java.util.UUID;
import common.jdbc.JDBConnection;
import users.model.PersistentLogins;
import users.model.Users;
public class UserDAO extends JDBConnection {
/**
* 회원 가입
* @param user 등록할 회원 정보
* @return 등록된 데이터 개수
*/
public int join(Users user) {
int result = 0;
String sql = "INSERT INTO users (id, username, password, name, email, reg_date, upd_date) " +
"VALUES (RAWTOHEX(SYS_GUID()), ?, ?, ?, ?, sysdate, sysdate)";
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());
result = psmt.executeUpdate();
} catch (SQLException e) {
System.err.println("회원 가입 중 오류 발생");
e.printStackTrace();
}
return result;
}
/**
* 아이디 중복 확인
* @param username
* @return
*/
public boolean idCheck(String username) {
// SQL 작성
String sql = " SELECT * "
+ " FROM users "
+ " WHERE username = ? ";
try {
psmt = con.prepareStatement(sql);
psmt.setString( 1, username );
rs = psmt.executeQuery();
if( rs.next() ) {
return true; // 아이디 중복됨
}
return false;
} catch(SQLException e) {
System.err.println("아이디 중복 확인 시, 예외 발생");
e.printStackTrace();
}
return false;
}
}
Java
복사
회원 가입 처리 후 응답
회원 가입 완료 여부에 따라서, 페이지 응답을 진행합니다.
•
회원 가입 성공
•
회원 가입 실패
회원 가입 성공
회원 가입 성공 시, 페이지를 이동시킵니다.
회원 가입 성공 후, 이동할 페이지의 케이스는 다음과 같습니다.
가입 완료 화면
로그인 화면
메인 화면
가입 완료 화면
로그인 화면
메인 화면
가입 완료 화면과거의 UI/UX 에서는 회원 가입 후 다시 한 번 회원 가입 정보 및 처리 여부에 대해서 출력하는 화면으로 이동하곤 했습니다. 그러나, 가입 완료 화면으로 이동하더라도 대다수의 사용자들은 바로 로그인을 시도하려고 할 것입니다.
따라서, 가입 정보 및 완료 여부에 대하여 반드시 다시 리포트할 필요가 없다면, 로그인 화면 또는 메인 화면으로 이동하는 것이 더 나은 사용자 경험을 제공할 것입니다.
로그인 화면회원 가입 후, 대부분의 사용자들은 바로 로그인을 시도할 것입니다. 따라서 회원 가입이 완료되었다면 로그인 페이지로 이동시켜, 사용자가 로그인을 할 수 있도록 유도합니다.
메인 화면사용자는 로그인을 하기 위해서 회원 가입을 진행하였을 것입니다. 따라서, 사용자에게 회원 가입 시 입력한 아이디 및 비밀번호를 또 입력하게 하는 것은 다소 번거로운 일이 될 수 있습니다. 이미 회원 가입 시 아이디 및 비밀번호를 입력하였기 때문에 서버 측에서 로그인 인증 처리 후 메인 화면에 로그인 된 상태로 응답해주는 것도 좋은 방법입니다,
회원 가입 처리
성공
바로 로그인
메인 화면
성공
바로 로그인
메인 화면
바로 로그인 기능의 경우, 로그인 기능을 구현 후 적용해야합니다.회원 가입 실패
회원 가입 실패 시, 회원 가입 정보를 다시 입력하도록 필요한 메시지와 함께 회원 가입 페이지로 다시 이동합니다.
회원 가입 처리
실패
회원 가입 화면
실패
회원 가입 화면작업 순서
1.
회원 정보 ERD 작성
2.
users - 회원 테이블 생성
3.
common.jsp - 공통 적용 페이지 작성
4.
join.jsp (회원가입 화면) 페이지 작성
5.
유효성 검사 코드 작성
6.
JDBConnection.java - JDBC 드라이버 연동
7.
UserDAO.java - 데이터 접근 객체 작성
8.
UserService.java - 서비스 인터페이스 작성
9.
UserServiceImpl.java - 서비스 구현 클래스 작성
10.
join_pro.jsp (회원 가입 처리) 페이지 작성
실습 코드
회원 정보 ERD 작성
users - 회원 테이블 생성
CREATE TABLE users (
id VARCHAR2(255) NOT NULL PRIMARY KEY,
username VARCHAR2(100) NULL,
password VARCHAR2(100) NULL,
name VARCHAR2(50) NULL,
email VARCHAR2(200) NULL,
reg_date DATE DEFAULT sysdate NULL,
upd_date DATE DEFAULT sysdate NULL
);
SQL
복사
common.jsp - 공통 적용 페이지 작성
•
common.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"%>
<%
String root = request.getContextPath();
%>
<c:set var="root" value="<%= root %>" />
Java
복사
<%= request.getContextPath() %>
Java
복사
위 코드와 같이, 반복적으로 사용되는 코드를 공통 모듈 (common.jsp) 에 적용해두고 사용하겠습니다.
이렇게 ContextPath 를 미리 root 라는 변수명으로 저장해두면, link 태그 또는 script 태그에서 해당 파일의 경로를 지정할 때 아래와 같이 단순하게 지정할 수 있습니다.<jsp:include page="${ root }/layout/import/link.jsp" />
Java
복사
join.jsp (회원가입 화면) 페이지 작성
회원 가입 화면
•
join.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">
<!-- 공통 적용 -->
<jsp:include page="/layout/main/import/common.jsp" />
<jsp:include page="/layout/main/import/meta.jsp" />
<jsp:include page="/layout/main/import/link.jsp" />
</head>
<body>
<jsp:include page="/layout/main/UI/header.jsp" />
<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-5 mb-5" >
<form action="join_pro.jsp" name="joinForm" method="post">
<input type="hidden" name="duplicaed" id="duplicaed" value="false" />
<div class="input-group 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 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 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 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 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 d-md-flex justify-content-md-between">
<a href="javascript: history.back()" class="btn btn-lg btn-secondary">취소</a>
<input type="button" class="btn btn-lg btn-primary" value="가입" onclick="checkUser()" />
</div>
</form>
</div>
<jsp:include page="/layout/main/UI/footer.jsp" />
<!-- script -->
<jsp:include page="/layout/main/import/script.jsp" />
<script>
async function clickIdCheck() {
let check = await idCheck()
if( check ) {
alert('중복된 아이디 입니다.')
} else {
alert('사용 가능한 아이디 입니다.')
}
}
</script>
</body>
</html>
HTML
복사
유효성 검사 코드 작성
+아이디 중복 검사•
script.js
/**
* javascript - script.js
*/
/**
* 회원 가입 - 유효성 검사
*/
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
}
// 아이디 중복 확인
function idCheck() {
let username = document.getElementById('username').value
let url = `${root}/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
복사
JDBConnection.java - JDBC 드라이버 연동
•
JDBConnection.java
package common.jdbc;
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 드라이버 로드
// Oracle
try {
// ojdbc8.jar 드라이버의 클래스를 로드한다.
Class.forName("oracle.jdbc.OracleDriver");
// DB에 연결
// jdbc:oracle:thin - JDBC 드라이버 타입 (thin 타입)
// localhost - 호스트 주소 (IP 주소), localhost 또는 127.0.0.1 은 현재 PC의 IP 를 가리킨다.
// :1521 - 포트번호 (1521은 오라클 DB서버의 기본 포트 번호이다.)
// :xe 또는 :orcl - SID (서비스 ID)
//String url ="jdbc:oracle:thin:@localhost:1521:xe"; // 11g
// String url ="jdbc:oracle:thin:@localhost:1521:orcl"; // 12c이상
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
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 - 데이터 접근 객체 작성
•
UserDAO.java
package users.data;
import java.sql.SQLException;
import java.util.UUID;
import common.jdbc.JDBConnection;
import users.model.PersistentLogins;
import users.model.Users;
public class UserDAO extends JDBConnection {
/**
* 회원 가입
* @param user 등록할 회원 정보
* @return 등록된 데이터 개수
*/
public int join(Users user) {
int result = 0;
String sql = "INSERT INTO users (id, username, password, name, email, reg_date, upd_date) " +
"VALUES (RAWTOHEX(SYS_GUID()), ?, ?, ?, ?, sysdate, sysdate)";
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());
result = psmt.executeUpdate();
} catch (SQLException e) {
System.err.println("회원 가입 중 오류 발생");
e.printStackTrace();
}
return result;
}
}
Java
복사
UserService.java - 서비스 인터페이스 작성
•
UserService.java
package users.service;
import users.model.Users;
public interface UserService {
// 회원가입
public int join(Users user);
}
Java
복사
UserServiceImpl.java - 서비스 구현 클래스 작성
•
UserServiceImpl.java
package users.service;
import users.data.UserDAO;
import users.model.PersistentLogins;
import users.model.Users;
public class UserServiceImpl implements UserService {
private UserDAO userDAO = new UserDAO();
@Override
public int join(Users user) {
int result = userDAO.join(user);
if( result > 0 ) {
System.out.println("회원 가입 처리 성공!");
} else {
System.out.println("회원 가입 실패!");
}
return result;
}
}
Java
복사
join_pro.jsp (회원 가입 처리) 페이지 작성
•
join_pro.jsp
<%--
회원 가입 처리
--%>
<%@page import="users.service.UserService"%>
<%@page import="users.service.UserServiceImpl"%>
<%@page import="users.model.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Users user = new Users();
String username = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
user.setUsername(username);
user.setPassword(password);
user.setName(name);
user.setEmail(email);
// 회원 정보 등록 요청
UserService userService = new UserServiceImpl();
int result = userService.join(user);
String root = request.getContextPath();
if( result > 0 ) {
// 로그인 화면으로 이동
response.sendRedirect(root + "/users/login.jsp");
} else {
// 회원가입 페이지로 이동
response.sendRedirect(root + "/users/join.jsp?error");
}
%>
Java
복사
테스트
(추가중)

















