오늘부터 Spring 3.0 버전으로 교육을 진행한다.
3.0은 Annotation 기반으로 2.5에서 설정하던 많은 사항들이 간소화 되었다.
기본적인 MVC, DI, AOP 패턴등의 구조는 같지만 설정 부분들이 매우 간소화 되어 있어서 사용이 훨씬 편리해졌다.
1. 환경설정
- 3.0 lib 에서 필요한 파일들을 프로젝트의 lib에 넣어준다.
- web.xml 에 springapp 설정부분을 넣어준다.
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- Server 에서 server.xml 파일을 열어서 Context 태그 내부에 Resource를 넣어준다.
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/oracle" password="1234" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:XE" username="spring"/>
- <servlet-name>-servlet.xml 파일을 생성하고 필요한 정보를 설정해준다.
DB에 접근을 위해 jndi 설정을 넣어주고, 이 데이터 소스를 받아서 ibatis로 연결해주기 위한 sqlMapClient 와 ibatisTemplate 을 생성해준다.
<bean id="ibatisTemplate" class="
org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="
sqlMapClient"/>
</bean>
<bean id="
sqlMapClient" class="
org.springframework.orm.ibatis.SqlMapClientFctoryBean">
<property name="dataSource" ref="
springDataSource"/>
<property name="configLocation" value="
/WEB-INF/SqlMapConfig.xml"/>
</bean>
<bean id="
springDataSource" class="
org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/oracle"/>
<property name="resourceRef" value="true"/>
</bean>
2. Controller
- 2.5에서는 컨트롤러의 동작 내용에 따라서 AbstractController나 AbstractCommandController, SimpleFormController 등을 상속해주어야 하던것을 3.0에서는
@Controller를 선언해주는것만으로 설정이 끝난다.
- 3.0에서는
DefaultAnnotationHandlerMapping을 기본으로 사용할 수 있다. 이전처럼 UrlHandlerMapping 을 사용하고 싶거나 다른 맵핑 방식을 원하는경우 물론 지정해서 가능하다.
다른 매핑을 지정하는 경우에도 annotation을 사용할 수 있는데, 이때는
DefaultAnnotationHandlerMapping도 명시적으로 선언해 주어야 한다.
- 컨트롤러로 사용할 클래스를 생성하고 클래스 위에 @Controller를 써서 컨트롤러 클래스로 지정한다. 컨트롤러를 메모리에 올리기 위해 xml파일에 컨트롤 클래스를 적어주고 DB 처리를 위해 Dao를 넣어준다.
<bean id="boardController" class="kosta.controller.BoardAnnotationController">
<property name="boardDao" ref="boardDao"/>
</bean>
- 컨트롤러 파일이 여러개가 되는 경우 각각의 파일을 모두 지정할 필요없이 팩키지 전체를 등록할 수도 있다.
<
context:component-scan base-package="com.kosta.board.controller" />
- 메소드 상단에 @RequestMapping 어노테이션으로 매핑을 설정한다. 이때 파일명만 넣어서 단순하게 @RequestMapping("/list.do") 형태로 설정 하는 방법도 있고, GET/POST의 메소드 전송방식에 따라서 같은 파일로 action처리를 하고자 하는 경우는 value와 method를 선언해주면 된다.
@RequestMapping(value="/insert.do", method=
RequestMethod.POST)
- 메소드에서 간단한 파라메터를 넘겨받아서 처리해야 하는경우 @RequestParam 을 이용해서 처리한다.
public ModelAndView detail(
@RequestParam("seq") Integer seq)
- Form 전송 데이터의 경우는 폼 값에 맞춘 객체를 생성해서 메소드의 파라메터로 지정해 두면 자동으로 폼 입력 데이터값을 가진 객체가 컨트롤러로 넘어오게 된다.
public ModelAndView update_action(
Board board)
파라미터 타입 |
설명 |
HttpServletRequest, HttpServletResponse |
서블릿 API |
java.util.Locale |
현재 요정에 대한 Locale |
InputStream, Reader |
요청 컨텐츠에 직접 접근할 때 사용 |
OutputStream, Writer |
응답 컨텐츠를 생성할 때 사용 |
@PathVariable 어노테이션 적용 파라메터 |
URI 템플릿 변수에 접근할 때 사용 |
@RequestParam어노테이션 적용 파라메터 |
HTTP 요청 파라미터를 매핑 |
@RequestHeader어노테이션 적용 파라메터 |
HTTP 요청 헤더를 매핑 |
@CookieValue어노테이션 적용 파라미터 |
HTTP 쿠키 매핑 |
@RequestBody 어노테이션 적용 파라미터 |
HTTP 요청의 몸체 내용에 접근할 때 사용 |
Map, Model, ModelMap |
뷰에 전달할 모델 데이터를 설정할 때 사용 |
커맨드 객체 |
HTTP 요청 파라미터를 저장 한 객체, 기본적으로 클래스 이름을 모델명으로 사용 @ModelAttribute 어노테이션 설정으로 모델명을 설정할 수 있음 |
Errors, BindingResult |
HTTP 요청 파라미터를 커맨드 객체에 저장한 결과, 커맨드 객체를 위한 파라미터 바로 다음에 위치 |
SessionStatus |
폼 처리를 완료 했음을 처리하기 위해 사용. @SessionAttributes 어노테이션을 명시한 session속성을 제거하도록 이벤트를 발생 시킨다. |
3. DAO
- DAO의 경우 지난번 ibtis 실습때는 sqlMapClient를 받아서 사용했으나 이번에는 ibatisTemplate를 받아서 사용한다. 역시 servlet.xml파일에서 Dao파일 설정 태그에 DI 방식으로 미리 생성해둔 ibatisTemplate객체를 넣어준다.
- ibatis 쿼리용 xml파일은 지난시간에 실습했던 xml파일을 재활용했다. ^^
4. Validation
- org.springframework.validation.Validator 를 상속받아서 Validation클래스를 생성해준다. 클래스를 생성하면 기본으로 두개의 메소드가 오버라이드 된 상태로 나타난다.
- supports : Validation을 체킹할 클래스를 확인하는 메소드
체킹할 클래스의 isAssignableFrom 을 확인해서 리턴값을 돌려주는 간단한 소스를 작성해준다.
if(Board.class.isAssignableFrom(arg0)){
return true;
}
- validate : 실제로 Validation을 확인해주는 클래스
if 문으로 필요값의 null여부를 확인한 뒤
errors.rejectValue("title", "required");를 호출해준다. 이 문장은 message.validation.properties파일 내에 선언해둔 메시지 중 required.title 로 선언된 메시지를 가져와 에러 메시지로 출력해주게 된다.
- jsp파일에서는 tablib에 spring과 form을 선언해 주고
<%@ taglib prefix="spring" uri="
http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="
http://www.springframework.org/tags/form" %>
Form 태그 바로 위에 바인딩을 걸어준다.
<spring:hasBindErrors name="board"/>
Validation체크 후 에러 메시지를 보여줄 부분에다가는 <form:errors path="board.title"/> 이라고 코딩해주면된다.
5. Tiles
- 템플릿으로 사용할 파일들을 tiles 팩키지에 우선 등록을 해준 뒤 설정에 들어간다.
header, footer 등 중복으로 사용할 모듈을 생성해주고 template으로 사용할 파일에서 모양을 잡아준다.
<%@ taglib prefix="tiles" uri="
http://tiles.apache.org/tags-tiles" %>
태그 라이브러리로 prefix를 선언해 준뒤 모양 내의 필요한 곳에서 <tiles:insertAttribute name="header"/>
형태로 선언해 주면 된다. 여기서 표기한 hearder라는 이름은 아래에서 설정할 xml파일에 설정해둔 이름값이며 해당태그의 value로 설정된 파일을 가져와서 뿌려주게된다.
- xml 파일 내부에 템플릿으로 사용할 파일들을 등록해줘야 한다.
기본으로 사용할 템플릿의 모양으로 base_layout 을 만들어주고
<definition name="base_layout" template="/tiles/template.jsp">
<put-attribute name="header" value="/tiles/header.jsp"/>
<put-attribute name="footer" value="/tiles/footer.jsp"/>
</definition>
Body 부분만 호출에 따라서 다른 파일을 가져오도록 템플릿을 설정해 주면된다.
이때 매번 반복될 부분을 선언해둔 클래스를 extends로 지정해주면 다시 선언할 필요가 없다.
<definition name="insert_form" extends="base_layout">
<put-attribute name="body" value="/board/insert_form.jsp"></put-attribute>
</definition>
- 이제 설정한 xml파일을 servlet.xml 에 설정해준다.
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles2def.xml</value>
</list>
</property>
</bean>