JPA
[JPA] 이메일 인증 토큰 값이 Null ?? (EntityLifeCycle, Transactional)
코리늬
2020. 7. 14. 22:54
백기선님의 JPA 웹앱 만들기 강의를 참고하였습니다.
회원가입시 이메일로 본인 확인을 검증하는 과정에서 임시로 발급한 token값이 null이어서 에러 페이지를 뱉어냈다.
java.lang.NullPointerException: null
at com.jpa.studywebapp.account.AccountController.checkEmailToken(AccountController.java:65) ~[main/:na]
왜그럴까?
여기서 한 번 더 JPA 라이프사이클의 중요성
을 깨닫는다.
문제의 소스코드
public void processNewAccount(SignUpForm signUpForm) {
Account newAccount = saveNewAccount(signUpForm);
newAccount.generateEmailCheckToken();
sendSignUpConfirmEmail(newAccount);
}
//리팩토링
private Account saveNewAccount(@Valid SignUpForm signUpForm) {
Account account = Account.builder()
.email(signUpForm.getEmail())
.nickname(signUpForm.getNickname())
.password(passwordEncoder.encode(signUpForm.getPassword())) // 패스워드 암호화
.studyCreatedByWeb(true)
.stuydyEnrollmentByWeb(true)
.studyUpdatedByWeb(true)
.build();
return accountRepository.save(account);
}
saveNewAccount 메소드를 보면 accountRepository.save(account);
새로운 회원 데이터를 저장하고 return 하게된다.
해당 메소드에서만 persistent
상태를 유지하게된다. 따라서 다음 로직인 generateEmailCheckToken 는 Detached
상태가 되어 토큰은 생성이 되었지만 실제로 저장은 되지 않았다.
따라서 정상적으로 newAccount에서 토큰 값이 저장되도록 하기 위해서는 persistent
상태로 만들어주어야 하기 때문에, processNewAccount 메소드에 @Transactional 선언을 해주어야한다.