์๋ ์ฝ๋๋ ํ์ ๊ฐ์ ์ ์ด๋ฉ์ผ ์ฃผ์์ ์ค๋ณต์ ํ์ธํ๊ธฐ ์ํ JPA Repository ํจ์์ ๋๋ค. @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด email์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ต๋๋ค. ์ด ๋ ์ฃผ์ํด์ผ ํ ์ ์ v.email = :email ๋ถ๋ถ์ ๋๋ค. String email์ ๋งคํํ๊ธฐ ์ํด์๋ ์ฝ๋ก (:)์ email์ ๋ฐ๋ก ๋ถ์ฌ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์งํค์ง ์์ผ๋ฉด null Exception์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ค์์ ์ด๋ฉ์ผ ์ธ์ฆ์ ํตํ ํ์์ ์กด์ฌ ๋ฐ ์ํ๋ฅผ ํ์ธํ๊ณ ๊ฐ์ ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ผ๋ก ์๋ฅผ ๋ ๋ค.
@Repository
public interface SignUpRepository extends JpaRepository<MemberEntity, Long> {
/**
* ์ฃผ์ด์ง ์ด๋ฉ์ผ ์ฃผ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
*
* @param email ์ด๋ฉ์ผ ์ฃผ์
* @return ์ด๋ฉ์ผ ์ฃผ์๊ฐ ์กด์ฌํ๋ฉด true, ๊ทธ๋ ์ง ์์ผ๋ฉด false
*/
Boolean existsByEmail(String email);
/**
* ์ฃผ์ด์ง ์ด๋ฉ์ผ ์ฃผ์์ ํด๋นํ๋ ํ์ ๊ฐ์
์ ๋ณด์ ์ธ์ฆ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
*
* @param email ์ด๋ฉ์ผ ์ฃผ์
* @return ์
๋ฐ์ดํธ๋ ํ(row)์ ์
*/
@Modifying
@Transactional
@Query("UPDATE MemberEntity v SET v.verified = true WHERE v.email = :email")
int updateVerified(@Param("email") String email);
}
@Repository์ ๊ฒฐ๊ณผ๊ฐ์ @Service์์ ๊ฒฐ๊ณผ ๊ฐ int(์ํฅ์ ๋ฐ์ ํ ์)๋ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ธ๋ค.
/**
* ์ด๋ฉ์ผ ์ธ์ฆ์ ํตํด ํ์๊ฐ์
์ ์ฒ๋ฆฌํฉ๋๋ค.
*
* @param value ์ธ์ฆ ๊ฐ
* @return ํ์ ๊ฐ์
ํ ์ด๋ฉ์ผ ์ฃผ์ ๋๋ false
*/
public String checkVerification(String value) {
// ๊ฐ ์กด์ฌ ์ฌ๋ถ ํ์ธ
Optional<VerificationEntity> vEntity = verificationRepository
.findByVerificationValueAndExpiredAndVerified(value, false, false);
if (vEntity.isPresent()) {
// ์ธ์ฆ ์๋ฃ ์ฒ๋ฆฌ
verificationRepository.updateVerified(value);
// ํ์ ๊ฐ์
์ ๋ณด ์
๋ฐ์ดํธ
if (1 == signUpRepository.updateVerified(vEntity.get().getEmail())) {
// ํ์ ๊ฐ์
ํ ์ด๋ฉ์ผ ์ฃผ์ ๋ฐํ
return vEntity.get().getEmail();
}
}
// ํ์ ๊ฐ์
์ ๋ณด๊ฐ ์๊ฑฐ๋ ์ด๋ฏธ ์ธ์ฆ๋ ๊ฒฝ์ฐ false ๋ฐํ
return "false";
}
@Service์ ๊ฒฐ๊ณผ ๊ฐ์ @Controller์์ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ธ๋ค.
/**
* ์ด๋ฉ์ผ ์ธ์ฆ ์์ฒญ์ ๋ํ ์๋ต ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
*
* @param value ์ธ์ฆ ๊ฐ
* @param model ๋ทฐ์ ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋ชจ๋ธ
* @return ๋ทฐ ์ด๋ฆ
*/
@GetMapping("/verification")
public String verificationAction(String value, Model model) {
// ์ด๋ฉ์ผ ์ธ์ฆ ์ฒ๋ฆฌ
String result = verificationService.checkVerification(value);
// ์ธ์ฆ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ทฐ์ ์ ๋ฌํ ๋ฐ์ดํฐ ์ค์
if (!result.equals("false")) {
// ์ธ์ฆ ์ฑ๊ณต ๋ฉ์์ง ์ค์
model.addAttribute("message", "์ธ์ฆ์ด ์๋ฃ ๋์์ต๋๋ค.");
model.addAttribute("type", "info");
// ํ์ ์ ๋ณด ์ค์
model.addAttribute("member", MemberDTO.builder().email(result).build());
} else {
// ์ธ์ฆ ์คํจ ๋ฉ์์ง ์ค์
model.addAttribute("message", "์ธ์ฆ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค.");
model.addAttribute("type", "warning");
}
// ํ์ ๊ฐ์
ํ์ด์ง๋ก ์ด๋
return "member/sign-in";
}
@View(Mustache)์์๋ ๋ค์๊ณผ ๊ฐ์ด message๊ฐ ์ฌ์ฉ๋๋ค. ์ฃผ๋ก Alert์ฐฝ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ ํ๊ธฐ ์ํ์ฌ ์ด๋ค.
{{#message}}
<div class="alert alert-{{#type}}{{type}}{{/type}}" role="alert">
{{message}}
</div>
{{/message}}
@์น๋ถ๋ผ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ธ๋๋ค.
'๐ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ ๋ณด] spring boot์์ entity id ์์ฑ ์ ๋ต (0) | 2023.03.16 |
---|---|
[์ ๋ณด] SQL ๋ฐ์ดํฐ ํค ๊ฐ ๋น ๊ณต๋ฐฑ ์ฑ์ฐ๊ธฐ (0) | 2023.03.15 |
[์๋ฐ] OTP ์ธ์ฆ์ฝ๋ ์์ฑ ์์ค์ฝ๋ (0) | 2023.02.21 |
[์ ๋ณด] ํ์ด์ฌ ์์ธ์ฒ๋ฆฌ ์ฌ๋ฌ๊ฐ ํ๊ธฐ (0) | 2023.02.17 |
[์ ๋ณด] ์คํ๋ง๋ถํธ์ ํ์ด์ฌ์ ์ด์ฉํ์ฌ JSON ํต์ ํ๊ธฐ (0) | 2023.02.17 |