sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
extra_vars6 |
http://blog.empas.com/ahnyounghoe/13186543

이젠 article-servlet.xml 파일을 작성할 차례군요. 먼저 WEB-INF 폴더에 article-servlet.xml 라는 이름으로 파일을 하나 생성합니다. xml 이기 때문에 Schema나 DTD 정의가 필요하죠. 아래 틀을 사용합니다.
Web Application Context 파일에 정의되는 객체의 주요 유형은 다음과 같습니다.
Handler Mappings는 브라우저에서 서버로 오는 요청의 URL에 따라 어떤 객체가 호출되어야 하는지를 알려주는 객체입니다. 아무 설정도 하지 않으면 객체 정의(bean)할 때 이름(name 속성)으로 요청 url을 사용할 때 쓰는 BeanNameUrlHandlerMapping가 쓰입니다.
View Resoler는 view(화면)의 이름을 실제 파일 이름으로 변경해주는 해석기 역할을 합니다. Spring MVC는 jsp 이외에도 Velocity나 FreeMarker 등을 기본 지원하고 그 외에의 화면을 사용할 수 있게 하기 위해서 view 이름을 파일 이름이 아닌 논리적 이름(변수명)으로 취급합니다.
jsp 파일을 WEB-INF/jsp 폴더에 넣기 위해서는 다음과 같은 설정이 필요합니다. 이렇게 하면 view의 이름 앞과 뒤에 각각 /WEB-INF/jsp/ 와 .jsp 가 붙는 효과가 나죠. 아래 설정을 위의 xml 파일에 넣어봅니다.
위에서 viewClass 프로퍼티로 JstlView를 설정했는데요. Jstl을 포함한 Jsp를 HTML 템플릿 기술로 쓸 때 적합한 클래스죠. Velocity나 FreeMarker를 쓰기 위해선 다른 클래스를 넣으면 되겠구나 짐작할 수 있죠. 결국 코드 수정을 최소화 하고 템플릿 기술을 바꿀 수 있단 것이죠.
하나 설명 안한 항목이 Handler죠. 요청 처리기인데요. Spring MVC는 기본적으로 다양한 Controller를 제공합니다.

자세한 것은 Spring MVC컨트롤러 탐험기 안내 를 참조하세요.
Handler는 이들 Controller의 메소드를 의미합니다. 그러나, 객체는 클래스 단위로 등록되기 때문에 Controller를 등록하시는거죠. 아무튼 요청을 처리하는 녀석은 Controller / Handler라고 한다는 것을 기억하세요.
index.do 요청에 대해서 404 에러가 나지 않도록 처리기와 화면(view)를 만들어보죠. 먼저 view부터 해보겠습니다. WEB-INF 폴더 밑에 jsp 폴더를 먼저 만듭니다. 그 아래 index.jsp 파일을 새로 만듭니다. index.jsp 파일에는 아무런 내용이나 입력합니다. 저는 ok라고만 넣었습니다. 404 에러 대신 보여질 것을 넣는 것이죠.
이젠 view는 만들어 두었고, Handler/Controller 설정을 해야 하는데.. 앞으로 이들을 싸잡아서 처리기 혹은 요청 처리기라고 부르겠습니다. 단순히 특정 view(앞으로 화면이라고 하겠습니다.) 이름을 반환하는 처리기를 정의해보죠. Spring MVC가 제공하는 ParameterizableViewController 타입을 쓰면 됩니다.
이제 index.do 요청이 발생하면 ParameterizableViewController 객체에게 요청이 넘겨지고, 이 녀석은 화면 이름으로 index를 반환합니다. 그러면, 다시 Spring MVC의 Front Controller에선 결과 화면으로 해당 화면 이름을 가진 실제 페이지를 찾아서(View Resolver를 통해) 보여주는 것이죠.
404를 알리는 페이지가 브라우저에 떠 있는 상태라면 서버를 다시 실행합니다. (브라우저를 닫으신 분들은 Run As > Run on Server를 수행하세요.)

Servers 뷰에서 좌측에 돌아가는 화살표 아이콘을 눌러 서버를 재구동하면 됩니다. 저와 동일하게 하셨다면, 다음과 같은 에러가 발생합니다.
StackTrace를 보면 JstlView가 JstlUtils을 사용하는데, JstlUtils가 사용하는 LocalizationContext를 찾지 못해서 발생하는 오류임을 알 수 있습니다. Classpath Helper 플러그인(JAR 의 의존성까지 체크해주는 이클립스 플러그인, Classpath Helper 참조)을 설치했다면 좀 더 쉽게 알 수 있죠.
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/fmt/LocalizationContext
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/fmt/LocalizationContext
at org.springframework.web.servlet.support.JstlUtils.exposeLocalizationContext(JstlUtils.java:83)
at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:82)
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/fmt/LocalizationContext
at org.springframework.web.servlet.support.JstlUtils.exposeLocalizationContext(JstlUtils.java:83)
at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:82)
...
spring 라이브러리 zip 파일(with dependencies 다운 로드시)의 lib/j2ee에 들어 있는 jstl.jar 파일을 WEB-INF/lib로 드래그앤드롭합니다. 서버를 재시작하고 브라우저에서 F5키를 누르면 ok가 보이겠죠.