23.02.17

이동욱·2023년 8월 6일
0

NaverCloudCamp

목록 보기
27/42

학습내용

  1. transactoin
  2. AOP transaction 적용
  3. transaction service layer, persistence layer
  4. Spring AOP Transaction

Transaction이란?

DataBase의 최소 작업 단위이다. 하나의 transaction 안에 많은 쿼리들이 존재 할 수 있으며 commit을 통해 transaction을 DataBase에 반영한다.

Transaction 특징

  1. 원자성
  • 하나의 transaction안의 작업들은 DataBase에 모두 반영되거나 반영되지 않아야한다.
  1. 일관성
  • transaction의 처리 결과 DataBase의 상태(구조, 제약, 규칙)는 이전과 같아야한다
  1. 지속성
  • transaction의 처리 결과는 DataBase에 영구적으로 반영되야한다.
  1. 독립성
  • 하나의 transaction의 처리가 끝나기 전까지 다른 transaction의 작업은 끼어들 수 없다.

transaction service layer, persistence layer

서비스를 개발 할 때 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을 통해 해당 문제를 해결 가능하다.

Spring 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> 

Springframework Web Arch

기존 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에만 집중할 수 있도록
다음과 같이 모듈화한 구조를 제공한다.

  1. 단일인입점
    모든 request는 DispatcherServlet을 통해 server로 들어온다.
    DispatcherServlet은 request의 URI를 HandlerMapping에 전달하여 요구사항에 알맞는 controller를 실행한다.

  2. model and view 연결
    ModelAndView는 Controller의 실행 결과 data와 data를 어디로 전달할지에 대한 path 정보를 가지고 있다.

  3. navigation
    ViewResolver는 ModelAndView의 path를 이용하여 알맞은 view에 data를 전달하는 역할을 한다.

profile
Backend Developer

0개의 댓글