[항해 취업코스] 개발자 취준 기록 5일차-Transactional

Godtaek·2024년 3월 11일
0

Spring

목록 보기
9/9

1. 서론

@Transactional에 대해 알아보고자 한다.

모의면접에서 @Transactional에 관련한 질문을 받았고, 꼬리 질문으로 받은 질문을 답을 못했다.

class A {
	@Transactional
	public void A(){};
    
    public void B(){
    	A();
    }
}

B메서드를 호출했을 때, Transactional이 작동하느냐에 대한 문제였고, 나는 틀렸다.
무엇이 정답인지 @Transactional에 대해 알아보자

2. @Transactional이 뭔데?

Spring에서 AOP로 트랜잭션을 처리하는 선언적 방법

  1. 어노테이션 선언을 통해 해당 메서드나 클래스의 작업을 트랜잭션으로 묶을 수 있음

    • 트랜잭션 관련 코드를 사용하지 않아 사용성을 높일 수 있음
    • 트랜잭션 롤백, 전파동작, 격리수준 등 트랜잭션 동작을 세밀하게 조정 가능
  2. 클래스, 메소드, 인터페이스에 선언할 수 있음

    • 클래스 메소드 -> 클래스 -> 인터페이스 메소드 -> 인터페이스 우선순위로 동작함
    • public 메소드에만 사용할 수 있다
    • 인터페이스보단 클래스에 선언하는 것이 권장된다.
    • 상위 메소드에서 선언시 하위 메소드로 전파될 수 있지만, 그 반대는 되지 않는다.

    class A {
    @Transactional
    public void A(){};
    
    public void B(){
    	A();
    }
    

    즉 서론에 나왔던 이 코드는 실행되지 않는다.

3. 동작방식

1. 프록시 생성

  • 선언된 클래스나, 메소드를 호출할 때, 해당 클래스나 메소드를 가진 Bean 객체를 감싸는 프록시 객체 생성
  • AOP에서 프록시 생성
  • 프록시 생성을 통해 외부와의 접근을 막음. 이로 인해 데이터 일관성과 안정성을 유지

2. 트랜잭션 시작

  • 메서드 호출 이전에 프록시 객체에서 트랜잭션 시작.
  • 이 때, 선언했던 트랜잭션 속성이 적용됨

3. 메서드 호출

  • 비즈니스 로직 수행
  • 메서드 실행 중 오류가 발생한다면 트랜잭션 롤백 수행

4. 트랜잭션 관리 후 종료

  • 메서드 수행 후, commit 혹은 롤백 수행
  • 어노테이션 속성에 따라 결과가 달라짐
  • 트랜잭션 상태 정리 및 자원 반환

4. 마치며

뭔가 깊이가 모자란 거 같은데 간단하게 @Transactional을 알아봤다. 나중에 추가할 것이 있으면 추가할 예정

그래서 서론의 해당 코드로 넘어가자면,

class A {
	@Transactional
	public void A(){};
    
    public void B(){
    	A();
    }
}

가 안 되는 이유는 사실 AOP의 프록시 객체 생성과 연관이 있다.

메서드 A를 self-invocation하고 있는데 프록시 객체를 통하지 않고, 메서드를 직접 호출하기 때문에 트랜잭션이 실행되지 않는 것. 그러므로 외부 호출받는 메서드에 선언해줘야 한다.


참고한 글 / 블로그
https://imiyoungman.tistory.com/9
https://medium.com/gdgsongdo/transactional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-7b0105eb5ed6

profile
성장하는 개발자가 되겠습니다

0개의 댓글