스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션5. 스프링 MVC - 구조 이해
CS/김영한 스프링 강의

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 섹션5. 스프링 MVC - 구조 이해

지금까지 직접 만들었던 프레임워크는 사실 학습을 위해 일부러 스프링 MVC와 비슷하게 만들었다. 진짜 똑같이 생겼다.

여기서 헷갈린건 핸들러 핸들러 하지만 사실 핸들러는 컨트롤러라서 핸들러 어댑터는 컨트롤러를 돌려주는 거라고 보면 된다. 또 Front Controller에 해당하는 DispatcherServlet도 스프링에서 만들어진걸 그대로 사용해서 관련해서 작성한 코드가 없다.

요청이 온 url를 처리할 수 있는 핸들러가 있는지 핸들러 매핑해서 찾는다. 전에 url마다 컨트롤러 등록했던 것 처럼.

스프링에는 이것들이 bean에 등록되있는거에서 찾는다. 우선순위는 요새 대부분 쓰는 @RequestMapping이 붙어있는걸 찾고 다음 순위로 bean의 이름으로 찾는다. 물론 이거 외에도 더 있다.

 

핸들러 어댑터는 기존에는 직접 만들었지만 이젠 스프링껄 그냥 쓴다. 그래서 관련해서 작성한 코드가 한 줄도 없다. 만약 RequestMapping으로 핸들러로 등록했다면 스프링에 등록되어 있는 어댑터 목록에서 RequestMappingHandlerAdapter를 찾아 결국 RequestMapping 핸들러를 실행하는 것이고, BeanName으로 등록했다면 SimpleControllerHandleAdapter를 찾아 BeanName으로 등록한 핸들러를 실행하는 것이다. 핸들러를 찾는 방식은 각 핸들러 어댑터 안에서 요청 받은 핸들러가 자신이 다룰 수 있는 핸들러인지 instanceof를 사용하여 for문으로 돌렸었는데, 실제 내부적으로도 그렇게 찾는다.

그렇게 핸들러를 돌았다면 이제 이 핸들러가 내가 작성한 컨트롤러를 실행할 것이다. 위 그림을 보면 내 컨트롤러가 ModelAndView를 반환한다고 되어있다.

 

말 그대로 ModelAndView를 반환한다. 만약 받아야 할 query가 있다면 getParameter로 받아오고, 전해줘야 할 게 있다면 내 레퍼지토리든 해서 찾아와 앞에서 배운 이론대로 Model에 추가해서 넣는다(V1은 참고용으로 넣었음).

근데 ModelAndView에서 또 viewResolver를 처리해야 하는데, 이것도 스프링의 것을 활용할거라서 설정을 건드리는 개념으로 간다. 그 전에 직접 만든 프레임워크를 보면

 

직접 만든 viewResolver같은 경우도 결국 어떤 파일을 html로써 읽어야 하는지 해당 파일 경로를 알려줌으로써 Servlet의 getRequestDispatcher가 해당 경로로 파일을 읽어와 request, response를 통해 필요한 정보를 가져올 뿐이었다.

 

이걸 이미 ModelAndView에 addObject로 필요한 정보를 추가했으니, ModelAndView의 이름으로 해당 파일 경로를 지정하기만 하면 된다. 여기서 설정을 건드린다는 것이다.

ViewResolver로 어떤 파일의 경로를 뷰로써 가져올지 판단해서 View를 가져오고, 가져왔다면 그 View를 실행하는 함수에서 Servlet의 request, response로 뷰에 데이터를 전달하며 띄워준다. 이게 끝이다.

 

 

사실 나도 쓰면서 머리가 뒤죽박죽이었는데 좀 정리된 느낌이다.

저 방식이 java에 어노테이션이 없었을 때의 Bean 이름으로 가져온 것이고, 이젠 어노테이션이 생겨 거의 99.9% 어노테이션 방식을 사용한다고 한다.

 

스프링 MVC를 활용하여 만든 V1으로 개선한 버전의 경우, Controller를 상속하는 대신에 @Controller를 사용한다. @Controller 안에는 @Component가 있어서 자동으로 Bean에 등록되어 핸들링 목록에 추가된다. 그래서 사용할 수 있고, 해당 컨트롤러를 다루는 컨트롤러 핸들러도 이미 스프링 내에 있다.

 

v2로 개선한 버전은 저 requestmapping들이 메소드에 붙을 수 있다는 것에 착안해 그냥 하나의 클래스 안에 넣는 것이다.

 

클래스로 공통 url 지정 가능

 

더 개선한 v3버전은 ModelAndView대신 string만 넣어도 알아서 뷰에 매칭해준다. 또 요청 GET, POST에 따라서 정해주는 것도 가능.

 

파라미터 값 일일이 getParameter할 필요 없이 바로 가능하다. 데이터 전달하려면 냅다 Model 사용해도 됨.