
회원가입을 할 때, 이메일 인증 확인이 된 사람만 회원가입을 완료할 수 있게 코드를 짜고 싶었다.
그렇게 하기 위해서는 먼저 회원가입 창에서 이메일 인증 전 상태와 인증 확인이 된 상태를 나눌 필요가 있었고, 그 정보를 저장해둘 데이터베이스도 필요했다.
인증 상태를 나누기 위해서 MailAuth라는 Entity를 따로 구현했고, 잠시 동안 정보를 담고 있을 DB는 Redis를 사용하기로 했다.
회원가입을 하는 도중, 이메일 인증 했는지 알기 위한 절차에서 필요한 테이블은 다음과 같이 만들었다.

이메일 인증이 되지 않은 회원 상태를 NON_AUTH_USER라는 유저 상태를 Enum으로 관리를 하였고
인증번호 검증이 완료되면 상태를 바꾸는 로직을 생각했다.
Redis에서 키 값을 loginId로 두었고 value는 MailAuth 객체로 받아오기 위해서는 Value에 객체가 들어오게끔 코드를 짜야했고 아래의 코드가 그 코드이다.

이렇게 받아오기 위해서는 Config를 따로 설정도 해뒀어야했다.

이렇게 준비는 다 끝났다.
가장 큰 트러블 슈팅은 Key에 해당하는 Value의 값이 들어오지 않는 점이였다.

이메일 검증 로직을 거치게끔 해서 받은 인증번호와 입력한 인증번호가 같은지 판별하는 곳에서 문제가 생겼다. 에러 메세지를 보면 mailAuth의 값이 null이 찍히면서 NPE가 발생하였다.
처음에는 Redis가 제대로 연결이 되어있지 않은지 의심을 했고 그거부터 확인을 했었다.

Redis-cli에서 연결을 확인했지만 잘 연결이 되어있었고, 다른 문제를 생각한건 Key에 해당하는 Value값이 제대로 들어가있지 않은건 아닌가 의심했었다.

하지만 예상과 다르게 너무나 잘 들어와있는 모습이 보여서 더욱 더 멘탈이 흔들렸다.
문제점은 굉장히 쉬운 곳에서 로직 실수가 있었다.

분명 나는 Key 값을 loginId로 받아오기로 했었고 위 코드의 로그인 id는 aespa2인것을 확인할 수 있다. 하지만 지금 디버그를 하면서 찾은 loginId는 이메일이 들어오고 있었다.
어디가 잘못되었을까 확인하면서 Controller를 다시 확인하였다.

인증번호 확인하는 로직을 호출하는 곳에서 CheckAuthNum에서의 Key 값을 email로 받아오고 있었다. 그래서 value가 null로 계속 에러가 떴었던 것이다.

수정을 다시 하였고 실행을 시키면 원래 생각한대로 로직이 작동하는지 마무리 검증을 하면 된다.

Postman으로 이메일 인증을 요청하였고, 검증 로직을 타서 확인을 하면 끝난다.

로그인id와 이메일 인증번호를 입력하고 포스트맨을 실행시키면서 디버그를 확인해보면

value에 해당 값이 제대로 확인되는 것을 볼 수 있다. 그러면 이제 끝이다!!

엥???????
value값과 request로 입력받는 값의 형태가 다른지 확인을 해서 달라서 생기는 예외인지 확인할 필요가 생겼다

하지만 두 값은 String으로 타입이 같이 들어온다...
문제점은 정말 간단했다.

해당 로직에서 Redis에 저장된 인증번호와 입력한 인증번호가 다르면 예외를 던져야하지만
지금 로직은 같으면 예외를 던지는 로직을 타게 되어있어서 조건식에 !만 붙혀주면 해결되는 문제다.

인증은 성공되었으니 해당 이메일로 회원가입이 되는지도 확인해봐야한다.

회원가입에 성공하였고,

로그인도 문제없이 성공하였다!!
오늘로 깨달은 것은 디버깅이 정말정말 중요하고 디버깅으로 모든 문제를 찾을 수 있다...