-
Spring Web MVCBack-end Developer/Server, Spring 2021. 4. 7. 18:46
MVC는 다들 아실 텐데... Spring MVC는 뭘까요?
MVC 패턴을 모르신다면, 검색해서 간략히 알아보시길 바랍니다
단순히 생각해보면 Spring 에서 MVC 패턴 구성을 위해 지원하는 기능들이라 볼 수 있겠습니다.
Spring MVC는 Dispatcher Servlet이 중심이 되어 구성됩니다.
두 용어의 정의를 알아보고 실제 구성은 어떻게 되고 어떻게 동작하는지 알아보도록 하죠.
Spring MVC
'Model-View-Controller'의 약자로 기본 시스템 모듈을 MVC로 나누어 구현 및 처리
Dispatcher Servlet을 중심으로 구성되어 있으며 사용자로부터 들어오는 요청을 핸들러에 매핑하고, 뷰로 반환하는 등의 작업을 지원
Dispatcher Servlet
Servlet Container에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일 앞에 둬서 중앙집중식으로 처리해주는 프런트 컨트롤러(Front Controller)
Dispatcher Servlet을 중심으로 구성된 Spring Web MVC는 아래와 같습니다.
요청 -> 응답은 아래와 같은 방식으로 이루어집니다.
- 요청
- Dispatcher Servlet에서 HandlerMapping을 통해 해당 요청에 맞는 핸들러를 찾음
- 찾은 핸들러를 HandlerAdapter를 통해 실행 후 Controller에서 처리
- Controller에선 Service에서 로직을 처리하며 필요한 데이터는 Repository를 통해 접근
- 결과로 반환된 View를 Dispatcher Servlet을 통해 View Resolver로 전달
- View Resolver는 jsp 정보를 찾은 후 View로 렌더링
- 응답
흠.. MVC 관련해선 위의 흐름도가 중요하기 때문에 더 할 이야기는 없을 것 같네요.
추가로 관련된 이야기를 해보자면,
그림을 통해서 확인할 수 있는 내용은 Controller, Service, Repository는 직접 구현해야 한다는 점입니다.
대부분 Bean을 주입받아 사용하는 방식이기에 크게 다를 건 없습니다.
그러나, Controller를 사용하는지 RestController를 사용하는지에 따라 방법이 조금 다릅니다.
Controller VS RestController
우선 역할에 있어 두 방식은 차이를 갖습니다.
Controller - 모델 객체의 Map 생성, view를 찾는 역할
RestController - 단순히 객체를 리턴하며, 해당 객체 데이터는 Json 또는 XML 방식의 HTTP 응답으로 바로 사용됨
HTTP Response Body가 생성되는 방식이 다르다고 표현합니다.
코드를 보면 확연한 차이를 구분할 수 있습니다.
Controller.java
@Controller @ResponseBody public class Controller { }
RestController.java
@RestController public class RestController { }
RestController는 Controller와 다르게 기본적으로 객체(데이터)를 반환합니다.
물론 Controller로 객체를 반환할 땐 위와 같이 ResponseBody를 붙여주고 사용할 수 있습니다.
이러한 경우 위에 MVC 동작 흐름에서 view가 아닌 Data를 바로 Json, XML 형식으로 응답하겠죠.
어찌 되었든 Spring Web MVC는 위의 동작 흐름과 각 역할만 잘 알고 계시면 충분하다 생각합니다.
알아서 뭐하냐 싶을 순 있겠지만, 에러가 났을 때 흐름을 대강 파악하고 있는 경우 훨씬 편하더라고요.물론 이런 것도 하나의 기본기라 생각하고 알기 위해 노력하고 있습니다만 ㅎㅎ
간단한 내용이지만 굳이 정리한 이유는.. 막상 설명하려니 추상적인 느낌이 많아서 명확하게 하기 위해 정리했습니다.
공부하다 함께 이야기할만한 내용이 있다면 추가하도록 하겠습니다.
참고 자료
반응형'Back-end Developer > Server, Spring' 카테고리의 다른 글
MSA (0) 2021.03.24 RestTemplate & URLConnection (0) 2020.10.30 RPC (Remote Procedure Call) (0) 2020.10.29 REST API (2) (0) 2020.07.19 REST API (1) (0) 2020.07.17