티스토리 뷰

오늘은 @Controller 와 @RestController 에 대해 알아보려고 한다. 이전에 공부했던 내용이고 매일 Controller 와 RestController를 사용하고 있기 때문에 

정확히 알고 있다고 생각했다. 그러나 오늘 접한 오류때문에 아직은 정확히 알지 못한다고 생각하여 간단히 정리 해보려고 한다.


일단 오늘 접한 오류는 no suitable HttpMessageConverter found for response type 라는 오류 메세지였다. 원인은 Ajax를 통해 Response Type을 

JSON포맷으로 넘기려 했지만, 실제로는 text/html 형식으로 넘겼기 때문에 발생했었던 오류였다. 분명 @RestController 덕분에, JSON 형식으로 

Response가 응답되었을 텐데 위와 같은 오류가 발생해서 혼란스러웠다. 그리고 디버깅을 통해 오류 발생의 원인을 파악할 수 있었다.


프로그램에서 Controller와 RestControlelr에서 예외가 발생했을 때 처리를 위해 @ControllerAdvice와 @RestControllerAdvice 를 각 각 구현했다.

아래에서는 ControllerAdvice 의 코드 일부분이다. RestController 에서 예외가 발생했을 때, RestControllerAdivice가 아닌 아래의 ControllerAdvice의 핸들러가

처리가 되었다. 이유는 두가지 이다.


 1) 예외 상위 클래스인 Exception.class 에 대한 처리가 정의되었기 때문에 우선적으로 Exception 에 대한 핸들러가 호출된 것이다.

 2) @RestControllerAdvice =  @ControllerAdvice + @ResponseBody 이다. 완전히 개별적인 것이 아닌, @ResponseBody가 설정된 @ControllerAdvice 이다.

 

        
@ControllerAdvice(annotations = Controller.class)
public class SecurityControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(SecurityControllerAdvice.class);

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = HttpStatus.FORBIDDEN)
    public String emptyResultData() {
        return "/exception";
    }
}


Controller 다시 공부하면서, MVC 패턴이 동작하는 순서를 간단하게 정리를 해보려고 한다. 아래 그림을 보면 전반적인 동작원리를 쉽게 파악할 수 있다




1. Client는 URL 주소를 통해 Server 에 요청을 한다. 

2. Client의 요청을 Dispatcher Servlet이 전달받아 Handler Mapping에게 Client의 요청을 처리할 수 있는 Controller를 전달받는다.

   Dispatcher Servlet은 요청받은 URL, HTTP METHOD, Return, parameter 정보를 이용해서 적합한 Controller를 찾는 방식이다. 

   실제로 결정하는 것은 Dispatcher Servlet이고, Handler Mapping 은 컨트롤러에 대한 정보를 갖고 있는 인터페이스이다. 만약, 적절한 컨트롤러를 찾지 

   못했다면,  HandlerExceptionResolver에 의해 예외처리가 된다.

3 ~ 5. Controller가 결정되면 Controller는 로직을 처리하고, 필요하다면 Database에 접근을 하여 데이터를 처리한다.

6. Dispatcher Servlet은 Controller의 결과를 출력할 화면(View)를 검색하는데, 이 화면은 실제로 클라이언트에게 출력할 화면이다.

7. 해당 화면을 클라이언트에게 전달한다.


위에는 Controller를 통해 처리하는 방식이고, RestController를 통해 데이터를 처리하는 방식은 사뭇 다르다.

Controller는 화면을 반환하고, RestController는 데이터(XML, JSON ..)를 반환한다. 그렇기 때문에 RestController 경우는 아래와 같이 동작한다.

 → Client → Dispatcher Servlet → Handler Mapping → Controller → via ResponseBody (JSON, XML) → Client 순서로 동작한다.

Controller와의 차이는 ViewResolver를 통해 View를 검색하는 부분이 생략되고 단지 데이터를 전달했다는 것이다.


마지막으로 요약하자면,

 RestController(Data 전달이 목적) = Controller(화면전달이 목적) + ResponseBody(Object ↔ JSON, XML)


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함