2023. 3. 27. 17:28ใSpring
ID check ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ค๋ณต์ฌ๋ถ๋ฅผ ์ฒดํฌ
์ค๋ณต ์ฒดํฌ ์ฟผ๋ฆฌ ์์ฑ
<!-- ์์ด๋ ์ค๋ณต ์ฒดํฌ -->
<select id="isDuplicateMemId" resultType="int">
SELECT COUNT(MEM_ID)
FROM SHOP_MEMBER
WHERE MEM_ID = #{memId}
</select>
MemberService ๋ฉ์๋ ์์ฑ
์๋ฃํ boolean์ผ๋ก ์ค. ์ฐธ ๊ฑฐ์ง์ ์๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ int์.
๋ฐ์ดํฐ ๋ค๊ณ ์ฌ ๋๋ int๋ก ๋ค๊ณ ์ด.
//์์ด๋ ์ค๋ณต ์ฒดํฌ
boolean isDuplicateMemId(String memId);
MemberServiceImpl ๋ฉ์๋ ๊ตฌํ
//์์ด๋ ์ค๋ณต ์ฒดํฌ
@Override
public boolean isDuplicateMemId(String memId) {
//๋ฐ์ดํฐ int๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ int๋ก ๋ฐ์์ค
int result = sqlsession.selectOne("memberMapper.isDuplicateMemId", memId);
//์ค๋ณต์ด๋ฉด true, ์๋๋ฉด false
return result != 0 ? true : false;
}
header.html์ ID check ๋ฒํผ์ ํด๋ฆญ ์ js๋ก ์ด๋
<div class="col-3 d-grid">
<label for="check_id" class="form-label"> </label>
<input type="button" class="btn btn-secondary" value="ID check" id="check_id" onclick="isDuplicateMemId();">
</div>
์ค๋ณต ์ฒดํฌ ํ๋ ค๋ฉด memId๊ฐ ํ์ํจ.
js์์ id ์ ๋ ฅํ๋ ํ๊ทธ ์์ฒด๋ฅผ ๊ฐ์ง๊ณ ์ด. ๊ทธ ํ๊ทธ์ value๊ฐ ๊ฐ์ ธ์ค๋ ๋ฐฉ์ ์ฌ์ฉ.
ํ๋ฉด์ด ๋ฐ๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ajax ์ฌ์ฉ.
์ค๋ณต ์ฒดํฌ ํจ์์์ memId๊ฐ ๋น ๊ฐ์ด๋ฉด ID ์ ๋ ฅํ๋ผ๋ alert์ฐฝ๋ ์ถ๊ฐ๋ก ๋์์ค.
//id check ๋ฒํผ ํด๋ฆญ ์ ์ค๋ณต ์ฒดํฌ
function isDuplicateMemId(){
//ํ์ id๋ฅผ ์
๋ ฅํ๋ ํ๊ทธ joinModal ํ๊ทธ์ ์์ memId
const memIdTag = document.querySelector('#joinModal #memId');
//์
๋ ฅํ ํ์ id
const memId = memIdTag.value;
if(memId == ''){
alert('ID๋ฅผ ์
๋ ฅํ์ญ์์ค')
}
//ajax start
$.ajax({
url: '/member/isDuplicateMemId', //์์ฒญ๊ฒฝ๋ก
type: 'post',
async : false, //๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ, ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก true
data: {'memId' : memId}, //ํ์ํ ๋ฐ์ดํฐ
//success๋ ํจ์๋ฅผ ์ ์ํ ๊ฒ.
success: function(result) {
}
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
MemberController์์ ์๋ฃํ boolean์ผ๋ก ๋ฐ์์ ๋ฉ์๋ ์คํ ํ ๋ฆฌํด.
//์์ด๋ ์ค๋ณต ์ฒดํฌ
@ResponseBody
@PostMapping("/isDuplicateMemId")
public boolean isDuplicateMemId(String memId) {
return memberService.isDuplicateMemId(memId);
}
js๋ก ๋์์์ return๋ result๊ฐ ์ฌ์ฉํ์ฌ ์ค๋ณต ์ฒดํฌ
result๊ฐ true๋ฉด ์์ด๋ ์ค๋ณต์.
ID ์ค๋ณต : ์ค๋ณต๋ ID๋ผ๋ alert์ฐฝ ๋์ฐ๊ธฐ
ID ์ค๋ณต ์๋ : ์ฌ์ฉ ๊ฐ๋ฅํ ID alert ๋์ฐ๊ธฐ
//id check ๋ฒํผ ํด๋ฆญ ์ ์ค๋ณต ์ฒดํฌ
function isDuplicateMemId(){
//ํ์ id๋ฅผ ์
๋ ฅํ๋ ํ๊ทธ joinModal ํ๊ทธ์ ์์ memId
const memIdTag = document.querySelector('#joinModal #memId');
const memId = memIdTag.value;
if(memId == ''){
alert('ID๋ฅผ ์
๋ ฅํ์ญ์์ค')
}
//ajax start
$.ajax({
url: '/member/isDuplicateMemId', //์์ฒญ๊ฒฝ๋ก
type: 'post',
async : false, //๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ, ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก true
data: {'memId' : memId}, //ํ์ํ ๋ฐ์ดํฐ
//success๋ ํจ์๋ฅผ ์ ์ํ ๊ฒ.
success: function(result) {
//result == true : ์์ด๋ ์ค๋ณต
if(result) {
alert('์ค๋ณต๋ ID์
๋๋ค.');
}
else{
alert('์ฌ์ฉ ๊ฐ๋ฅํ ID์
๋๋ค.');
}
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
์ค์ง์ ์ธ ํ์ ๊ฐ์ ๊ธฐ๋ฅ.
joinmodal์ ์ ๋ ฅํ ํ์ ๊ฐ์ ๋ฐ์ดํฐ๋ค์ form๋ก ๊ฐ์ธ์ MemberController ๋ณด๋ด๊ธฐ
๋ณด๋ธ ๋ฐ์ดํฐ ์ปค๋งจ๋ ๊ฐ์ฒด๋ก ๋ฐ์, ๊ทธ๋ฌ๋ ์ฐ๋ฝ์ฒ ์ ๋ณด ๋ชป ๋ฐ์์ด.
์ฐ๋ฝ์ฒ ์ ๋ณด ์ ๋ ฅ ํ๊ทธ๋ค name์ memTells๋ก ์ง์ ํด๋์ ์ํ์ด๊ธฐ ๋๋ฌธ์
MemberVO์ String ๋ฐฐ์ด๋ก memTells ๋ณ์ ์ถ๊ฐ
//ํ์ ๊ฐ์
@PostMapping("/join")
public String join(MemberVO memberVO) { //์ฐ๋ฝ์ฒ ์ ๋ณด๋ ๋ชป ๊ฐ์ ธ์ด,
//memverVO๋ memTell๋ง ์๊ณ memTells๋ ์์ > VO์ memTells ๋ฐฐ์ด๋ก ๋ณ์ ์์ฑ
return "redirect:/"; //์ธ๋ฑ์ค ์ปจํธ๋กค๋ฌ๋ก ์ด๋ > ์ํ๋ชฉ๋กํ๋ฉด์ผ๋ก ๊ฐ
}
ํ์ ๊ฐ์ ์ฟผ๋ฆฌ ์์ฑ
<!-- ํ์ ๊ฐ์
-->
<insert id="join">
INSERT INTO SHOP_MEMBER (
MEM_ID
, MEM_PW
, MEM NAME
, GENDER
, MEM_TELL
, MEM_ADDR
, ADDR_DETAIL
) VALUES (
#{memId}
, #{memPw}
, #{memName}
, #{gender}
, #{memTell}
, #{memAddr}
, #{addrDetail}
)
</insert>
MemberService ๋ฉ์๋ ์์ฑ
//ํ์ ๋ฑ๋ก
void join(MemberVO memberVO);
MemberService Impl ๋ฉ์๋ ๊ตฌํ
//ํ์ ๊ฐ์
@Override
public void join(MemberVO memberVO) {
sqlsession.insert("memberMapper.join", memberVO);
}
MemberController์์ ๋ฉ์๋ ์คํ
//ํ์ ๊ฐ์
@PostMapping("/join")
public String join(MemberVO memberVO) { //์ปค๋งจ๋ ๊ฐ์ฒด๊ฐ ์ฐ๋ฝ์ฒ ์ ๋ณด๋ ๋ชป ๊ฐ์ ธ์ค๋ ์ํ
memberService.join(memberVO);
return "redirect:/"; //์ธ๋ฑ์ค ์ปจํธ๋กค๋ฌ๋ก ์ด๋ > ์ํ๋ชฉ๋กํ๋ฉด์ผ๋ก ๊ฐ
}
**memTell ๋ฐ์ดํฐ
ํ์ฌ ์ํ ์ฟผ๋ฆฌ ์์ฑํ ๊ฒ์ ๋ณด๋ฉด ์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ memTell๋ก ๋น๊ฐ ์ฑ์ฐ๋๋ฐ memTell ๊ฐ ๋ชป ๊ฐ์ ธ์ด.
์ฟผ๋ฆฌ๋ฌธ ๋น๊ฐ์ getter ํธ์ถํด์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ memTell์ null์ (memTells์ ์ฐ๋ฝ์ฒ ์ ๋ณด๊ฐ ์์)
๊ทธ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์์ ํ์ฌ ์ค์ ์ฐ๋ฝ์ฒ ์ ๋ณด๊ฐ ์๋ memTells๋ก ๋ฐ์ผ๋ฉด ๊ฐ๋ฅ?
โโ getter๋ ๋ฐฐ์ด ๋ฐ์ดํฐ ์ ๋๋ก ๋ชป ๋ฐ์์ด.
for๋ฌธ๊ณผ REPLACE ์ฌ์ฉ > ์ฟผ๋ฆฌ ์์
REPLACE : ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์์์ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์ ๊ธ์๋ฅผ ์ธ๋ฒ์งธ ๋งค๊ฐ๋ณ์ ๊ธ์๋ก ๋์ฒด
<!-- ํ์ ๊ฐ์
-->
<insert id="join">
INSERT INTO SHOP_MEMBER (
MEM_ID
, MEM_PW
, MEM_NAME
, GENDER
, MEM_TELL
, MEM_ADDR
, ADDR_DETAIL
) VALUES (
#{memId}
, #{memPw} <!-- open : ๋ฐ๋ณต ์คํ ์ ์ฒ์์ ์ต์ด ํ๋ฒ -->
, #{memName} <!-- separator : ๋ฐ๋ณต๋ฌธ 1๋ฒ ๋๋ ๋ค๋ง๋ค (๋ง์ง๋ง์ ์๋x) -->
, #{gender} <!--mybatis์ if๋ฌธ์ด๋ for๋ฌธ์ getter๋ก ์ธ์ --> <!-- close : ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ ์ ๋ง์ง๋ง์ ์ต์ด์ ํ๋ฒ-->
, REPLACE(
<foreach collection="memTells" item="tell" open="'" separator="-" close="'">
${tell} <!-- $๋ก ๋ถ์ด๊ณ ๋ฐ์ดํฐ ๋ฐ์ผ๋ฉด '' ์ ๋ถ์ด์ ๋์ด --> <!-- for๋ฌธ ๋๋ฉด ' 010 - 1111 - 2222 ' -->
</foreach>, ' ', '') <!-- REPLACE๋ก ๊ณต๋ฐฑ์ ๋น๋ฌธ์๋ก ๋์ฒด -->
, #{memAddr}
, #{addrDetail}
)
</insert>
์ถ๊ฐ ๊ธฐ๋ฅ.
ID check ์ ํ๋ฉด join ๋ชป ํ๊ฒ ์ค์ ํด์ผ ํจ. (์ค๋ณต ์ฒดํฌ ์ ํ๊ณ join ๋๋ ์ ๋ id๊ฐ ์ค๋ณต๋๋ฉด ์ฟผ๋ฆฌ ์ค๋ฅ๋จ)
์ฒ์ ์กฐ์ธ์ฐฝ ๋จ๋ฉด ์กฐ์ธ ๋ฒํผ ๋ง์.
<div class="col-12 d-grid"> <!-- ID Checkํด์ผ ๊ฐ์
ํ ์ ์๊ฒ ์ฒ์์ ๋ฒํผ ๋ง์ -->
<button type="submit" class="btn btn-primary" disabled>JOIN</button
</div>
js์์ ์ค๋ณต ์ฒดํฌ ํ ๋ memId๊ฐ ๊ณต๋ฐฑ์ด๋ฉด ID ์ ๋ ฅ alert ๋จ๊ฒ ์ค์
ID Check ๋ฒํผ์ ๋๋ฌ์ ์ค๋ณต์ด ์๋๋ฉด join ๋ฒํผ ํ์ฑํ ์ํค๊ธฐ.
//id check ๋ฒํผ ํด๋ฆญ ์ ์ค๋ณต ์ฒดํฌ
function isDuplicateMemId(){
//ํ์ id๋ฅผ ์
๋ ฅํ๋ ํ๊ทธ joinModal ํ๊ทธ์ ์์ memId
const memIdTag = document.querySelector('#joinModal #memId');
const memId = memIdTag.value;
if(memId == ''){
alert('ID๋ฅผ ์
๋ ฅํ์ญ์์ค')
}
//ajax start
$.ajax({
url: '/member/isDuplicateMemId', //์์ฒญ๊ฒฝ๋ก
type: 'post',
async : false, //๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ, ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก true
data: {'memId' : memId}, //ํ์ํ ๋ฐ์ดํฐ
//success๋ ํจ์๋ฅผ ์ ์ํ ๊ฒ.
success: function(result) {
//result == true : ์์ด๋ ์ค๋ณต
if(result) {
alert('์ค๋ณต๋ ID์
๋๋ค.');
}
else{
alert('์ฌ์ฉ ๊ฐ๋ฅํ ID์
๋๋ค.');
//join ๋ฒํผ disabled ์์ฑ ์ ๊ฑฐ(๋ณ๊ฒฝ)
document.querySelector('#joinModal button[type="submit"]').disabled = false;
}
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
๋ฌธ์ ์ .
ID Check ํ ๋ค์ ID ๊ฐ์ ๋ฐ๊พธ๋ฉด ์ค๋ณต๋ ID๋ผ๋ join๋ฒํผ์ด ํ์ฑํ ๋จ
์ด๋ฐ ์ค๋ฅ๋ฅผ ๋ง๊ธฐ ์ํด ID ์ ๋ ฅ input ํ๊ทธ์ ํค๋ณด๋ ์ฌ์ฉ์ ํ์ ๋ ๋ค์ join๋ฒํผ ๋นํ์ฑํ ๊ธฐ๋ฅ ์ค์ .
onkeyup ์์ฑ(ํค๋ณด๋ ์ฌ์ฉ) ์ฌ์ฉ.
<div class="col-9">
<label for="memId" class="form-label">ID</label> <!-- ํค๋ณด๋๋ก ์
๋ ฅ ํ์ ๋ -->
<input type="text" class="form-control" id="memId" name="memId" onkeyup="setDisabled();">
</div>
js์์ ํจ์ ์์ฑ
//ํ์๊ฐ์
๋ฒํผ ๋นํ์ฑํ
function setDisabled(){
document.querySelector('#joinModal button[type="submit"]').disabled = true;
}
โ โ validation ์ฒ๋ฆฌ(๋ฐ์ดํฐ ์ ํจ์ฑ)
ํ์ฌ ์ํ
ํ์๊ฐ์ ํ ๋ ๋ฒํผ ๋๋ฅด๋ฉด form ํ๊ทธ ํ๊ณ ํ์๊ฐ์ ํ๋ฌ ๊ฐ.
์์ ํ์
> ํ์๊ฐ์ ์ ๋ฒํผ์ submit์ด ์๋๋ผ button์ผ๋ก ๋ฐ๊พธ๊ณ ๋ฒํผ ๋๋ฅด๋ฉด join ํจ์ ์คํ ๋๊ฒ ์ค์ .
์ด์ ์ ์์ฑํ ํ์ฑํ ๋นํ์ฑํ ์์ ํจ์ ์์ (์ด์ ์ submit์ผ๋ก ์ ํํ๊ธฐ ๋๋ฌธ์)
join ๋ฒํผ์ id ๋ถ์ฌํ์ฌ ํ๊ทธ ์ ํํ ๋ id๋ก ์ ํํ๊ฒ ์์
<div class="col-12 d-grid"> <!-- ID Checkํด์ผ ๊ฐ์
ํ ์ ์๊ฒ disabled ์์ฑ -->
<button id="joinBtn" type="button" class="btn btn-primary" disabled onclick="join();">JOIN</button>
</div>
js ์์
//ํ์๊ฐ์
๋ฒํผ ๋นํ์ฑํ
function setDisabled(){
document.querySelector('#joinBtn').disabled = true;
}
์ค๋ณต ์ฒดํฌ ํจ์ ์์ ํ์ฑํ ์ฝ๋๋ ์์
//id check ๋ฒํผ ํด๋ฆญ ์ ์ค๋ณต ์ฒดํฌ
function isDuplicateMemId(){
//ํ์ id๋ฅผ ์
๋ ฅํ๋ ํ๊ทธ joinModal ํ๊ทธ์ ์์ memId
const memIdTag = document.querySelector('#joinModal #memId');
const memId = memIdTag.value;
if(memId == ''){
alert('ID๋ฅผ ์
๋ ฅํ์ญ์์ค')
}
//ajax start
$.ajax({
url: '/member/isDuplicateMemId', //์์ฒญ๊ฒฝ๋ก
type: 'post',
async : false, //๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํ, ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ผ๋ก true
data: {'memId' : memId}, //ํ์ํ ๋ฐ์ดํฐ
//success๋ ํจ์๋ฅผ ์ ์ํ ๊ฒ.
success: function(result) {
//result == true : ์์ด๋ ์ค๋ณต
if(result) {
alert('์ค๋ณต๋ ID์
๋๋ค.');
}
else{
alert('์ฌ์ฉ ๊ฐ๋ฅํ ID์
๋๋ค.');
//join ๋ฒํผ disabled ์์ฑ ์ ๊ฑฐ(๋ณ๊ฒฝ)
document.querySelector('#joinBtn').disabled = false;
}
},
error: function() {
alert('์คํจ');
}
});
//ajax end
}
js์ join ํจ์ ์์ฑ
์ ํจ์ฑ ๊ฒ์ฌ ํ๋ ๊ธฐ๋ฅ ๋ฐ๋ก ๋นผ์ joinValidate ํจ์ ์์ฑ.
//ํ์ ๊ฐ์
์งํ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ
function joinValidate(){
//validation ์ฒ๋ฆฌ
const memId = document.querySelector('#joinModal #memId').value;
if(memId == ''){
alert('ID๋ ํ์ ์
๋ ฅ์
๋๋ค.');
return false;
}
else if(memId.length < 4){
alert('ID๋ 4๊ธ์ ์ด์์ด์ด์ผ ํฉ๋๋ค.');
return false;
}
return true; //๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋๋ฉด true
}
join ํจ์ ์คํ๋ ๋ joinValidate ํจ์ ์ฌ์ฉ ํ ํ์๊ฐ์ ์งํ
//ํ์๊ฐ์
ํจ์
function join(){
//์ ํจ์ฑ ๊ฒ์ฌ ์งํ
const isValid = joinValidate(); //๋ฐ์ดํฐ ๊ฒ์ฌ ์ ๋๋ฉด true / ์ ํจํ์ง ์์ผ๋ฉด false
//์ ํจํ์ง ์์ผ๋ฉด if๋ฌธ ์กฐ๊ฑด์ด true๊ฐ ๋๊ธฐ ๋๋ฌธ์ return์ผ๋ก ํจ์ ์ข
๋ฃ.
if(!isValid){
return ;
}
//ํ์๊ฐ์
์งํ
document.querySelector('#joinForm').submit();
}
id๊ฐ 4๊ธ์ ์ดํ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ค๋ฅ? ๊ธ์ ๋์์ฃผ๊ธฐ.
์ ํจ์ฑ ๊ฒ์ฌ ์ ์๋ ์๊ฒ ๋์ค๋ ๊ธ์๋ค์ css ์์ฑ ์ค.
> ์ ํจ์ฑ ๊ฒ์ฌ ํ๋ ๋ชจ๋ ํ์ด์ง์์ ๊ฐ์ด ์ ์ฉ๋ ์ ์๋๋ก common.css์ ์์ฑ
.my-invalid{
margin-top: 0px;
font-size: 0.8rem;
color: red;
}
์ ํจ์ฑ ๊ฒ์ฌ ์ alert ์ฐฝ์ผ๋ก ์ค๋ฅ ๋์ฐ๋ ๊ฒ์ด ์๋๋ผ ์ ๋ ฅ ํ๊ทธ ์๋ ๋จ๊ฒ js ์์
์ค๋ฅ๋ฉ์์ง๋ฅผ ๊ฐ์ง๋ ๋ณ์ str ์์ฑํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ์ฅ ์ํจ๋ค.
ํจ์์ ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ณ์ result ์์ฑํ์ฌ ๊ธฐ๋ณธ๊ฐ true๋ก ์ค
๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋๋ฉด true์
์ ํจ์ฑ ๊ฒ์ฌ ์คํจ ์ false
์คํจ์ ์ค๋ฅ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํด์ค๋ค.
joinForm div๋ฅผ divs๋ก ๋ฐ์์ div์ค ์ฒซ๋ฒ์งธ div ๋(์์ด๋ ์ค๋ณต ๊ฒ์ฌ ๋ฒํผ ๋ค)์ ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๋ ฅ๋๊ฒ html insert
//ํ์ ๊ฐ์
์งํ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ
function joinValidate(){
//ํจ์์ ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ณ์
let result = true;
//์ค๋ฅ ๋ฉ์ธ์ง
let str = '';
//ํ์๊ฐ์
form ํ๊ทธ์ ์์ div๋ค ์ ์ฒด ์ ํ
const divs = document.querySelectorAll('#joinForm > div');
//validation ์ฒ๋ฆฌ
const memId = document.querySelector('#joinModal #memId').value;
if(memId == ''){
str = 'ID๋ ํ์ ์
๋ ฅ์
๋๋ค.';
result = false;
}
else if(memId.length < 4){
str = 'ID๋ 4๊ธ์ ์ด์์ด์ด์ผ ํฉ๋๋ค.';
result = false;
}
//์ ํจ์ฑ ๊ฒ์ฌ ์คํจ ์ ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๋ ฅ
if(!result){
const errorHTML = `<div class="my-invalid">${str}</div>`;
divs[1].insertAdjacentHTML('afterend', errorHTML);
}
return result; //๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋๋ฉด result๋ ๊ทธ๋๋ก true
}
๋ฌธ์ ์ .
๋ฐ์ดํฐ ์ ํจ ๊ฒ์ฌ ์คํจ ์ join ๋ฒํผ ๋๋ฅผ ๋ ๋ง๋ค ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ์๋๋ก ์ถ๊ฐ ๋จ.
๋ฌธ์ ์ ๋ณด์ > ๊ธฐ์กด์ ์ค๋ฅ ๋ฉ์ธ์ง ์ ๋ถ ์ญ์ ํด์ฃผ๋ฉด ๋จ.
์ค๋ฅ ๋ฉ์ธ์ง ์ญ์ ํจ์ ์์ฑ.
//์ค๋ฅ ๋ฉ์์ง div ์ ์ฒด ์ ๊ฑฐ
function deleteErrorDiv(){
//๊ธฐ์กด์ ์ค๋ฅ ๋ฉ์ธ์ง ์ญ์ (์กฐ์ธ ๋ฒํผ ๋๋ฌ๋ ๊ณ์ ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๊ฐ๋์ง ์๊ฒ)
const errorDivs = document.querySelectorAll('div[class="my-invalid"]');
for(const errorDiv of errorDivs){
errorDiv.remove();
}
}
์ค๋ฅ๋ฉ์ธ์ง๊ฐ ๋ฌ ์ํ์์ ๋ชจ๋ฌ์ฐฝ์ ๊ป๋ค๊ฐ ์ผ๋ ์ค๋ฅ ๋ฉ์ธ์ง ๋จ์ ์์
๋ชจ๋ฌ์ฐฝ์ด ๋ซํ ๋๋ ์ค๋ฅ ๋ฉ์ธ์ง ์ ๋ถ ์ญ์ ํด์ผ ๋จ.
๋ชจ๋ฌ์ฐฝ ๋ซํ๋ ์ด๋ฒคํธ๊ฐ ์๋ ํจ์ init์ ๋ก๊ทธ์ธ, ์กฐ์ธ ๋ชจ๋ฌ์ฐฝ ๋ซํ ๋ ๊ฐ๊ฐ deleteErrorDiv(); ์คํ์์ผ์ฃผ๊ธฐ.
function init(){
//๋ก๊ทธ์ธ ๋ชจ๋ฌ์ฐฝ(ํ๊ทธ) ์ ํ
const loginModal = document.querySelector('#loginModal');
//๋ก๊ทธ์ธ ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ ๋๋ง๋ค ์คํ๋๋ ์ด๋ฒคํธ
//์ธ์ ์ด๋ฒคํธ? , ์ด๋ค ์ด๋ฒคํธ
loginModal.addEventListener('hidden.bs.modal', function(e){ //e : ์ด๋ฒคํธ ๋งค๊ฐ๋ณ์
//๋ก๊ทธ์ธ ๋ชจ๋ฌ์ฐฝ์ ๋ชจ๋ input ํ๊ทธ ์ด๊ธฐํ
document.querySelector('#loginForm').reset();
deleteErrorDiv();
});
//ํ์๊ฐ์
๋ชจ๋ฌ์ฐฝ(ํ๊ทธ) ์ ํ
const joinModal = document.querySelector('#joinModal');
//ํ์๊ฐ์
๋ชจ๋ฌ์ฐฝ์ด ๋ซํ ๋๋ง๋ค ์คํ๋๋ ์ด๋ฒคํธ
joinModal.addEventListener('hidden.bs.modal', function(e){ //e : ์ด๋ฒคํธ ๋งค๊ฐ๋ณ์
//ํ์๊ฐ์
๋ชจ๋ฌ์ฐฝ์ ๋ชจ๋ input ํ๊ทธ ์ด๊ธฐํ
document.querySelector('#joinForm').reset();
deleteErrorDiv();
});
}
๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
๋น๋ฐ๋ฒํธ๋ ํ์ ์ ๋ ฅ์ด๋ฉฐ, ์๋ฌธ+์ซ์, 6~12์๋ฆฌ ๋ค์ด์ค๊ฒ Validation ์ฒ๋ฆฌ
- ์ ๊ท์(์ ๊ท ํํ์) ์ฌ์ฉ
๋ณต์กํด์ ์ธ์ฐ๊ธฐ ์ด๋ ค์ google์ ์ ๊ท์ ์น๋ฉด ์ฝ๋ ๋ณผ ์ ์๋ค.
์ซ์์ ๋ฌธ์ ํฌํจ ํํ์ 6~12์๋ฆฌ ์ด๋ด์ ์ํธ ์ ๊ท์ /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,12}$/ |
//---------pw ์ ํจ์ฑ ๊ฒ์ฌ---------
const memPw = document.querySelector('#joinModal #memPw').value;
//๋ฌธ์ + ์ซ์์ 6~12์๋ฆฌ์ ๊ธ์์ธ์ง ์ฒดํฌํ๋ ์ ๊ท์
//์ ๊ท์์ ๋ถํฉํ์ง ์์ผ๋ฉด null์ด return
const regExp = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,12}$/;
//const aaa = memPw.match(regExp);
//alert(aaa);
if(memPw == ''){
str_memPw = '*Password๋ ํ์ ์
๋ ฅ์
๋๋ค.';
result_memPw = false;
}
else if(memPw.match(regExp) == null){
str_memPw = '*์๋ฌธ๊ณผ ์ซ์๊ฐ ์กฐํฉ๋ 6~12๊ธ์๋ฅผ ์
๋ ฅํ์ญ์์ค.';
result_memPw = false;
}
์์ด๋, ๋น๋ฐ๋ฒํธ ๋ค ํ๋ฆฐ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์ธ์ง ๊ฐ์ด ๋จ๊ฒ ํด์ผ ํจ.
result์ str ๋ณ์๋ฅผ 2๊ฐ์ฉ ์ ์ธ ์ด๊ธฐํ.
memId, memPw์ ์ค๋ฅ ๋ฉ์ธ์ง str๊ณผ result๋ฅผ ๋ถ๋ฆฌ์์ผ์ผ ๋จ.
์ฝ๋ ์๋์ฒ๋ผ ์ ์ฒด์ ์ธ ์์ ํ์
//ํ์ ๊ฐ์
์งํ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ
function joinValidate(){
//์ด์ ์ค๋ฅ ๋ฉ์ธ์ง ์ง์์ฃผ๋ ํจ์
deleteErrorDiv();
//ํจ์์ ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ณ์
let result_memId = true;
let result_memPw = true;
//์ค๋ฅ ๋ฉ์ธ์ง
let str_memId = '';
let str_memPw = '';
//ํ์๊ฐ์
form ํ๊ทธ์ ์์ div๋ค ์ ์ฒด ์ ํ
const divs = document.querySelectorAll('#joinForm > div');
//---------id ์ ํจ์ฑ ๊ฒ์ฌ---------
//validation ์ฒ๋ฆฌ
const memId = document.querySelector('#joinModal #memId').value;
if(memId == ''){
str_memId = '*ID๋ ํ์ ์
๋ ฅ์
๋๋ค.';
result_memId = false;
}
else if(memId.length < 4){
str_memId = '*ID๋ 4๊ธ์ ์ด์์ด์ด์ผ ํฉ๋๋ค.';
result_memId = false;
}
//---------pw ์ ํจ์ฑ ๊ฒ์ฌ---------
const memPw = document.querySelector('#joinModal #memPw').value;
//๋ฌธ์ + ์ซ์์ 6~12์๋ฆฌ์ ๊ธ์์ธ์ง ์ฒดํฌํ๋ ์ ๊ท์
//์ ๊ท์์ ๋ถํฉํ์ง ์์ผ๋ฉด null์ด return
const regExp = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,12}$/;
//const aaa = memPw.match(regExp);
//alert(aaa);
if(memPw == ''){
str_memPw = '*Password๋ ํ์ ์
๋ ฅ์
๋๋ค.';
result_memPw = false;
}
else if(memPw.match(regExp) == null){
str_memPw = '*์๋ฌธ๊ณผ ์ซ์๊ฐ ์กฐํฉ๋ 6~12๊ธ์๋ฅผ ์
๋ ฅํ์ญ์์ค.';
result_memPw = false;
}
//์ ํจ์ฑ ๊ฒ์ฌ ์คํจ ์ ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๋ ฅ
if(!result_memId){
const errorHTML = `<div class="my-invalid">${str_memId}</div>`;
divs[1].insertAdjacentHTML('afterend', errorHTML);
}
if(!result_memPw){
const errorHTML = `<div class="my-invalid">${str_memPw}</div>`;
divs[2].insertAdjacentHTML('afterend', errorHTML);
}
return result_memId && result_memPw; //๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ ๋๋ฉด result๋ ๊ทธ๋๋ก true
}
search ๋ฒํผ ํด๋ฆญ ์ ๋ค์ ์ฃผ์๋ก api ์ฌ์ฉ
๋ค์ api ์ฃผ์๋ก ์ฌ์ฉ
์๋ ์ฝ๋ user_layout.html๊ณผ admin_layout.html์ ๋ถ์ฌ๋ฃ๊ธฐ
์์ฑ ์์น : content ํ์ด์ง js ์ฝ๋ ์
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
header.html์ join๋ชจ๋ฌ์ฐฝ์ search ๋ฒํผ ํด๋ฆญ ์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ onclick ์์ฑ ์ฌ์ฉํ์ฌ js๋ก ์ด๋
\<div class="col-3 d-grid">
<label for="search_btn" class="form-label"> </label>
<input type="button" class="btn btn-secondary" value="search" id="search_btn" onclick="searchAddr();">
\</div>
js์์ searchAddr ํจ์ ์์ฑ
//์ฐํธ๋ฒํธ ๊ฒ์ api ์ฌ์ฉ
function searchAddr(){
new daum.Postcode({
oncomplete: function(data) {
//๋๋ก๋ช
์ฃผ์
const roadAddr = data.roadAddress;
//์ํ๋ input ํ๊ทธ์ ๋ฃ์ด์ฃผ๋ฉด ๋จ.
//๋๋ก๋ช
์ฃผ์ ์ธํ
document.querySelector('#memAddr').value = roadAddr;
}
}).open();
}
addr input ํ๊ทธ์๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ readonlyt ์์ฑ ์ฌ์ฉ. > ์๋ชป๋ ๋ฐ์ดํฐ ์ ๋ ฅ ๋ฐฉ์ง
๊ทธ๋ฆฌ๊ณ ์ฃผ์ ์ ๋ ฅ์ฐฝ์ ํด๋ฆญํด๋ api ์ฃผ์๋ก ์ฌ์ฉํ ์ ์๊ฒ onclick์ผ๋ก ํจ์ ์คํ.
<div class="col-9">
<label for="memAddr" class="form-label">ADDRESS</label>
<input type="text" class="form-control" id="memAddr" name="memAddr" onclick="searchAddr();" readonly>
</div>
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผํ๋ชฐ ํ๋ก์ ํธ(6) ์ํ (0) | 2023.03.28 |
---|---|
์ผํ๋ชฐ ํ๋ก์ ํธ(5) ๋ก๊ทธ์ธ ๊ธฐ๋ฅ (0) | 2023.03.28 |
์ผํ๋ชฐ ํ๋ก์ ํธ(3) (0) | 2023.03.24 |
์ผํ๋ชฐ ํ๋ก์ ํธ (2) (0) | 2023.03.24 |
์ผํ๋ชฐ ํ๋ก์ ํธ(1) - ์ ๋ฐ์ ์ธ ํ ์ก๊ธฐ (0) | 2023.03.23 |