์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ(4) ํšŒ์› ๊ฐ€์ž… ๊ธฐ๋Šฅ

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">&nbsp;</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">&nbsp;</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>