Troubleshooting: 무엇이 문제였는가?/본캠프 6주 차: 플러스 프로젝트

10단계: Null이 아니라 널 보고 싶어요, 이메일 씨

writingforever162 2025. 1. 20. 14:02

[문제]

스프링 시큐리티(Spring Security)를 적용한 뒤 일정을 생성할 때마다 email 값이 null로 나왔다. 데이터베이스(database)에는 잘 저장되어 이후에 일정을 조회할 때는 email 값이 잘 나왔기 때문에 이메일 값이 들어가는 AuthUserDto를 확인했다. 그 결과 email 값이 null이 되었다는 점을 확인했고, 'AuthUserDto를 생성하는 부분에서 이메일 값을 빠뜨렸나?' 추측했다.

 

[원인]

우선 'new AuthUserDto'로 새로운 AuthUserDto를 생성하는 AuthUserArgumentResolver에서 로그를 찍었다. 그 결과 SpringContext에 인증 정보를 설정할 때, 또는 그 전에 인증 객체를 생성할 때부터 email 값이 빠졌다고 추측할 수 있었고, 아래의 코드를 참고하여 인증 객체를 생성하고 인증 정보를 설정하는 JwtFilter 클래스(class)를 점검했다.

var authentication = SecurityContextHolder.getContext().getAuthentication();

확인한 결과, 원인은 추측한 대로 인증 객체를 생성할 때 email 값을 null로 입력한 데에 있었다. 하얀빛 코드 사이로 뚜렷하게 보이는 오렌지빛 null 네 글자를 본 순간, 스프링 시큐리티를 처음 적용할 때 임의로 null 값을 넣었다는 사실을 뒤늦게 깨달았다. 

 

[해결] [깃허브 링크]

String email = claims.get("email", String.class);
Cannot resolve constructor 'UsernamePasswordAuthenticationToken(User, String, ?, Collection<GrantedAuthority>)'

 

문제가 발생한 원인을 찾아서 너무 기쁜 나머지 null 자리에 email 값을 후다닥 넣었다가 쉼표(,)를 빠뜨렸더니 '클래스 생성자(constructor)를 호출할 때 인자가 올바르지 않다'라는 오류 메시지가 떴다. 쉼표를 제대로 쓴 동시에 빨간 줄은 전부 사라졌다.

원인을 찾고 문제를 해결하고 나니 일정 관리 앱에 회원 가입할 때 입력한 이메일 값이 새로 생성된 AuthUserDto에 잘 들어갔다. 안도의 한숨이 절로 나왔다.