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>
์นธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค.