우선 아래 글을 보고 스프링 MVC 구조를 참고했다.
🔗 Spring MVC Framework란 무엇인가?
그보다 한참 기초적인 MVC 구조는 아래 영상에 잘 나와있다.
📺 MVC Explained in 4 Minutes
이번 글은 소스코드와 위키독스 설명만 보고 구글링해서 연결점을 찾아가는 방식으로 정리했다. 효율면에서 별로 좋은 방법은 아니었다... 그냥 책을 보는 게 낫다.
아무튼 Book Create 기능만 이해해보기로 한다.
클라이언트의 요청을 받아 응답을 만들어내는 컨트롤러 클래스 BookController를 만든다.
경로: src/main/java/sample/spring/yse/BookController.java
코드 내용
@RequestMapping
GET방식으로/create
요청을 받으면(주소가 입력되면) create() 메소드가 실행되도록 한다.
create()
매개변수(view name)를book/create
로 넣은 새 ModelAndView 객체를 생성해 반환한다.
jsp파일 경로를 book/create.jsp
로 지정하고 보여줄 뷰(입력화면)를 작성한다.
경로: src/main/webapp/WEB-INF/views/book/create.jsp
위 파일 2개 작성이 완료되면 http://localhost:8080/create
에 책 생성(입력) 화면이 뜨는 것을 볼 수 있다.
작동하는 모습을 보면서 드는 의문들이 있다.
매개변수를 book/create
라고만 넣었는데 어떻게 이 화면을 찰떡같이 알고 보여주는 걸까? 컨트롤러와 뷰가 같은 폴더에 있는 것도 아닌데.
src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml 파일에는 다음과 같은 코드가 있다.
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
위 코드는 view name에 기본값으로 prefix(접두어)와 suffix(접미어)를 덧붙인 경로를 찾도록 한다. 즉 prefix
+ view name + suffix
의 경로를 가진 리소스를 찾도록 한다 - 실제 들어오는 요청 주소와 내부에서 실제로 찾아가는 주소가 다르다. 이는 InternalResourceViewResolver 클래스를 통해 구현된다.
참고 🔗 InternalResourceViewResolver
우선 ModelAndView 객체란 Model과 View가 Wrapping된 객체다. 컨트롤러는 요청을 받아 필요한 데이터를 Model에 저장하고, 보여줄 View Name을 지정한 뒤, 이 둘을 감싸는 ModelAndView 객체를 만들어 반환한다. ModelAndView 객체는 book/create
을 viewName
또는 View
매개변수로 받는다.
아래는 실제 ModelAndView 코드.
public ModelAndView(String viewName) {
this.view = viewName;
}
그래서 book/create이 어떻게 create.jsp로 연결된다고? 어떻게 연결되냐면, ViewResolver가 연결해준다. ViewResolver는 말 그대로 view를 처리해주는 인터페이스로, ViewResolver를 implements(구현)하여 resolveViewName(viewName, locale)
메소드를 사용할 수 있다. 이 메소드는 주어진 뷰 이름을 받아 해당 이름을 가진 뷰 객체를 반환한다. 즉 ViewResolver는 book/create
를 이름으로 받아서, 실제로는 /WEB-INF/views/book/create.jsp
경로를 찾아 해당 객체를 반환하는 것이다.
그럼 ViewResolver는 어디에 있느냐? 특정 ViewResolver를 설정하지 않으면 위에서 봤던 servlet-context.xml파일의 InternalResourceViewResolver 클래스를 사용하게 된다. 해당 리졸버는 jsp페이지를 뷰로 사용할 때 쓰인다. 이 InternalResourceViewResolver가 바로 ViewResolver 인터페이스를 구현하고 있는 것이다.
그래서 뷰를 실제로 어떻게 화면에 띄우나도 궁금하지만 다음으로 넘어가야 하니까 여기까지만 이해하고 가기로 한다.