Search

ํšŒ์›๊ฐ€์ž…

ํšŒ์›๊ฐ€์ž…

โ€ข
๊ธฐ๋Šฅ ์„ค๋ช…
โ€ข
์ž‘์—… ์ˆœ์„œ
โ€ข
์‹ค์Šต ์ฝ”๋“œ
โ€ข
ํ…Œ์ŠคํŠธ
โ€ข
๊ฒฐ๊ณผ ํ™”๋ฉด
(๊ฒฐ๊ณผ ํ™”๋ฉด ์‚ฌ์ง„)

๊ธฐ๋Šฅ ์„ค๋ช…

ํšŒ์› ๊ฐ€์ž… ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ํ•ด๋‹น ์‚ฌ์ดํŠธ(์„œ๋ฒ„)์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. - ์‚ฌ์šฉ์ž๋Š” ํ™”๋ฉด์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. - ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ํ•จ๊ป˜ ์„œ๋ฒ„์— ๊ฐ€์ž… ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. - ์„œ๋ฒ„์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ 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
๋ณต์‚ฌ

ํ…Œ์ŠคํŠธ

(์ถ”๊ฐ€์ค‘)

๊ฒฐ๊ณผ ํ™”๋ฉด