ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메소드 오버라이딩시 super 키워드 조심하기
    개발 일지 2024. 8. 16. 03:03

    스프링 시큐리티에서 form 인증 방식의 로그인 구현을 공부하다가

    로그인이 성공적으로 이루어졌을 때 successHandler에 SimpleUrlAuthenticationSuccessHandler를 상속받는 CustomAuthenticationSuccessHandler를 만들었다.

     

    이 후에 로그인이 성공하면 /home 경로로 리다이렉트 될 수 있게 구현을 해놨지만, 정확하게 되지 않았다.

    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
    
    public class CustomAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
           super.onAuthenticationSuccess(request, response, authentication);
           System.out.println("authentication = " + authentication);
           response.sendRedirect("/home");
        }
    }

     

    로그인 성공시 시스템 로그로 찍히는 것은 확인했지만, `Cannot call sendRedirect() after the response has been committed`에러를 만나게 된다.

     

    "분명 내가 잘못쓰고 있다." 라는 생각이 들어서 하나씩 찾아보니 아래의 코드 때문에 문제가 발생했었다.

    super.onAuthenticationSuccess(request, response, authentication);

     

    분명 자바를 공부했음에도 불구하고, 순간 저 코드가 의미하는 바를 이해하지 못했다.

     

    일단 super 키워드는 부모 클래스의 메소드나 변수를 호출할 때 사용하는 키워드이다. 그리고 오버라이딩된 메소드 내에서 super를 사용하면 자식 클래스에서 새로 정의한 메소드가 아닌 부모 클래스에서 정의된 원래의 메소드를 호출하게 된다.

     

    지금까지 내가 작성한 코드를 다시 분석하자면

    결국 나는 로그인이 성공한 뒤에 부모 클래스에 정의된  `onAuthenticationSuccess` 메소드를 호출하고 있었다.

     

    그래서 해당 구문을 삭제하니 정상적으로 잘 동작하였다.

     

    오버라이딩되고 나서 부모 클래스에서 정의된 메소드의 동작을 완전히 덮고자할 때는 super 키워드가 담긴 구문을 삭제하는 것이 좋다.

     

Designed by Tistory.