스프링 ch3-19 ~ ch3-21 - 서비스 계층의 분리와 @Transactional

서현우·2022년 7월 7일
0

스프링의정석

목록 보기
77/85

ch3-19 ~ ch3-21 - 서비스 계층의 분리와 @Transactional

  • 계층 분리 - @Controller, @Service, @Repository, DB
  • TransactionManager - 서비스 계층에서 수동 생성, bean으로 등록 후 @Transactional 사용
  • @Transactional의 속성 - propagation, isolation, readOnly, rollBackFor, noRollBackFor, timeout
  • propagation속성의 값 - REQUIRED, REQUIRES_NEW, NEWSTED

서비스 계층(Layer)의 분리

  • 비지니스 로직의 분리, @Service => 관심사의 분리
  1. @Controller
  • Presentation Layer.
  • 서비스 계층을 주입받고, 서비스 계층을 호출만 한다.
  1. @Service
  • Business Logic, 서비스 계층, 업무 용어.
  • Dao를 주입받고, Dao를 호출만 한다.
  • Tx를 적용하기가 적합하다.
  1. @Repository
  • Persistence Layer, Data Access Layer, 영속 계층.
  • DataSource를 주입받고, DB를 호출만 한다.
    (@Controller, @Service, @Repository는
    @Component를 메타 애너테이션으로 가지고 있으므로,
    component-scan으로 자동 등록 가능)

TransactionManager란?

DAO의 각 메서드는 개별 Connection을 사용한다.
때문에 같은 Tx내에서 같은 Connection을 사용할 수 있게 관리한다.
DAO에서 Connection을 얻거나 반환할 때 DataSourceUtils를 사용해야한다.

TransactionManager로 Transaction 적용하기

  1. 서비스 계층에서 직접 생성하는 방법
public void insertWithTx() throws Exception {
	//before advice - 부가 기능
	PlatformTransactionManager tm = new DataSourceTransactionManager(ds);
	TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());
	//Tx 시작
	try {
		//핵심 기능
		a1Dao.insert(1, 100);
		a1Dao.insert(1, 200);
		//after advice - 부가 기능
		tm.commit(status); //Tx 끝 - 성공이면 커밋
	} catch(Exception ex) {
		tm.rollback(status); //Tx 끝 - 실패하면 롤백
	}
}
  1. 빈으로 등록, @Transactional을 사용할 수 있게 등록.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven/>

@Transactional로 Transaction 적용하기

  • AOP를 이용한 핵심기능과 부가기능의 분리.
  • @Transactional은 메서드뿐만이 아닌, 클래스나 인터페이스에도 붙일 수 있음.
  • 클래스 - 클래스 내의 모든 메서드에 Tx이 적용.
  • 인터페이스 - 인터페이스를 구현한 클래스 내의 모든 메서드에 Tx이 적용.
@Transactional
public void insertWithTx() throws Exception {
	//핵심 기능
	a1Dao.insert(1, 100);
	a1Dao.insert(1, 200);
}

@Transactional의 속성

propagation - Tx의 경계를 설정.
isolation - Tx의 isolation level을 지정.
readOnly - Tx이 데이터를 읽기만 하는 경우. true로하면 성능 향상.
rollBackFor - Exception예외 발생 시 사용.
noRollBackFor - 지정된 예외가 발생해도, Tx를 rollback하지 않음.
timeout - 지정된 시간 내에 Tx가 종료되지 않으면 강제 종료.

propagation속성의 값

REQUIRED - Tx이 진행중이면 참여하고, 없으면 새로운 Tx시작(default)
REQUIRES_NEW - Tx이 진행중이건 아니건, 새로 Tx 시작(Tx안에 다른 Tx 생성)
NESTED - Tx이 진행 중이면, Tx의 내부 Tx로 실행(Tx안에 subTx(save point)로 같은 Tx 생성)

profile
안녕하세요!!

0개의 댓글