DataBase의 최소 작업 단위이다. 하나의 transaction 안에 많은 쿼리들이 존재 할 수 있으며 commit을 통해 transaction을 DataBase에 반영한다.
서비스를 개발 할 때 transaction 관리는 service layer에서도 persistence layer에서도 가능하다.
persistence layer에서 transaction을 관리하면 service layer와 persistence의 decoupling 관계는 유지가 가능하지만 business logic 중간에
예외가 발생하면 이전에 수행했던 commit들은 rollback이 불가능하기에 다시 update를 해줘야하는 불편함이 있다.
service layer에서 transaction 관리를 하면 business logic 중간에 예외가 발생하더라도 한번의 rollback을 통해 복구가 되지만
persistence layer 계층이 가지고있는 connection을 관리해야하기에 layer간의 coupling이 발생한다.
AOP Transaction을 통해 해당 문제를 해결 가능하다.
AOP의 advice를 transaction-manager로 지정한 뒤 pointcut을 service layer로 지정하여 해당 service layer의 메서드들이
실행될때 springframework에서 자동으로 transaction 관리를 해주어 service layer와 persistence layer간의 decoupling 관계를 유지 가능하다.
transaction을 관리해주는 spring transactionManager bean 생성
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
//business logic에 붙어 transaction을 관리해줄 advice 생성
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
//name이 get인 메서드에 적용, transaction이 없으면 생성하고 있으면 기존의 transaction을 가져오는 REQUIRED 옵션 설정, 데이터를 수정하는 작업이 아닌 읽기만 수행하는 read-only="true" 설정
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
//모든 메서드에 적용, propagation="REQUIRED"가 default이기에 transaction이 없으면 생성하고 존재하면 기존 transaction을 가져온다
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
//advice와 pointcut을 weaving하여 자동으로 dynamic proxy 생성
<aop:config>
// transactionManager가 어떤 메서드에 수행될지 조건 지정
<aop:pointcut expression="execution(* mybatis.service.user..*ServiceImpl*.*(..) )" id="requiredTx"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx"/>
</aop:config>
기존 model2 arch에서 controller의 역할은 아래와 같다
1. 단일인입점
2. model and view 연결
3. business logic 처리
4. navigation(Business Logic 처리 결과를 알맞은 view에 전달)
5. work flow control
Controller에서 너무 많은 역할을 담당하기에 Springframework는 spring web을 통해 Controller가 Business Logic에만 집중할 수 있도록
다음과 같이 모듈화한 구조를 제공한다.
단일인입점
모든 request는 DispatcherServlet을 통해 server로 들어온다.
DispatcherServlet은 request의 URI를 HandlerMapping에 전달하여 요구사항에 알맞는 controller를 실행한다.
model and view 연결
ModelAndView는 Controller의 실행 결과 data와 data를 어디로 전달할지에 대한 path 정보를 가지고 있다.
navigation
ViewResolver는 ModelAndView의 path를 이용하여 알맞은 view에 data를 전달하는 역할을 한다.