ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] @MVC와 DispatcherServlet에 대해서
    Server/Spring MVC 2020. 7. 25. 01:45
    728x90
    반응형

    DispatcherServlet란?

    스프링 MVC는 DispatcherServlet의 등장으로 web.xml의 역할이 엄청나게 축소되었다. 예전에는 서블릿을 URL로 활용하기 위해서는 반드시 web.xml에 등록하여 사용했지만 이제는 DispatcherServlet이 해당 어플리케이션으로 들어오는 요청을 모두 핸들링해준다.

     

    출처 : https://galid1.tistory.com/525

    기존 방식은 요청 URL당 Serlvet을 생성하고 그에맞는 Controller에게 맵핑이 되어 요청을 보내주는 코드를 하나하나 작성해야 했다.

     

    출처 : https://galid1.tistory.com/525

    DispatcherServlet은 하나의 Servlet에서 모든 요청을 받아들여 그에 맞는 Controller로 보내주는 역할을 한다.

    그리고 @MVC에서 DispatcherServlet가 담당하는 역할이 무엇인지 정리해보자.

     

    출처 : http://egloos.zum.com/springmvc/v/504151

    클라이언트가 해당 어플리케이션에 접근하면 접근한 URL 요청을 DispatcherServlet이 가로챈다. 

     

    ② 가로챈 정보를 HandlerMapping에 보내 해당 요청을 처리할 수 있는 Controller를 찾아 보내준다.

     

    컨트롤러를 해당 요청을 처리한 후에 보통 컨트롤러는 요청을 응답받을 View의 이름을 리턴하게 된다

     

     

    그리고 @Controller@RestController의 차이가 무엇인지 정리하고 글을 이어나가려 한다. 

     

     

    1. @Controller란?

    출처 : https://mangkyu.tistory.com/49

     @Controller는 위에서 DispatcherServlet을 설명한 방식과 같다. 다만 요청을 응답받을 View의 이름을 리턴하게 된다는 점을 기억하자. (내부적으로 ViewResolver가 존재하기 때문이다) 추가로 Controller로 View의 이름이 아닌 Data를 return 할 수도 있다.

     

    출처 : https://mangkyu.tistory.com/49

    @ResponseBody 어노테이션을 이용해서 하면 json, XML 형태로 return을 할 수 있다.

     

     

     

    2. @RestController란?

    출처 : https://mangkyu.tistory.com/49

    @RestController는 @Controller에 @ResponseBody가 추가된 것이다. RestController는 ResponseBody가 추가되어 있는 형태이기 때문에 return을 json, XML 형태로 하게 된다. 최근에는 프론트와 백엔드를 나누어 REST API 형식을 가지고  json으로 데이터만 전달하기 때문에 편리성을 위해 Controller를 보완한 형태인 RestController가 등장하게 되었다.

     

     

    @ResponseBody 이해하기

    메소드에 @ResponseBody 로 어노테이션이 되어 있다면 메소드에서 리턴되는 값은 View 를 통해서 출력되지 않고 HTTP Response Body 에 직접 쓰여지게 된다. 이때 쓰여지기 전에 리턴되는 데이터 타입에 따라 MessageConverter 에서 변환이 이뤄진 후 쓰여지게 된다. 

     

    예제

    @RestController
    public class TestController {
    
        @GetMapping("test")
        public User user() {
            User user = new User("lee", "server");
            return user;
        }
    }
    {
        "name": "lee",
        "part": "server"
    }

    Jackson2ObjectMapperBuilder 는 스프링부트에서 JacksonAutoConfiguration 클래스에서 자동으로 설정하기 때문에 별다른 설정없이 JSON을 자바 객체로변환하는 ObjectMapper를 사용할 수 있다.

    Jackson2ObjectMapperBuilder 내부 보면 autoDetectGettersSetters() 라는 메서드를 사용한다. 즉, JSON 타입으로 변환하기 위한 객체(DTO)에 getter 와 setter 메서드가 존재해야 하다는 뜻이다. (위의 예제에서는 User 클래스에 getter, setter가 존재해야 한다)

     

    스프링부트의 pom.xml 을 보면 spring-boot-starter-web 이 존재하는데 내부에 들어가보면 jackson-databind 의존성이 자동으로 잡혀있는 것을 볼 수 있다. 해당 의존성이 있어야 JSON 타입으로 제대로 변환이 된다.

     

    MessageConverter 의 종류

    - StringHttpMessageConverter

    - FormHttpMessageConverter

    - ByteArrayMessageConverter

    - MarshallingHttpMessageConverter

    - MappingJacksonHttpMessageConverter Jackson's ObjectMappter 를 사용하여 request, response 를 JSON 으로 변환할때 사용되는 MessageConverter 이다.

    - applicaton/json 을 지원한다.

    - SourceHttpMessageConverter

    - BufferedImagedHttpMessageConverter

     

     

    Reference

    https://medium.com/webeveloper/reqeustbody%EC%99%80-responsebody-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-2efcab364edb

    https://ismydream.tistory.com/140

    http://egloos.zum.com/springmvc/v/504151

    https://galid1.tistory.com/525

    https://mangkyu.tistory.com/18

    https://mangkyu.tistory.com/49

    반응형

    댓글

Designed by Tistory.