1. Transaction 관리
- 스프링에서는 Transaction 관리를 위해서는 AOP를 사용할줄 알아야 한다.
앞서 AOP 사용법에 대해 설명이 되어 있기 때문에 바로 Transaction 등록 및 사용에 대해 다룬다
1) 등록 순서
- tx 네임스페이스 등록 --> basicDataSOurce 등록 --> DataSourceTransactionManager 등록 --> Tx 정책 설정
--> AOP 를 사용한 Transaction 적용
먼저 applicationContext.xml 파일에 tx 태그 사용을 위한 네임스페이스를 등록한다.
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
다음 basicDataSOurce Bean 등록을 한다.
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="hr"/>
<property name="password" value="hr"/>
</bean>
다음 DataSourceTransactionManager Bean 등록
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
TX 정책 설정
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
AOP를 통한 TX 적용
<aop:config>
<aop:pointcut expression="execution(* com.multicampus.biz..*ServiceImpl.*(..))" id="boardPointcut"/>
<aop:advisor pointcut-ref="boardPointcut" advice-ref="txAdvice"/>
</aop:config>
- 자세히 살펴 보면 aop 적용을 위한 태그로 advisor를 사용하고 잇다.
사실 aspect와 advisor는 둘다 pointcut와 advice를 사용한다는 점에서 동일한 기능을 한다. 그러나 두개의 차이는 사용자가 설정한 advice를 사용하는 경우 (ex: before, around, after..) 에는 aspect를, 기본적으로 제공되는 advice를 사용하는 경우는 advisor를 사용한다. 위에서는 스프링 jdbc에서 제공하는 DataSourceTransactionManager 를 사용하기 때문에 advisor 태그를 통해 aop 적용을 하고 있다.
2. Spring MVC
1) 전체적인 로직 설명
- 스프링 MVC의 로직 처리 순서이다.
그림을 보면서 이해하면 사용자로부터 login.do 라는 방식의 request 요청이 1번을 통해 들어오면 DispatcherServlet 에서 해
해당 URI에 매칭되는 controller를 찾기 위해서 2번의 HandlerMapping에게 해당 작업을 요청하게 된다. 이때 Handler
Mapping 클래스에는 Propertites 방식으로 <URL, Controller> 방식의 key, value 형태로 값이 저장되어 있을것이다.
URI에 해당되는 Controller를 찾았다면 생성된 Controller가 3번에서 수행이 되게 되며, 작업이 끝나게 되면 4번에서 해당
결과값 (Model 여기에서는 VO가 해당 된다.) 과 리턴되어야 하는 페이지 정보를 ModelAndView에 저장하고
DispatcherServlet에 리턴하게 된다. 그뒤 Servlet에서는 5번 ViewResolver에서 해당되는 Jsp 페이지를 찾게 되고, 마지막
으로 6번 처럼 해당 View에 MoldelAndView에 저장되어 있는 모델(VO)값이 세팅되어 표시되게 된다.
2) Web.xml 파일 설정
Spring의 DispatcherServlet 을 사용하기 위해 servlet 등록을 하고 mapping 시키는 과정이다.
설명하면 먼저 servlet를 action이라는 이름으로 org.springframework.web.servlet.DispatcherServlet 클래스를 등록하게되고
mapping 작업을 통해 action이라고 등록한 servlet를 모든 .do 라는 uri에 매칭 시키겠다. 라고 선언하고 있다.
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3) 외부 설정 파일 등록
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>config/presentation-layer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- servlet 등록시에 init-param을 사용하여 외부에 config/presentation-layer.xml 파일을 등록하고 있다. 이렇게 등록하게 되면,
해당 서블릿이 만들어 질때 외부에 설정한 Bean드리 메모리에 올라가게된다.
- presentation-layer.xml 파일 정보
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- HandlerMapping 등록 -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">login</prop>
<prop key="/getBoardList.do">getBoardList</prop>
<prop key="/addBoard.do">addBoard</prop>
<prop key="/getBoard.do">getBoard</prop>
</props>
</property>
</bean>
<!-- Controller 들 등록 -->
<bean id="login" class="com.multicampus.view.user.LoginController"/>
<bean id="getBoardList" class="com.multicampus.view.board.GetBoardListController"/>
<bean id="addBoard" class="com.multicampus.view.board.AddBoardController"/>
<bean id="getBoard" class="com.multicampus.view.board.GetBoardController"/>
<!-- ViewResolver 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 해당 xml 파일에는 현제 handlerMapping 정보와 Controller 정보, ViewResolver 정보들이 등록되어 있다.
handlerMapping 은 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping 클래스를 통해 등록이 되고 있으며, 해당 클래스는 mapping 라는 세터 매소드를 통해서 prop 들이 key, value 형태로 등록이 되고 있다.
Controller 의 등록은 bean 형태로 사용자가 제작한 클래스들을 등록 하고 있다.
ViewResolver의 등록은 org.springframework.web.servlet.view.InternalResourceViewResolver 라는 클래스를 viewResolver라는 이름으로 등록 하며, 역시 setter 메소드로 prefix와 suffix 메소드를 사용하고 있다. 여기서 prefix는 view를 찾기위한 URI가
"login" 이라는 이름으로 들어오게되면 앞에 "/"를 붙여 주겠다는 의미로 결과값은 "/login"이 되게 되며, suffix의 뒤에 ".jsp"를 붙여 주겠다는 의미로 최종 결과는 "/login.jsp" 라는 이름으로 해당 뷰를 찾게 된다.