
1-1. ๊ตฌํ ๋ฐฉ์ (์ฌ์ฉํ ๊ธฐ์ , ๋ณ์ ํ์ ๋ฑ๋ฑ ํ๋๋ผ๋ ์ป์ ์ )
1-2. ์คํํ๋ ๋ฐฉ๋ฒ (url ์ฃผ์, input ๊ฐ ์กฐ๊ฑด, output ๊ฐ ์กฐ๊ฑด ๋ฑ๋ฑ) - <ํ๋ก ํธ ๊ธฐ์ค>
1-3. ํด๋น ๊ธฐ์ ์ ์ฌ์ฉํ ์ด์ ๊ฐ ๋ญ์ง > ์ด๋ ํ ๋ชฉํ๋ก ํด๋น ๊ธฐ์ ์ ์ฌ์ฉํ๊ฒ ๋๋์ง!
...๋ ์๋์ ํจ๊ป ์์ฑํ๊ฒ ์ต๋๋ค.
ajax์ thymeleaf๋ฅผ ์ฌ์ฉํ๋ค.// username ์ค๋ณต ์ฒดํฌ
@PostMapping("/signup/confirm-username/{username}")
@ResponseBody
public void checkUsername(@PathVariable("username") String username) {
userService.checkUsername(username);
}
$.ajax({
type: 'POST',
url: '/api/signup/confirm-username/' + encodeURIComponent(username),
contentType: "application/json"
}).done(function (data, textStatus, xhr) {
if (data !== '') {
alert('์ฌ์ฉํ ์ ์๋ ์์ด๋ ์
๋๋ค.');
return;
}
alert('์ฌ์ฉํ ์ ์๋ ์์ด๋ ์
๋๋ค.');
})
.fail(function (xhr, textStatus, errorThrown) {
alert(errorThrown);
});
url -> /api/signup-page
url -> /api/signup
username(์์ด๋), password(๋น๋ฐ๋ฒํธ), email(์ด๋ฉ์ผ), nickname(๋๋ค์)์ <form>์ผ๋ก ๋ฐ์์จ๋ค.@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SignupRequestDto {
@Pattern(regexp = "^(?=.*[a-z\\d]).{4,10}$", message = "์ต์ 4์ ์ด์, 10์ ์ดํ์ด๋ฉฐ ์ํ๋ฒณ ์๋ฌธ์(a~z), ์ซ์(0~9) ์ฌ์ฉ.")
@NotBlank
private String username;
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^*+=-]).{8,15}$", message = "์ต์ 8์ ์ด์, 15์ ์ดํ์ด๋ฉฐ ์ํ๋ฒณ ๋์๋ฌธ์(a~z, A~Z), ์ซ์(0~9), ํน์๋ฌธ์(!@#$%^*+=-)๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉ.")
@NotBlank
private String password;
@Email
@NotBlank
private String email;
@NotBlank
private String nickname;
}
@Pattern ์ด๋
ธํ
์ด์
๊ณผ ์ ๊ทํํ์์ผ๋ก ๊ฐ์ ๊ฑฐ๋ฅด๊ณ ์์ง๋ง, ํ๋ก ํธ์์๋ ๋ค์ ํ ๋ฒ ๋ํด์ฃผ๊ณ ์๋ค. (์๊ฐ์ ์ธ ํธ์์ฑ์ ์ํด) ์๋๋ JS๋ก ์์ฑํ check_email()์ ๊ตฌํ๋ถ.function check_email() { // ์ด๋ฉ์ผ ์ ๊ท์ ์ฒดํฌ
var email = document.getElementById('email').value;
// ์ด๋ฉ์ผ ์ ๊ท์
let regexp_email = new RegExp('^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$')
if (!regexp_email.test(email)) {
document.getElementById('check_regexp_email').innerHTML = '์ ํจํ์ง ์์ ์ด๋ฉ์ผ ํ์ ์
๋๋ค.';
document.getElementById('check_regexp_email').style.color = 'red';
return false;
} else {
document.getElementById('check_regexp_email').innerHTML = '์ ํจํ ์ด๋ฉ์ผ ํ์ ์
๋๋ค.';
document.getElementById('check_regexp_email').style.color = 'blue';
return true;
}
}
url -> /api/signup/confirm-username/{username}
{email} ๊ฐ์ @PathVariable๋ก ๋ฐ์์จ๋ค.์ด๋ฉ์ผ ์
๋ ฅ์ ๋ฐ๋ <input> ์นธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.@PathVariable์ ์ ํํ๋ค.url -> /api/login-page
url -> /api/login
ํ๋ก ํธ๋ก๋ถํฐ username(์์ด๋)์ password(๋น๋ฐ๋ฒํธ)๋ฅผ ๋ฐ์์ DB ๋ด ์ ํจํ ๊ฐ์ธ์ง ํ์ธํ๊ณ , token์ ์์ฑ ํ โ ์์ฑํ token์ Cookie ๊ฐ์ผ๋ก ์ ๋ฌํ๋ค.

Cookie๋ก ์ ๋ฌ๋ token ๊ฐ์ setRequestHeader() ๋ฉ์๋๋ฅผ ํตํด ๋ค์ Header๋ก ์ ๋ฌ๋๋ค.
'์ด๋ป๊ฒ ์ธ์ฆํด์ผํ๋ค'๋ ์ ์ฐจ๋ฅผ ๋ช ์ํ ๊ฒ์ด ์์ด์,
- ๋์๋ฅผ ์์ฑํ๊ณ
- ๊ทธ ๋์๋ฅผ ๋ฉ์ผ๋ก ์ ์กํ๊ณ
- ๋ฉ์ผ๋ก ์ ์ก ๋ฐ์ ๋์์ ์์ฑ๋ ๋์๊ฐ ์ผ์นํ๋์ง (๊ฐ์ ๋์ผํ๊ฒ ์ ๋ ฅํ๋์ง)
๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฉ์ผ ์ธ์ฆ์ ์งํํ์ต๋๋ค.
url -> /api/signup/confirm-email/{email}
{email} ๊ฐ์ @PathVariable๋ก ๋ฐ์์จ๋ค.์ด๋ฉ์ผ ์
๋ ฅ์ ๋ฐ๋ <input> ์นธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.@PathVariable์ ์ ํํ๋ค./api/email/~ ๋์ /api/signup/~ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค.url -> /api/email/send-email
request (=๋ณด๋ผ ์ด๋ฉ์ผ) ๊ฐ์ @RequestBody๋ก ๋ฐ์์๋ค.
์ค์ ํ๋ก ํธ์์๋ ์ด๋ฉ์ผ ์
๋ ฅ์ ๋ฐ๋ <input> ์นธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.

์ธ์ฆ์ฝ๋ ์์ฑ์ 6์๋ฆฌ์ ๋๋คํ ์ซ์์ ์กฐํฉ์ด๋ค.
์ธ์ฆ์ฝ๋(์ธ์ฆ๋ฒํธ)๋ฅผ ์ ๋ฌํ ๋๋ thymeleaf๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ๋ฌํด์ฃผ์๋ค.
// context ์ค์
private String setContext(String authcode) {
Context context = new Context();
context.setVariable("authcode", authcode); // ์ ๋ฌํ ๋ณ์ ๋ช
์ {authcode}
return templateEngine.process("mail", context); // mail.html
}
<div style="text-align:center; border:1px solid black; font-family:verdana;">
<div style="color:blue; margin:20px 0 20px 0;"
th:text="${authcode}"><!--์ธ์ฆ๋ฒํธ {authcode}๊ฐ ํ์๋๋ ์๋ฆฌ--></div>
</div>
url -> api/email/confirm-authcode
@RequestBody๋ก ๋ฐ์์๋ค.์ด๋ฉ์ผ ์ธ์ฆ์ฝ๋๋ฅผ ์์ฑํ๋ <input> ์นธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.