백기선님의 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 선언을 해주어야한다.
'JPA' 카테고리의 다른 글
[JPA] update가 왜 안되는거지..? (detached to persistent) (0) | 2020.07.21 |
---|---|
[JPA] Repository 인터페이스 작성시 유의사항 (0) | 2020.07.21 |
[JPA] spring data jpa Page vs Slice (0) | 2020.06.29 |
[JPA] 변경 감지(dirty checking)와 병합(merge) (0) | 2020.05.02 |
[JPA] 엔티티 설계시 주의사항 (0) | 2020.04.30 |
댓글