스프링 프레임워크 [Spring Framework] MVC 패턴중 VIEW 영역

반응형

View 영역 구현

컨트롤러는 최종적으로 결과를 출력 할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴시킨다.

DispatcherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성시킨다.

SPRING가 제공하는 ViewResolver, JSP, Tiles, Velocity와 같은 뷰 구현 기술을 SPRING에 적용시키는 것을 확인.

ViewResolver . SPRING 컨트롤러는 뷰에 의존적이지 않다.

컨트롤러는 결과를 생성할 뷰의 이름만 지정할 뿐이다.

EX )

@Controller

public class HelloController{

@RequsetMapping("hello.do")

public String hello(){

return "hello";

}

}

컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver이 구한다.

SPRING은 몇 가지 ViewResolver 구현 Class를 제공하고 있는데, 이중 주요 ViewResolver 구현 Class는 아래와 같다.

ViewResolver Interface

package org.springframework.web.servlet;  
  
import java.util.Locale;  
  
public interface ViewResolver{  
View resolveViewName(String viewName, Locale locale) throws Exception;  
}

ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며,Mapping되는 View객체를 리턴한다. 만약, Mapping되는 View객체가 존재하지 않으면 null을 리턴한다.

ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다. 모든 뷰 Class는 View Interface를 구현하고 있으며,View Interface는 다음과 같이 정의되어 있다.

package org.springframework.web.servlet;  
  
import java.util.Map;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public interface View{  
String RESPONSE_STATUS_ATTRIBUTE = View.clss.getName() + ".responseStatus";  
  
String getContentType();  
void render(Map<String,?> model, HttpServletRequest request) throws Exception;  
}

getContentType()메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다.render() 메서드는 실제로 응답 결과를 생성한다.
render()메서드의 첫 번째 파라미터인 model에는 컨트롤러가 리턴한 ModelAndView객체의 모델 데이터가 전달된다. 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는 데 필요한 정보를 구한다.

Message 출력을 위한 <spring:message> 커스텀 태그

SPRING은 MessageSource로 부터 Message를 가져와 출력해 주는 <spring:message>커스텀 태그를 제공하고 있다. <spring:message> 커스텀 태그는 다음과 같이 code 속성을 이용하여 읽어 올 Message의 Code를 지정한다.

Code에서 사용되는 Message를 포함하고 있는 Message ReSource 파일은 다음과 같이 각 Code 값에 해당하는 Message를 설정하고 있을 것이다.

login.form.title=Login Form  
login.form.type=Login Type  
login.form.id=ID  
login.form.password=Password  
login.form.submit=Login

Message ReSource 파일은 {n} 형식을 이용하여 변하는 부분을 명시할 수 있다.

greeting=\uc804 {0} \uc785\ub2c8\ub2e4. “{1}”

<spring:message> 커스텀 태그는 arguments 속성을 이용하여 {n}에 들어갈 값을 설정할 수 있다. 이 때, 각 값은 콤마를 이용하여 구분한다.
아래 Code는 arguments 태그의 사용 예를 보여 주고 있다.

<%@ taglib prefix="spring" uri="[http://www.springframework.org/tags"](http://www.springframework.org/tags%22) %>  
...  
<spring:message code="greeting" arguments="${me}, ${greeting}"/>

SPRING이 제공하는 폼 관련 커스텀 태그

SPRING의 장점 중 하나는 입력 폼 값을 커맨드 객체에 저장하는 기능을 제공한다는 것이다. SPRING은 또한 반대로 커맨드 객체의 값을 입력 폼에 출력해 주는 JSP 커스텀 태그를 제공하고 있어, 좀 더 쉽게 폼 관련 태그를 생성할 수 있도록 도와 준다. 이들 태그를 사용하려면 먼저 다음과 같이 커스텀 태그를 설정해 주어야 한다.

<%@ taglib prefix="form" uri="[http://www.springframework.org/tags/form"](http://www.springframework.org/tags/form%22) %>

<form> 태그를 위한 커스텀 태그 : <form:form>

<form:form> 커스텀 태그는 <form> 태그를 생성할 때 사용된다. <form:form>커스텀 태그를 사용하는 가장 간단한 방법은 다음과 같다.

<form:form commandName="login">  
<form:errors />  
<p>  
<label for="loginType"><spring:message code="login.form.type" /></label>  
<form:select path="loginType" items="${loginTypes}" />  
</p>  
...  
<p>  
<input type="submit" value="<spring:message code="login.form.submit" />">  
</p>  
</form:form>

<form:form>커스텀 태그는 method 속성과 action 속성을 표시하지 않으면 method 속성의 값은 "post"로 설정되고 action 속성의 값은 현재 요청 URL의 값이 설정된다.

<form id="command" action="/chap07/login/login.do" method="post">  
...  
</form>

생성된 태그의 id 속성은 입력 폼의 값을 지정하는 커맨드 객체의 이름이 할당된다.

만약, 커맨드 객체의 이름이 기본 값인 "command"가 아니라면 다음과 같이 commandName 속성에 커맨드 객체의 이름을 명시해 주어야 한다.

<form:form commandName="login">  
...  
</form:form>
<form:form>커스텀 태그는<form>태그와 관련하여 다음의 속성들을 추가적으로 제공하고 있다.action : 폼데이터를 전송할 URL을 입력 (HTML 태그 속성)enctype : 전송될 데이터의 인코딩 타입. HTML 태그 속성과 동일method : 전송 방식. HTML 태그 속성과 동일

<form:form>태그의 몸체에는 <input>태그나 <select> 태그와 같이 입력 폼을 출력하는데 필요한 HTML 태그를 입력할 수 있다. 이때, 입력한 값이 잘못되어 다시 값을 입력해야 하는 경우에는 다음과 같이 커맨드 객체의 값을 사용해서 이전에 입력한 값을 출력한다.

<form:form commandName="login">  
...  
<input type="text" name="id" value="${login.id}"/>  
...  
</form:form>

커맨드 객체의 값을 다시 입력 폼에 출력해 주어야 하는 경우에는 <form:input>이나 <form:checkbox>와 같이 SPRING이 제공하는 커스텀 태그를 사용하면 좀 더 쉽게 커맨드 객체의 값을 입력 폼에 설정할 수 있다. SPRING은 입력 폼과 관련하여 다양한 커스텀 태그를 제공하고 있다.

<input>태그를 위한 커스텀 태그 : <form:input>, <form:password>, <form:hidden>

<form:input> 커스텀 태그는 다음과 같이 path 속성을 사용해서 바인딩 될 커맨드 객체의 프로퍼티를 지정한다.

<form:form commandName="memberInfo">  
<p>  
<form:label path="userId">회원 ID</form:label>  
<form:input path="userId"/>  
<form:errors path="userId"/>  
</p>

Code가 생성하는 HTML <input> 태그는 아래와 같다. 이때 id 속성과 name 속성의 값은 프로퍼티의 이름을 이용하여 생성하며, value 속성에는<form:input>커스텀 태그의 path 속성에서 지정한 커맨드 객체의 프로퍼티 값이 출력된다.

<select> 태그를 위한 커스텀 태그 : <form:select>, <form:options>, <form:option>

<form:select> <select>태그를 생성한다. <option> 태그를 생성하는 데 필요한 컬렉션을 전달받을 수도 있다.

<form:options>지정한 컬렉션 객체를 이용하여 <option>태그를 생성한다.

<form:option> 한 개의 <option>태그를 생성한다.

<select>태그는 선택 옵션을 제공할 때 주로 사용된다. 예를 들어,<select>태그를 이용해서 직업 선택을 위한 옵션을 제공한다 만약 이런 옵션 정보는 컨트롤러에서 생성해서 뷰에 전달하는 경우가 많다. 보통 @ModelAttribute Annotation을 이용해서 <select>태그에서 사용될 옵션 목록을 전달한다.

@ModelAttribute("loginTypes")  
protected List<String> referenceData() throws Exception{  
List<String> loginTypes = new ArrayList<String>();  
loginTypes.add("일반회원");  
loginTypes.add("기업회원");  
loginTypes.add("헤드헌터회원");  
return loginTypes;  
}

<form:select>커스텀 태그를 사용하면 손쉽게 뷰에 전달한 객체를 이용하여 <select>와 <option>태그를 생성할 수 있다. 아래 Code는 <form:select>커스텀 태그를 이용하여 <select> 태그를 생성하는 예를 보여주고 있다. 이때 path 속성은 바인딩 될 커맨드 객체의 이름을 입력하며, items 속성에는<option>태그를 생성할 때 사용될 컬렉션 객체를 지정한다.

<form:form commandName="login">  
<form:errors />  
<p>  
<label for="loginType"><spring:message code="login.form.type" /></label>  
<form:select path="loginType" items="${loginTypes}" />  
</p>  
...  
</form:form>  

위의 <form:select>커스텀 태그는 다음과 같은 HTML 태그를 생성한다. (실제로는 한 줄로 생성되는데, 가독성을 위해 포맷 일부를 변경했다.)

반응형