<!doctype html><html lang="ko"><head><title>HTTP 상태 500 – 내부 서버 오류
...
</title>HTTP 상태 500 – 내부 서버 오류</h1>
<hr class="line" ><p><b>타입</b> 예외 보고</p><p><b>메시지</b>
Cannot invoke "org.scoula.security.util.JwtProcessor.generateToken(String)"
because "this.jwtProcessor" is null</p>
<p><b>설명</b> 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다.</p>
<p><b>예외</b></p><pre>java.lang.NullPointerException: Cannot invoke "org.scoula.security.util.JwtProcessor.generateToken(String)" because "this.jwtProcessor" is null
...
이 오류는 LoginSuccessHandler 클래스에서 JwtProcessor 객체가 null 상태이기 때문에 발생한 NullPointerException 오류. JwtProcessor 객체를 사용하려고 시도했지만 초기화되지 않았거나 의존성 주 제대로 이루어지지 않았을 때 발생할 수 있습니다.
package org.scoula.security.handler;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;
import org.scoula.security.account.domain.CustomUser;
import org.scoula.security.account.dto.AuthResultDTO;
import org.scoula.security.account.dto.UserInfoDTO;
import org.scoula.security.util.JsonResponse;
import org.scoula.security.util.JwtProcessor;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Log4j
@Component
@RequiredArgsConstructor
public class LoginSuccessHandler implements AuthenticationSuccessHandler {
private final JwtProcessor jwtProcessor;
private AuthResultDTO makeAuthResult(CustomUser user) {
String username = user.getUsername();
// 토큰 생성
String token = jwtProcessor.generateToken(username);
// 토큰 + 사용자 기본 정보 (사용자명, ...)를 묶어서 AuthResultDTO 구성
return new AuthResultDTO(token, UserInfoDTO.of(user.getMember()));
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
// 인증 결과 Principal
CustomUser user = (CustomUser) authentication.getPrincipal();
// 인증 성공 결과를 JSON으로 직접 응답
AuthResultDTO result = makeAuthResult(user);
JsonResponse.send(response, result);
}
}
주요 변경 사항:
JwtProcessor 필드를 final로 선언하였습니다. 이렇게 하면 @RequiredArgsConstructor 어노테이션에 의해 JwtProcessor 필드에 대한 생성자가 자동으로 생성되고, Spring이 이 필드를 자동으로 주입하게 됩니다.
LoginSuccessHandler 클래스에서 JwtProcessor가 제대로 주입될 수 있게 되었기 때문에, NullPointerException 문제를 해결할 수 있었습니다.