[toby의스프링] 13장 - 스프링 @MVC #3
드디어 13장의 마지막 편이다.
그런데 낭패다. 이 장의 남은 부분은 정리라는 것이 별로 필요하지 않은 내용이기 때문이다.
그래도 어떡하나. 해야지 뭐.
13장의 나머지 부분은 JSP 뷰와 태그 라이브러리, 메시지 컨버터와 Ajax, OXM 등의 연계 방법 등에 대해 아주 살짝.. 아주 아주 살짝 건드리고 있다.
수박 겉을 핥아도 이보다는 맛있을 것(!) 같다.
뭐 아무튼 시작해보자.
1. JSP EL
일반적인 JSP 페이지에서 name 이라는 변수를 출력하기 위해서는 다음과 같이 코딩해야 한다.
<%
User user = new User();
user = user.getUser(userid);
out.println(user.name)
%>
하지만 JSP 뷰 페이지에서는(스프링에서 ModelAndView로 리턴된 뷰페이지에서는) 이렇게만 하면 된다.
${user.name}
물론, 이렇게 사용하기 위해서는 당연히 뷰를 호출하는 메소드에서 user 오브젝트에 값을 넣어둬야 한다.
여기에 fmt나 <c:if>, <c:when>, <c:choose> 등을 함께 사용해 필요한 처리를 할 수도 있다.
2. 스프링 Sp EL
스프링의 SpEL을 사용하기 위해서는 다음과 같은 Spring 태그 라이브러리를 추가해야 한다.
<% taglib prefix="spring" uri="http://www.springframework.org/tags" %>
위 JSP EL에서 했던 것과 같이, user 오브젝트의 name을 출력할 때 SpEL은 다음과 같다.
<spring:eval expression="user.name" />
SpEL은 JSP EL에 비해 자유도가 높아 메소드 호출이나 연산, 심지어 오브젝트 생성도 가능하다.
하지만 애초에 JSP 뷰 단에서 복잡한 로직을 처리하는 것은 MVC 패턴 전략에 맞지 않으므로, SpEL에서 아무리 대단한 기능을 지원한다고 해도 그걸 막 써대면 안 될 것 같다.
하지만 이거 하나는 매우 맘에 든다.
메소드에서 특정 변수에 포맷터를 지정한 경우 이 변수를 출력하면 포맷팅이 자동으로 따라 온다는 것.
예를 들어 JSP 뷰 단에서 <% %> 이나 JSP EL을 이용해 통화 표현이나 날짜 표현을 하려면 매우 번거롭다.
하지만 SpEL 에서는 메소드에서 해 놓은 포맷터를 그대로 상속하므로 그냥 쓰기만 하면 된다.
이건 매우 좋다.
3. 지역화 메시지 출력
messages.properties 파일을 이용한 메시지 출력이다.
messages_en.properties, messages_ko.properties, messages_jp.properties 등의 파일을 복수로 만들어 놓고 LocaleResolver의 결정에 따라 서로 다른 메시지를 뿌려 줄 수도 있다.
이렇게 messages.properties 를 이용하기 위해서는 어플리케이션 컨텍스트 설정에서 다음과 같은 빈 설정을 해 줘야 한다.
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>com.kunner.common.messages.default_msg</value>
// messages.properties 라는 기본 이름을 쓰지 않고 별도로 지정해 줄 수도 있다.
// 이 경우 메시지 파일은 WEB-INF/classes/com/kunner/common/messages/default_msg.properties 가 될 것이다.
</list>
</property>
</bean>
아래는 실제로 메시지를 적용해 본 것이다.
messages.properties
greeting=Hello, {0}! Have a nice {1}!
뷰 페이지
<spring:message code="greeting" arguments="${user.name},${dayOrNight}" text="Hello, there!" />
만약 위 소스의 결과에서 user.name이 "Kunner" 이고, dayOrNight가 "day" 라면 화면에 출력되는 내용은 다음과 같다.
Hello, Kunner! Have a nice day!
그리고 만약 greeting 이라는 인수로 메시지를 찾을 수 없을 경우 화면에 출력되는 내용은 text의 속성값 "Hello, there!" 가 될 것이다. 자바스크립트의 alert 메시지 뿐 아니라 HTML 바디에 들어갈 텍스트에도 모두 사용 가능하다.
4. 폼 태그 라이브러리 <form: />
HTML의 폼태그를 써도 입출력하는데는 크게 문제가 없다.
하지만 최근의 웹 개발 트렌드를 생각해 볼 때 이렇게 하는 경우 번거로운 처리를 함께 해 줘야 한다.
책에서 회원가입의 예를 잘 들었으니 굳이 또 예를 들어가며 설명할 건 없겠고..
간단히 말해 폼을 서밋 했다가 오류나 기타 다른 이유로 다시 폼을 리턴 시킬 때 이미 입력한 정보가 그대로 들어 오도록 한다거나, 입력 오류가 난 항목에 별도의 오류 메시지를 출력한다든가 하는 걸 처리하기 위해서는 일반적인 HTML의 폼태그만으로는 매우 귀찮고 번거로운 작업을 해야만 한다.
하지만 스프링의 폼이나 폼 태그 라이브러리를 이용하면 쉽다.
여기서는 스프링 폼은 생략하고 폼태그라이브러리에 대한 용례만 몇가지 짚고 넘어 가기로 한다.
먼저 폼 태그 라이브러리 <form: /> 을 사용하기 위해서는 다음과 같이 태그 라이브러리를 추가해 줘야 한다.
<% taglib prefix="form" uri="http://springframework.org/tags/form" %>
<form:form> 을 이용해 폼을 만들면 폼을 전송할 때 사용할 객체를 지정해 줄 수 있다.
또 폼 전송 후 오류를 리턴 받았을 때 자동으로 오류 메시지를 출력하게 할 수 있는데, 이 때 사용할 css의 class 를 별도로 지정해 줄 수도 있다.
그 외 일반적인 사항은 거의 다를 게 없다.
그냥 아래 코드를 보고 이해하자.
user.java
public class User(){
//생성자 지시자 생략
...
String name;
@NumberFormat(pattern="###,##0")
Integer point;
...
}
@RequestMapping("/user/add")
public String add(){
// 입력 처리
return "addResult";
}
View - add.jsp
<form:form id="userform" commandName="user" 1 action="/user/add" method=post> 2
<form:label path="name" cssClass="inputText" cssErrorClass="inputTextError">이름: </form:label>
<form:input path="name" cssClass="inputForm" cssErrorClass="inputFormError" />
<form:errors path="name" cssClass="inputTextError" />
//path를 지정해 놓으면 해당 입력값에 입력 오류나 바인딩 오류가 있을 때 에러를 표시할 수 있다.
//일반적인 상황에서는 cssClass에 선언된 css가 적용되고, 오류상황에서는 cssErrorClass의 css가 적용된다.
//<form:errors>는 오류상황에서만 출력되므로 cssClass가 다른 개체의 cssErrorClass와 같은 기능을 한다.
<form:label path="point" cssClass="inputText" cssErrorClass="inputTextError">포인트: </form:label>
<form:input path="point" cssClass="inputForm" cssErrorClass="inputFormError" />
<form:errors path="point" cssClass="inputTextError" />
//모델에 포맷터를 적용한 경우 해당 포맷팅이 자동으로 처리된다!!!
<input type="submit" value=" ok "> // HTML 태그를 혼용해도 상관 없다.
</form:form>
그 외 체크박스나 라디오버튼과 같이 컬렉션을 연동해 사용하는 것도 있다.
어렵지 않으니 필요할 때마다 찾아서 쓰다보면 익숙해 질 것이다.
그 외 메시지 리솔버나 OXM, Ajax 의 사용법등을 간략하게 언급하고 있으나 정리로서의 의미가 크게 없으므로 생략한다.
자, 이렇게 13장을 끝내자.
뿌리 깊은 나무를 보고 있는데.. 정말 한글은 위대한 거 있지.
우린 한글 창제 때와 전혀 다른 세상에서 살고 있는데도 한글로 표현 안 되는게 없으니..
역사를 풍미한 불세출의 천재, 하면 카이사르나 나폴레옹을 꼽곤 했는데 우리 세종대왕도 충분히 어께를 견줄만 하지 않은가!
아니, 어쩌면 더 위대할지도 모르겠다.