@Transactional

한상우·2023년 1월 26일
0
post-thumbnail

@Transactional

트랜잭션을 어떻게 관리해주는거지??

이 어노테이션이 없다면??

트랜잭션의 개념


DB 에 모두 반영되거나 모두 반영되지 않아야 되는 하나의 작업 단위를 뜻함

트랜잭션을 적용하지 않았다면??


헬스장 제작

  1. 헬스장 생성해주세요
  2. 기구 생성해주세요

문제

헬스장만 생성되면…???? 기구만 생성되면…???

강제 야외 헬스장이 되거나 유산소만 해야 하는 끔찍이 발생

왜냐??

각각의 요청을 별개의 요청으로 받아들임 → 별개의 요청이기에 하나의 작업 단위가 아님

커넥션 풀

커넥션 풀을 통해서 커넥션 객체를 가져옴 그리고 커넥션 객체를 DB 서버에서 세션을 만들고 세션을 통해서 DB 에 요청을 보냄

그래서 이 각각의 요청을 하나의 작업으로 만들어줘야겠지??

커넥션 객체를 통해서 setAutoCommit(false) 를 주어 요청을 보내도 즉시 반영하지 않는 요청 진행

이후 헬스장 생성요청 기구 생성요청 아무 문제 없으면 반영해주세요~~!!

트랜잭션 적용


적용전

  • 자동커밋 수동커밋
    • 자동 커밋: 쿼리 실행 직후 자동으로 커밋 호출, 트랜잭션 기능 사용 불가

    • 수동 커밋: 커밋 롤백 직접 호출해야 함

      자동 커밋 모드에서 수동 커밋 모드로 전환 하는 것을 트랜잭션을 시작한다고 표현한다고 함

@RequiredArgsConstructor
public class HealthServiceImpl implements HealthService {
	
	private final DataSource dataSource;
	
	public void goHealth() throws SQLException {
		Connection con = dataSource.getConnection();

		try {
        con.setAutoCommit(false); // 트랜젝션 시작

	      // .. 헬스장 만들어버리깃~ ..
				logic(con); // 하나의 세션으로 할당해 처리하기 위해 connection 넘겨줌

        con.commit(); // 성공시 커밋
    } catch (Exception e) {
        con.rollback();
        throw new IllegalStateException(e);
    } finally {
        release(con);
    }
		
	}

}

Spring AOP


AOP 는 프록시 방식으로 동작

Spring 은 타겟 클래스 혹은 그의 상위 인터페이스를 상속하는 프록시 객체를 생성 후 프록시 클래스에서 부가 기능에 관련된 처리를 함 타겟에서는 순수한 비즈니스 로직만 처리 가능

@Service
public class HealthServiceProxy implements HealthService {
	
		@Override 
		public void logic() {
        // Target 호출 이전에 처리해야하는 부가 기능
				
				healthService.goHealth();
				
				// Target 호출 이후에 처리해야하는 부가 기능
				
}

프록시 객체 - 타겟 객체를 상속해서 재정의한 클래스

  • 다이나믹 프록시 방법
    • 타겟의 상위 인터페이스를 받아 프록시를 만듬
  • GCLib 프록시
    • 타겟의 클래스를 상속 받아 프록시를 만듬
    • 성능상 이점과 클래스 상속을 이유로 스프링 부트가 기본으로 채택

@Transactional


Spring AOP를 사용 프록시 형태로 동작

  1. target 에 대한 호출이 들어오면 AOP 프록시가 이를 갈챔
  2. AOP 프록시에서 트랜잭션 처리 진행
  3. 트랜잭션 처리 외 추가적인 작업 Custom Advisor 에서 처리
  4. 부가 기능 마치면 TargetMethod 호출
  5. 호출한 친구에게 체인을 따라 반환

결론


@Transactional 은 결국 Spring AOP 중 하나로 프록시 방식을 사용한다.

서비스 계층에서 비즈니스 로직에 집중하기 위해 트랜잭션애 관련된 부가적인 기능은 로직 밖에서 처리해준다

profile
안녕하세요 ^^

0개의 댓글