์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ์ ํ๋ฒํธ๋ฅผ
ํจํด ์ฒดํฌ๋ฅผ ํ์๋ค.
์ด๋ฒ์๋ ์์ด๋์ ์ด๋ฉ์ผ์
์ค๋ณต ์ฒดํฌ ํด๋ณด์!
[ ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ 1ํธ : ์ด๋ฆ, ํจ์ค์๋, ์ ํ๋ฒํธ ํจํด ์ฒดํฌ ]
์ด๊ณณ์ ๋ค์ด๊ฐ์๋ฉด ํ์ด์ง ๋์ ํ๋ฉด์ด ์๊ณ , ๊นํ๋ธ ๋งํฌ๋ฅผ ํตํด ์ ์ฒด ์ฝ๋๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค
[SpringBoot] (IntelliJ, vue.js, H2) ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ 1ํธ : dto ๋ง๋ค๊ณ , ์ ๋ ฅ๊ฐ ํจํด์ค์ ํ๊ธฐ.
๋๋ถ๋ถ์ ์น์ฌ์ดํธ๋ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ค.๊ทธ ์ค ํ์๊ฐ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด์! 1. ํ๋ฉด ๋์๊ณผ ์ ์ฒด์ฝ๋ํ์๊ฐ์ ์์ ํ์๊ฐ์ ์ค๋ณต ๋๋ ํ ๋ฆฌ์ ํด๋์ค Vue์ Spring์ ์ฐ๊ฒฐํด์ฃผ๋ dto
post-this.tistory.com
1. ์ด๋ป๊ฒ ๋ง๋ค์ง ๊ตฌ์
- ์ฒ์์ ์๊ฐํ ํ๋ฉด
- ์ค์ ๋ก ๋ง๋ ํ๋ฉด
- ๋ง๋ค ๋ฐฉ๋ฒ
๋งจ ์ฒ์์๋ ์๋ ์บก์ณ๋ณธ์ฒ๋ผ ๊ตฌ์ํ๊ธด ํ๋๋ฐ, ๋ง๋ค๋ฉด์ ์์ ๋ ๋ถ๋ถ์ด ๋ง๋ค. (์ฌ์ค ๋ง๋ ์ง ์ข ๋ผ์ ์ ๊ธฐ์ต์ด ์๋๋ค...) ์๋ฌดํผ! ์ฝ๋ ์ข ์ฐพ์๋ณด๋ค๊ฐ ๋์ถฉ ์ด๋ป๊ฒ ๋ง๋๋์ง ๊ตฌ์กฐ ํ์ ํ๊ณ ๊ทธ๋ฅ ์ง์ ํ๋ํ๋ ์ฝ๋๋ฅผ ์น๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค.(๋ํ์๋๋ถํฐ ํ๋ก์ ํธ ํด๋ณด๋ฉด์ ๊นจ๋ฌ์ ๊ฒฐ๊ณผ๋ ๋ด๊ฐ ์ง์ ๊ณต๋ถํด์ ์ฝ๋ ์น๋๊ฒ ๋น ๋ฅด๋ค๋ ๊ฒ์ด๋ค) ์ด๋์ ๋ณต๋ถํ ์๊ฐ์ด์๋๋ฐ, ์ญ์ ๋ ๋ก ๋จน๊ธฐ ์ฝ์ง ์๋ค.
userId๊ฐ ๋ฐฑ์๋๋ก ๋์ด๊ฐ๋ฉด ๊ฑฐ๊ธฐ์ ์ค๋ณต ์ฒดํฌ๋ฅผ ๊ฒ์ฌํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ณต ์ฒดํฌ๋ฅผ ๊ฒ์ฌํ๋์ง ์ํ๋์ง๋ฅผ idDuplicate์ emailDuplicate์ boolean ๊ฐ์ ํตํด ํ์ธํ ๊ฒ์ด๋ค. ์๋ ์บก์ณ๋ณธ์์๋ ๊ธฐ๋ณธ๊ฐ์ false๋ก ์ค์ ํ๋๋ฐ, ์ค์ ์ฝ๋๋ true๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์คฌ๋ค.
์ค๋ณต ์ฒดํฌ์ ๋ฌธ์ ๊ฐ ์์์ผ๋ฉด vue์์ false ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค ๊ฒ์ด๊ณ , ์ค๋ณต ์ฒดํฌ์ ๋ฌธ์ ๊ฐ ์์์ผ๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์ ๊ตฌ์ํ ๋ ์๊ฐ์ ๋ชปํ๋๋ฐ, ์์ด๋์ ์ด๋ฉ์ผ์ ์ค๋ณต ์ฒดํฌ๋ฅผ ํด๋ ๋ค ์์ด๋์ ์ด๋ฉ์ผ์ ์์ ํ๊ฒ๋๋ฉด ์ด๋ฏธ idDuplicate์ emailDuplicate๊ฐ false๊ฐ์ผ๋ก ๋ฐ๋์ด์ ๊ฐ์ ์ด ์ฑ๊ณตํ๋ค. ์ด ๋ถ๋ถ๋ ํจ๊ป ์ฝ๋๋ฅผ ์์ฑํ๋ค.
SpringBoot+Vue.js - ํ์๊ฐ์
ํ์๊ฐ์ ๊ตฌํ - ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ :rules๋ฅผ ํตํด ๊ตฌํ - ์์ด๋ ์ค๋ณต๊ฒ์ฌ, ๋๋ค์ ์ค๋ณต ๊ฒ์ฌ ์ถ๊ฐ 1. ๋ฐฑ์๋ MemberController @RestController @RequiredArgsConstructor public class MemberCont
bsy-96.tistory.com
2. ํ์ธํด์ผํ ๊ฒ
์ด๋ฆ | ์์ด๋ | ๋น๋ฐ๋ฒํธ | |
1 | ํ๊ธ๋ง ๊ฐ๋ฅ | ์๊ธ์๋ ๋ฌด์กฐ๊ฑด ์์ด | ๋๋ฌธ์, ํน์๋ฌธ์ ์ฌ์ฉํ์ฌ 8์ ์ด์ |
2 | 2์์ด์ 5์ ์ดํ | ์์ด์ ์ซ์๊ฐ ํจ๊ป | ๋น๋ฐ๋ฒํธ์ ๋น๋ฐ๋ฒํธ ํ์ธ์ด ๋ค๋ฅด๋ฉด ๊ฐ์ ๋ถํ |
3 | ์ ๋ณด ๋ฏธ๊ธฐ์ ์ ๊ฐ์ ๋ถํ | ์ค๋ณต์ฒดํฌ | ์ ๋ณด ๋ฏธ๊ธฐ์ ์ ๊ฐ์ ๋ถํ |
4 | ์์ด๋ ๋ฏธ์
๋ ฅ์, ์ค๋ณต์ฒดํฌ ๋ฒํผ์ ๋๋ฅด๋ฉด '์์ด๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.' ๋ฉํธ ์ถ๋ ฅ |
||
5 | ์์ด๋ ์์ ํ, ์ค๋ณต์ฒดํฌ ๋ค์ ๋๋ฌ์ผํจ | ||
6 | ์ ๋ณด ๋ฏธ๊ธฐ์ ์ ๊ฐ์ ๋ถํ | ||
7 | ์ค๋ณต์ฒดํฌ ์ํ๋ฉด ๊ฐ์ ๋ถํ |
์ ํ๋ฒํธ | ์ด๋ฉ์ผ | |
1 | ํ๊ตญ ์ ํ๋ฒํธ ํ์ค์ ๋ง์ถฐ ๊ธฐ์ | ์ด๋ฉ์ผ ํ์ค์ ๋ง์ถฐ ๊ธฐ์ |
2 | ์ ๋ณด ๋ฏธ๊ธฐ์ ์ ๊ฐ์ ๋ถํ | ์ด๋ฉ์ผ ๋ฏธ์ ๋ ฅ์, ์ค๋ณต์ฒดํฌ ๋ฒํผ์ ๋๋ฅด๋ฉด '์์ด๋ ์ ๋ ฅํด์ฃผ์ธ์.' ๋ฉํธ ์ถ๋ ฅ |
3 | ์ด๋ฉ์ผ ์์ ํ, ์ค๋ณต์ฒดํฌ ๋ค์ ๋๋ฌ์ผํจ | |
4 | ์ ๋ณด ๋ฏธ๊ธฐ์ ์ ๊ฐ์ ๋ถํ | |
5 | ์ค๋ณต์ฒดํฌ ์ํ๋ฉด ๊ฐ์ ๋ถํ |
3. vue ์ฝ๋
<script>
import axios from "axios";
export default {
name: 'BasicRegister',
/* ๋ฐ์ดํฐ ์ ์ */
data() {
return {
name: "",
userId: "",
pwd: "",
pwdConfirm: "",
tel: "",
birth: "",
email: "",
/* ์ค๋ณต ์ฒดํฌํ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ๊ฐ์ true๋ก ์ค์ ํจ */
idDuplicate: true,
emailDuplicate: true,
};
},
/* ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ๋ค์ ์ค๋ณต ์ฒดํฌ๋ฅผ ํ๋๋ก true๋ก ๋ณ๊ฒฝ */
watch: {
userId(newVal, oldVal) {
this.idDuplicate = true;
},
email(newVal, oldVal) {
this.emailDuplicate = true;
}
},
methods: {
/* ํ์๊ฐ์
*/
async register() {
try {
/* ์์ด๋์ ์ด๋ฉ์ผ ๊ฐ์ด true์ด๋ฉด ์์ง ์ค๋ณต ์ฒดํฌ๊ฐ ๋์ง ์์์ */
if(this.idDuplicate === true) {
alert("์์ด๋ ์ค๋ณต์ฒดํฌ๋ฅผ ํด์ฃผ์ธ์.")
return;
}
if(this.emailDuplicate === true) {
alert("์ด๋ฉ์ผ ์ค๋ณต์ฒดํฌ๋ฅผ ํด์ฃผ์ธ์.")
return;
}
/* ํด๋น ๊ฒฝ๋ก๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ์ฑ๊ณต์ ์๋ฆผ์ด ๊ฐ๋๋ก */
const res = await axios.post("http://localhost:8080/api/register", {
name: this.name,
userId: this.userId,
pwd: this.pwd,
pwdConfirm: this.pwdConfirm,
tel: this.tel,
birth: this.birth,
email: this.email,
});
alert("ํ์๊ฐ์
์ ์ฑ๊ณตํ์ต๋๋ค.");
this.$router.push({
path: "/completeView",
query: { userId: this.userId }
})
} catch (e) { /* ์คํจ์ ๊ทธ์ ๋ง๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ */
alert(e.response.data);
}
},
/* id ์ค๋ณต ์ฒดํฌ */
async checkIdDuplicate() {
console.log("idDuplicate ๋ฒํผ ํด๋ฆญ๋จ:", this.userId);
try{ /* ํด๋น ๊ฒฝ๋ก์ userId ๋ฐ์ดํฐ ๊ฐ์ด ๊ฐ์ด ๊ฐ */
const res = await axios.post("http://localhost:8080/api/idDuplicate", {
userId: this.userId
});
/* ์ฑ๊ณต์ด๋ฉด idDuplicate ๊ฐ์ false๋ก ๋ฐ๊ฟ */
alert("์ฌ์ฉ๊ฐ๋ฅํ ์์ด๋์
๋๋ค.");
this.idDuplicate = false;
} catch(e) { /* ์คํจ๋ฉด ์ฌ์ ํ idDuplicate ๊ฐ์ true */
alert(e.response.data);
this.idDuplicate = true;
}
},
/* ์ด๋ฉ์ผ ์ค๋ณต ์ฒดํฌ */
async checkEmailDuplicate() {
try { /* ๊ฒฝ๋ก์ email ๋ฐ์ดํฐ๊ฐ ๊ฐ */
const res = await axios.post("http://localhost:8080/api/emailDuplicate",{
email: this.email
}); /* ์ฑ๊ณตํ๋ฉด emailDuplicate ๊ฐ์ false๋ก ๋ฐ๋ */
alert("์ฌ์ฉ๊ฐ๋ฅํ ์ด๋ฉ์ผ์
๋๋ค.");
this.emailDuplicate = false;
} catch (e) { /* ์คํจํ๋ฉด ์ฌ์ ํ true */
alert(e.response.data);
this.emailDuplicate = true;
}
}
}
}
</script>
<template> ์ฝ๋
/* ํด๋ฆญํ๋ฉด check~Duplicate ๋ฉ์๋๊ฐ ์คํ๋๋ค */
<label>เท id: </label>
<input v-model="userId" type="text" name="userId" placeholder="id"/>
<button class="id-duplicate-btn" @click="checkIdDuplicate"> id </button>
<label>เท email: </label>
<input v-model="email" type="email" name="email" placeholder="example01@sori.com"/>
<button class="email-duplicate-btn" @click="checkEmailDuplicate"> email </button>
4. IdDuplicate.class, EmailDuplicate.class (dto)
@Getter
@Setter
public class IdDuplicate {
private String userId;
}
@Getter
@Setter
public class EmailDuplicate {
private String email;
}
์์ด๋์ ์ด๋ฉ์ผ ์ค๋ณต์ฒดํฌ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค. ๋ฌผ๋ก ์์ง์ ํ๋ฒํ ํด๋์ค์ง๋ง, ์ค๋ณต์ฒดํฌ๋ฅผ ๋ด๋นํ๋ ์ปจํธ๋กค๋ฌ์์ ํด๋น ํด๋์ค๋ฅผ dto ํด๋์ค๋ก ์ค์ ํด ์ค ๊ฒ์ด๋ค.
5. MemberRepository.interface
public interface MemberRepository extends JpaRepository<Member, Long> {
boolean existsByUserId(String userId);
boolean existsByEmail (String email);
}
MemberRepository๋ DB์ ์ง์ ์ ๊ทผํ๋ ๊ณ์ธต์ด๋ค. ์ฌ๊ธฐ์ existsByUserId์ existByEmail์ ์๋์ผ๋ก SQL์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ์ด๋ ์ค์ํ ์ ์ ๋ฉ์๋ ์ด๋ฆ์ ์ง์ ๋ ๊ท์น์ ๊ผญ ์ง์ผ์ผํ๋ค. [existBy+ํ๋๋ช ]์ผ๋ก ์ง์ด์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. (ํ๋๋ช ์ Member์ ์๋ ์ด๋ฆ๋๋ก ์ ์ด์ผ ํ๋ค.)
6. MemberService.class
@Service
public class MemberService {
// ๋ ํฌ์งํ ๋ฆฌ์ ์ปจํธ๋กค๋ฌ์ ์ค๊ฐ ์ญํ ์ด๋ผ ์์กด์ฑ ์ฃผ์
!
@Autowired
private MemberRepository memberRepository;
// ํจ์ค์๋ ์ํธํ
@Autowired
private PasswordEncoder passwordEncoder;
// ๋ ํฌ์งํ ๋ฆฌ์์ userId ์ค๋ณต ๊ฒ์ฌํ ๋ฉ์๋
public Boolean existByUserId (String userId) {
return memberRepository.existsByUserId(userId);
}
// ๋ ํฌ์งํ ๋ฆฌ์์ email ์ค๋ณต ๊ฒ์ฌํ ๋ฉ์๋
public Boolean existByEmail (String email) {
return memberRepository.existsByEmail(email);
}
// ํจ์ค์๋ ๋ ํฌ์งํ ๋ฆฌ์ ์ ์ฅํ ๋ ์ํธํ ์ํจ ํ ๋ฃ๋ ๋ฉ์๋
public Member save(Member member) {
member.setPwd(passwordEncoder.encode(member.getPwd()));
return memberRepository.save(member);
}
}
MemberService๋ ์ปจํธ๋กค๋ฌ์ ๋ ํฌ์งํ ๋ฆฌ ์ฌ์ด์์ ์ค๊ฐ ์ญํ ์ ํ๋ค. ์ฌ๊ธฐ์ existByUserId์ existByEmail์ ์๊น MemberRepository์์ ์ค์ ํ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ์ญํ ์ ํ๊ณ ์๋ค.
์ฒ์์๋ MemberServie๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ๋ ํฌ์งํ ๋ฆฌ์์ ์ค์ ํ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋ ํฌ์งํ ๋ฆฌ์์ ๊ฐ์ ธ์ ๋ฐ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด, existByUserId์ existByEmail์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ด๋ ค์์ง ์ ์๋ค. ์ง๊ธ์ ์ค์ ๋ก ์๋ฒ๋ฅผ ์ด๊ฒ ์๋๋๊น ์บ์์ฒ๋ฆฌ ๋ฑ ๋ค๋ฅธ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ์์ด์ MemberService์ ์ฝ๋๋ฅผ ์ถ๊ฐํ ๊ฒ ์๋ฏธ ์์ด ๋ณด์ด์ง๋ง, ํ์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ๋ฉด MemberService๋ฅผ ํตํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
7. CheckId.class, CheckEmail.class
public class CheckId {
private static final String ID_PATTERN = "^(?=.*\\d)[A-Za-z][A-Za-z0-9]{3,19}$";
private static final Pattern pattern = Pattern.compile(ID_PATTERN);
public static String checkId(String userId) {
if(userId == null || userId.isBlank()) {
return "์์ด๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.";
}
if (!pattern.matcher(userId).matches()) {
return "์์ด๋์ ์ฒซ๊ธ์๋ ์์ด์ด๋ฉฐ, ์์ด์ ์ซ์๋ฅผ ์์ด 4์๋ฆฌ ์ด์ 20์๋ฆฌ ์ดํ๋ง ๊ฐ๋ฅํฉ๋๋ค.";
}
return "ok";
}
}
public class CheckEmail {
private static final String EMAIL_PATTERN =
"^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])+[.][a-zA-Z]{2,3}$";
private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN);
public static String checkEmail(String email) {
if(email == null || email.isBlank()) {
return "์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.";
}
if (!pattern.matcher(email).matches()) {
return "์ด๋ฉ์ผ ์์์ ํ์ธํด์ฃผ์ธ์.";
}
return "ok";
}
}
์์ด๋์ ์ด๋ฉ์ผ ํจํด ์ฒดํฌ๋ฅผ ํด์คฌ๋ค. ์์ด๋๋ ๋งจ ์ฒซ๊ธ์์ ์ซ์๊ฐ ์ฌ ์ ์๊ณ , ์ ์ฒด์ ์ผ๋ก๋ ์์ด์ ์ซ์๋ง ์ฌ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฉ์ผ์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๊ทธ๋ฐ ์์์ ํจํด์ ์ค์ ํด์คฌ๋ค.
id์ email ์นธ์ null๊ณผ ๋์ด์ฐ๊ธฐ ๋ฑ ๊ณต๋ฐฑ์ด ์จ ์ฑ ์ค๋ณต ์ฒดํฌ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์ด๋์ ์ด๋ฉ์ผ์ ์ ๋ ฅํด๋ฌ๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
8. MemberService.class
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:5173")
public class DuplicateController {
// ์์กด์ฑ ์ฃผ์
// MemberServic์ ์๋ ๋ฉ์๋ ์ธ๊ฑฐ๋ผ์
@Autowired
private MemberService memberService;
// id ํจํด ์ฒดํฌ ๋ฐ ์ค๋ณต ํ์ธ
@PostMapping("/idDuplicate")
public ResponseEntity<String> idDuplicate(@RequestBody IdDuplicate request) {
// userId๋ฅผ null, isblank, ํจํด ๊ฒ์ฌ
String userId = request.getUserId();
String checkResult = CheckId.checkId(userId);
if (!"ok".equals(checkResult)) {
return ResponseEntity.badRequest().body(checkResult);
}
// userId ์ค๋ณต ๊ฒ์ฌ
boolean existUserId = memberService.existByUserId(request.getUserId());
if (existUserId == true) {
return ResponseEntity.badRequest().body("id๊ฐ ์ค๋ณต๋์์ต๋๋ค.");
} else {
return ResponseEntity.ok("ok");
}
}
// email ํจํด ์ฒดํฌ ๋ฐ ์ค๋ณต ํ์ธ
@PostMapping("/emailDuplicate")
public ResponseEntity<String> emailDuplicate(@RequestBody EmailDuplicate request) {
// email null, isBlank, ํจํด ๊ฒ์ฌํ๊ธฐ
String email = request.getEmail();
String checkResult = CheckEmail.checkEmail(email);
if (!"ok".equals(checkResult)) {
return ResponseEntity.badRequest().body(checkResult);
}
// email ์ค๋ณต ๊ฒ์ฌ
boolean existEmail = memberService.existByEmail(request.getEmail());
if (existEmail == true) {
return ResponseEntity.badRequest().body("email์ด ์ค๋ณต๋์์ต๋๋ค.");
} else {
return ResponseEntity.ok("ok");
}
}
}
๋ณดํต์ ์ฌ์ฉ์๊ฐ ์ด๋ค ์ ๋ณด๋ ์ ๋ ฅํ์ง ์์ ์ํ๋ผ๋ฉด, ์์ด๋ ์ค๋ณต์ ์ฒดํฌํ๋ ๋ฒํผ์ ๋๋ฅด์ง ์์์ ๊ฒ์ด๋ค. ๊ทธ๋์ ์์ด๋ ์ค๋ณต ์ฒดํฌ ๋ฒํผ์ ๋๋ฅด๊ธฐ ์ ์ ๋ฌด์กฐ๊ฑด ์์ด๋ ์ค๋ณต ์ฒดํฌ๋ฅผ ๋๋ฅด๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ alert๋๋๋ก ํ๋ค. ๊ทธ๊ฑธ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์ค๋ฅ ๋ฉ์์ง๋ก ๋จ๋๋ก ์ค๊ณํ๋ค.(vue์์ ์ค์ ํจ) ์์ด๋์ ์ด๋ฉ์ผ์ด null, blank ๊ฒ์ฌ๋ ์ค๋ณต ๋ฒํผ์์ ์ํํ๋ค. ์๋๋ฉด ์ด์ฐจํผ idDuplicate์ emailDuplicate ๋ฐ์ดํฐ ๊ฐ์ด false๋ก ๋ฐ๋์ง ์์ ์ด์ SIGN UP ๋ฒํผ์ ์ค๋ณต์ ๊ฒ์ฌํ๋ผ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ์ํฌํ ๋๊น.
// ๋งคํ!
@PostMapping("/idDuplicate")
public ResponseEntity<String> idDuplicate(@RequestBody IdDuplicate request) {
id ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด, vue์์ const res = await axios.post("http://localhost:8080/api/idDuplicate", { userId: this.userId });๊ฐ ์คํ๋๋๋ก ์ฝ๋๋ฅผ ์ ์๋ค. ์ฌ๊ธฐ์ ๋ณด๋ฉด ํด๋น ์ฃผ์๊ฐ ์์ ์ฃผ์๋ก ๋งคํ๋๋๊ฑธ ํ์ธํ ์ ์๋ค.
๋ณด๋ด์ง JSON ๋ฐ๋๋ ์ด๋ ๊ฒ ์๊ฒผ์ ๊ฒ์ด๋ค.
{ "userId": "sori1234" }โ
๊ทธ๋ฌ๋ฉด @RequestBody๋ HTTP ์์ฒญ ๋ฐ๋๋ฅผ ์๋ฐ ๊ฐ์ฒด(DTO)๋ก ๋ณํํด์ค๋ค. JSON์ "userId" : "sori1234" ๊ฐ์ด IdDuplicate.userId ํ๋์ ์๋์ผ๋ก ๋งคํ๋๋ค. HttpMessageConverter๋ Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ๋ฐ ์ด๊ฒ JSON์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ค๋ค.
String userId = request.getUserId();
String checkResult = CheckId.checkId(userId);
if (!"ok".equals(checkResult)) {
return ResponseEntity.badRequest().body(checkResult);
}
๊ทธ๋ฌ๋ฉด ์๋์ผ๋ก ๋งคํ๋ userId๋ฅผ ๊ฐ์ ธ์๊ณ , userId๋ฅผ CheckId ํด๋์ค์ checkId ๋ฉ์๋๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฌ๋ฉด null๊ฐ์ธ์ง, isBlank์ธ์ง, ํจํด์ ๋ง๋์ง ๊ฒ์ฌํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ checkResult์ ๋ด์ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ checkResult ๊ฐ์ด ok์ด๊ฐ ์๋๋ผ๋ฉด ๊ทธ์ ๋ง๋ ๋ฉ์์ง๋ฅผ return ํ๋ค.
idDuplicate ๋ฉ์๋์ ๋ฐํํ์ ์ ResponseEntity<String>์ธ๋ฐ, ์ด ์ด์ ๊ฐ ์ํ ์ฝ๋์ ๋ฉ์์ง๋ฅผ ๊ฐ์ด ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์ค์ ํ๋ค.
boolean existUserId = memberService.existByUserId(request.getUserId());
if (existUserId == true) {
return ResponseEntity.badRequest().body("id๊ฐ ์ค๋ณต๋์์ต๋๋ค.");
} else {
return ResponseEntity.ok("ok");
}
์ด์ ์ค๋ณต์ ํ์ธํ ๊ฒ์ด๋ค. ์ค๋ณต์ ์ฒดํฌํ ๋ ํ์ํ ํด๋์ค๋ MemberService์ ๋ ํฌ์งํ ๋ฆฌ์ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์๋ existByUserId์ด๋ค. vue์์ ๋ฐ์์จ userId๊ฐ (DTO ํด๋์ค๋ก ๋ฐ์๋) ๋ ํฌ์งํ ๋ฆฌ์ ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ฉ์๋๊ฐ existByUserId๊ฐ ๋๋ค.
์๋ง existByUserId์๋ ์ด๋ฐ ์ฝ๋๊ฐ ์๋ต๋์ด ์์ ๊ฒ์ด๋ค.
select count(m) > 0 from Member m where m.userId = :userIdโ
๊ฐ์ userId๊ฐ ์์ผ๋ฉด true ๊ฐ์, ์์ผ๋ฉด false ๊ฐ์ existUserId๊ฐ ๊ฐ์ง ๊ฒ์ด๋ค. ๊ทธ๋์ if ๋ฌธ์ผ๋ก true ๊ฐ์ ๊ฐ์ง๋ฉด id๊ฐ ์ค๋ณต๋์๋ค๋ ๋ฉ์์ง๊ฐ ๋ฆฌํด๋๊ณ , false ๊ฐ์ด๋ฉด ok๊ฐ ๋ฆฌํด๋๋๋ก ํ๋ค.
9. ๋ค์ vue ์ฝ๋
/* ๋ฐ์ดํฐ ์ ์ */
data() {
return {
name: "",
userId: "",
pwd: "",
pwdConfirm: "",
tel: "",
birth: "",
email: "",
/* ์ค๋ณต ์ฒดํฌํ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ๊ฐ์ true๋ก ์ค์ ํจ */
idDuplicate: true,
emailDuplicate: true,
};
},
์ฒ์์ idDuplicate์ emailDuplicate๊ฐ true ๊ฐ์ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค.
/* id ์ค๋ณต ์ฒดํฌ */
async checkIdDuplicate() {
console.log("idDuplicate ๋ฒํผ ํด๋ฆญ๋จ:", this.userId);
try{ /* ํด๋น ๊ฒฝ๋ก์ userId ๋ฐ์ดํฐ ๊ฐ์ด ๊ฐ์ด ๊ฐ */
const res = await axios.post("http://localhost:8080/api/idDuplicate", {
userId: this.userId
});
/* ์ฑ๊ณต์ด๋ฉด idDuplicate ๊ฐ์ false๋ก ๋ฐ๊ฟ */
alert("์ฌ์ฉ๊ฐ๋ฅํ ์์ด๋์
๋๋ค.");
this.idDuplicate = false;
} catch(e) { /* ์คํจ๋ฉด ์ฌ์ ํ idDuplicate ๊ฐ์ true */
alert(e.response.data);
this.idDuplicate = true;
}
},
vue๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์๋ค. try๋ ์์ฒญ์ด ์ฑ๊ณตํ์ ๋, catch๋ ์์ฒญ์ ์คํจํ์ ๋ ์ฝ๋๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๋ค.
return ResponseEntity.ok("ok");๋ฅผ ์คํ๋ง์ด ๋ณด๋ด vue์์ ๋ฐ์ผ๋ฉด 200์ด๋ ์ํ์ฝ๋๋ฅผ ๋ฐ์์ ์ฑ๊ณตํ์์ ์๋ฏธํ๋ค. alert("์ฌ์ฉ๊ฐ๋ฅํ ์์ด๋์ ๋๋ค.")๊ฐ ์ถ๋ ฅ๋๋ฉด์, this.idDuplicate๋ฅผ false๋ก ๋ฐ๊พผ๋ค. (์ฌ๊ธฐ์ this.์ ํ์ฌ ์ด๊ณณ data์ ์ ์๋ ๊ฐ์ ๋งํ๋ค)
์คํจํ๊ฒ๋๋ฉด ์คํ๋ง์์ ์จ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉฐ this.idDuplicate๋ฅผ true๋ก ๋ฐ๊พผ๋ค. ์ฌ์ค this.idDuplicate = true๋ฅผ ์์ ์ด๋ ๋๋ ๊ฒ ๊ฐ๊ธดํ๋ฐ (๋ด ๋จธ๋ฆฟ ์ ์ด๋ก ์..ใ ใ ) ๊ทธ๋ฅ ์ ์ด์คฌ๋ค. ํ์คํ ๋ฐ๋์ง ์์์์ ๋ค์ ํ ๋ฒ ๊ฐ์ธํ๊ธฐ ์ํด,,,
์ ๊ฐ ์ดํดํ ๊ฑธ ์ต๋ํ ์ ์ ์ด๋ณด๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค.
๋ด์ฉ ์ค์ ํ๋ฆฐ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :-)
๋์์ด ๋์
จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๐ณ ํ์ดํ ๐ณ