2021-03-27-TIL

study-whiteship

활용하는 문법 vs 라이브러리를 이해하기 위한 문법

컴파일 타임에 무엇이 어떻게 동작하는지 알수는 없다. 그러면 이제 런타임으로 넘어가는데 거기에서 리플렉션과 어노테이션을 모르면 이해를 할 수가 없다.

  • 인터페이스의 상속 부분을 그림으로 그리기
  • 리플렉션 디버깅해보기, 스프링 까보기
  • 콜렉션 프레임워크 까보기

Spring Bean에서 현재의 url을 그대로 가져오기

private Question findQuestionWithSession(Long id, HttpSession session) {
    User sessionedUser = HttpSessionUtils.getUserFromSession(session);
    Question question = questionService.findQuestionById(id);

    if (!question.isSameWriter(sessionedUser)) {
    		throw new IllegalUserAccessException();
    }
    return question;
}

IllegalUserAccessException이 발생했을 때 아래와 같이 "/user/login" 페이지로 포워딩하는 작업만 수행하고 있다. 하지만 경우에 따라서 해당 페이지로 다시 포워딩하는게 훨씬 자연스러운 경우가 많다. 그렇다면 현재 url로 포워딩하도록 하는 방법이 없을까?

@ControllerAdvice
public class GlobalControllerExceptionHandler {
    ...
    @ExceptionHandler(IllegalUserAccessException.class)
    private String handleIllegalUserAccessException(Model model, IllegalUserAccessException e) {
        model.addAttribute("errorMessage", e.getMessage());
        return "/user/login";
    }
}

첫번째 방법 - 예외 사항 별 구별하기

예외 사항 별 문자열 상수(혹은 번호)를 만들어 놓고 구별하는 것이다. 예를 들어, 똑같은 IllegalUserAccessException라도 해당 예외 안에 상수 필드를 두고 예외 메시지를 통해서 구별하는 것이다.

public class IllegalUserAccessException extends RuntimeException {
		public static final String ILLEGAL_QUESTION_ACCESS = "Cannot access other user's question.";
  
    public IllegalUserAccessException() {
        super("Cannot access other user's information.");
    }
  
    public IllegalUserAccessException(String message) {
        super(message);
    }
}

Spring Boot Exception Handling

  • https://reflectoring.io/spring-boot-exception-handling/
  • https://www.toptal.com/java/spring-boot-rest-api-error-handling

Difference between Forward and Redirect

  • https://stackoverflow.com/questions/28697681/spring-mvc-controller-what-is-the-difference-between-return-forward-return#:~:text=Forward%3A%20is%20faster%2C%20the%20client,request%20to%20the%20redirected%20URL.