ํ์๊ฐ์
โข
๊ธฐ๋ฅ ์ค๋ช
โข
์์
์์
โข
์ค์ต ์ฝ๋
โข
ํ
์คํธ
โข
๊ฒฐ๊ณผ ํ๋ฉด
(๊ฒฐ๊ณผ ํ๋ฉด ์ฌ์ง)
๊ธฐ๋ฅ ์ค๋ช
ํ์ ๊ฐ์
๊ธฐ๋ฅ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํด๋น ์ฌ์ดํธ(์๋ฒ)์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์
๋๋ค.
- ์ฌ์ฉ์๋ ํ๋ฉด์์ ์ฌ์ฉ์ ์ ๋ณด(์์ด๋, ๋น๋ฐ๋ฒํธ ๋ฑ)์ ์
๋ ฅํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ๋ณด์ ํจ๊ป ์๋ฒ์ ๊ฐ์
์์ฒญ์ ๋ณด๋
๋๋ค.
- ์๋ฒ์์๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ DB ์ ์ ์ฅ ํ, ์๋ตํฉ๋๋ค.
โข
ํ์ ๊ฐ์
ํ๋ฉด
โข
์ ํจ์ฑ ๊ฒ์ฌ
โข
ํ์ ๊ฐ์
์์ฒญ
โข
ํ์ ๊ฐ์
์ฒ๋ฆฌ
โข
ํ์ ๊ฐ์
์ฒ๋ฆฌ ํ ์๋ต
ํ์ ๊ฐ์ ํ๋ฉด
์ฌ์ฉ์๊ฐ ๊ฐ์
์ ๋ณด๋ฅผ ์
๋ ฅํ๋ ํ๋ฉด์
๋๋ค.
์ ํจ์ฑ ๊ฒ์ฌ
์ฌ์ดํธ์ ์ ์ฑ
์ ๋ฐ๋ผ, ์์ด๋, ๋น๋ฐ๋ฒํธ ๋ฑ ์ ํจํ ๊ฐ๋ง ์
๋ ฅ์ด ๊ฐ๋ฅํ๋๋ก ๊ฒ์ฌํ๋ ๊ณผ์ ์
๋๋ค.
โข
null ์ฒดํฌ
โข
์์ด๋ ์ค๋ณต ๊ฒ์ฌ
โข
๋น๋ฐ๋ฒํธ ์กฐ๊ฑด ๊ฒ์ฌ
โข
์ด๋ฉ์ผ ํ์ ๊ฒ์ฌ
null ์ฒดํฌ
๊ฐ์ ์
๋ ฅํ์ง ์์์, null, โโ(๋น ๋ฌธ์์ด) ๋ฑ์ด ์๋ฒ๋ก ์์ฒญ๋์ง ์๋๋ก ํ์ธํฉ๋๋ค.
function checkNull(value) {
return (value === null || value.trim() === '');
}
JavaScript
๋ณต์ฌ
์์ด๋ ์ค๋ณต ๊ฒ์ฌ
์์ด๋๋ ๊ณ ์ ํ ๊ฐ์
๋๋ค. 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 ์์ฑ ๊ฐ์ผ๋ก ์ธ์ํฉ๋๋ค.
โข
ํ์ ๊ฐ์
์์ฒญ 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) ์ ์ ์ฉํด๋๊ณ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
<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
๋ณต์ฌ
ํ ์คํธ
(์ถ๊ฐ์ค)