[해석] Developing a Spring Framework MVC application step-by-step Chapter 2. Developing and Configuring the Views and the Controller

http://web.archive.org/web/20161120010625/http://docs.spring.io/docs/Spring-MVC-step-by-step/part2.html

Chapter 2. Developing and Configuring the Views and the Controller.pdf


2장. 뷰와 컨트롤러 개발

[todo] 이 부분 빠졌음.

2.1. JSTL과 JSP 헤더 파일 작성

JSTL 관련 라이브러리인 jstl.jar, standard.jar를 WEB-INF/lib/에 복사한다.

앞으로 작성할 모든 JSP에 포함될 헤더파일을 작성한다.
헤더파일을 include해서 모든 JSP 파일에 동일한 구문을 간단하게 넣을수 있다.
모든 JSP 파일을 WEB-INF/jsp/에 넣는다.
URL을 통해서 직접 접근하지 못하고 컨트롤러를 통해서만 뷰에 접근 가능하도록 한다.
이 방법은 어떤 어플리케이션 서버에서는 작동하지 않을지도 모르는데 이 경우 jsp/를 위로 올린다.

우선 모든 JSP에 포함될 헤더파일을 만든다.
'springapp/war/WEB-INF/jsp/include.jsp':

헤더파일을 사용하도록 index.jsp를 수정하면 JSTL을 사용할 수 있으므로 Front Controller로 리다이렉트하는 <c:redirect/> 태그를 사용한다.
이것은 index.jsp에 대한 모든 요청을 어플리케이션 프레임워크로 통하도록 수정한다.
'springapp/war/index.jsp':

hello.jsp를 WEB-INF/jsp/로 옮기고 index.jsp와 동일한 directive를 추가한다.
model에서 가져와서 뷰에 전달된 현재 일자와 시간을 JSTL <c:out/> 태그를 사용하여 출력한다.
'springapp/war/WEB-INF/jsp/hello.jsp':

2.2. Controller 개선

Controller에서 JSP의 위치를 수정하기 전에 단위테스트부터 수정한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정해야 하고 모델에 now라는 키로 객체를 전달해야 한다.
'springapp/tests/HelloControllerTests.java':

이 상태에서 테스트를 실행하면 당연히 실패한다.
뷰에 대한 경로를 WEB-INF/jsp/hello.jsp로 수정하고 모델에 현재 일자와 시간에 대한 값을 now라는 문자열 키로 담는다.
'springapp/src/springapp/web/HelloController.java'
:

Controller는 springapp-servlet.xml에 이미 설정되어 있기 때문에 수정한 코드를 빌드하고 배포하는데 문제없다.
브라우저에 http://localhost:8080/springapp/를 치면 index.jsp를 호출하고 hello.htm으로 전달된다. 이것은 DispatcherServlet에 의해서 처리된뒤, 페이지 컨트롤러에서 모델에 날짜와 시간을 담고 hello.jsp에서 사용된다.

2.3. Controller에서 View 분리하기

현재 컨트롤러는 뷰에 대한 전체 경로를 명시하고 있는데 이것은 컨트롤러와 뷰 사이에 불필요한 종속성을 만들고 있다.
뷰에 대해 논리적인 이름을 매핑하면 컨트롤러를 수정하지 않고 뷰를 교체할수 있다
ResourceBundleViewResolver나 SimpleUrlHandlerMapping을 사용하면 프로퍼티파일에 이러한 매핑을 설정할수 있다
InternalResourceViewResolver에서는 뷰에 대한 매핑을 접두어, 접미어를 이용해서 간단하게 설정할수 있다
여기서는 두번째 방법으로 구현한다
springapp-servlet.xml에 viewResolver 엔트리를 추가한다.
JstlView를 설정하면 국제화를 지원하는 메세지 리소스 번들를 JSTL과 같이 사용할수 있다.
'springapp/war/WEB-INF/springapp-servlet.xml':

컨트롤러에서 뷰 이름을 수정하고 HelloControllerTests를 실행하면 실패할 것이다.
'springapp/test/springapp/web/HelloControllerTests.java':

컨트롤러에서 사용한 뷰이름에서 접두어와 접미어를 제거하면 컨트롤러는  hello라는  논리적인 이름으로 뷰를 참조하게 된다
이제는 테스트를 통과하게 되고 컴파일해서 배포해서 어플리케이션이 동작하는지 확인한다

2.4. 요약
 
2장에서 작성한 것을 살펴보면
우리가 사용할 JSP페이지에서 사용할 태그 라이브러리 디렉티브를 담고 있는 Include.jsp 헤더 파일을 작성했다.

여기에서 변경한 것은
컨트롤러가 뷰를 참조할때 하드코딩된 이름이 아닌 논리적인 이름으로 참조하도록 HelloControllerTests를 수정하였고
HelloController는 springapp-servlet.xml에 정의된 InternalResourceViewResolver를 사용한 논리적인 이름을 참조한다.

아래는 이런 작업을 한뒤의 프로젝트 디렉토리 구조 스크린샷이다.