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 상태를 유지하게된다. 따라서 다음 로직인 generateEmailCheckTokenDetached 상태가 되어 토큰은 생성이 되었지만 실제로 저장은 되지 않았다.

따라서 정상적으로 newAccount에서 토큰 값이 저장되도록 하기 위해서는 persistent 상태로 만들어주어야 하기 때문에, processNewAccount 메소드에 @Transactional 선언을 해주어야한다.