Java&Spring/Spring

@Transactional (1)

sung.hyun.1204 2023. 8. 9. 17:21

@Transactional  은 Aop 의 관점에서는 사용하기는 편리하지만 , 개발자가 동작원리를 이해를 기반으로 해야 효과적인

troubleshooting 이 가능하다 라고 생각한다. 

 

 

학생 Id 를 이용하여 , 10 명의 학생 객체를 만들려고 한다. 

식별자는 db 에서 생성을 받는다하자.

다음 코드가 동작을 정상적으로 할까 ? 

@Service
public class SomeService {

    @Transactional
    public void methodA(int studentId) {
		Student member = new Student(studentId)
    }

    @Transactional
    public void methodB() {
        for(int i = 0 ; i < 10 ;i++) {
        	methodA(i)
        }
    }
}

 

또는 , 

 

다음과 같이 서비스 레이어에서 트랜잭션이 걸려있는 메서드를 트랜잭션 어노테이션이 없는 메서드 B에서 호출을 한다.

어떤일이 일어 날까 ?

@Service
public class SomeService {

    @Transactional
    public void methodA() {
        // ...
    }

    public void methodB() {
        // ...
        methodA();
        // ...
    }
}

 

두번째 질문의 답을 먼저한다 .

 

스프링에서의 @Transactional 어노테이션이 붙은 클라스의 메서드는 클라이언트에서 런타임시 직접적으로 호출이 되지 않고

프록시 객체를 통하여 호출이 된다. 이는 프록시 내부에서 내부를 호출시 Transaction 은 적용이 되지 않는다.

 

위의 이유로 우리는 Private 접근자로 @Transactional 을 선언을 할 수가 없다.

 

@Transactional  가 없는 methodB 를 호출시 트랜잭션이 시작되지 않는다.

methodB에서 methodA 를 호출시 , Transaction 적용이 안된다.

 

 

 

이번에는 첫 번째 문제를 보자 , 

@Service
public class SomeService {

    @Transactional
    public void methodA(int studentId) {
		Student member = new Student(studentId)
    }

    @Transactional
    public void methodB() {
        for(int i = 0 ; i < 10 ;i++) {
        	methodA(i)
        }
    }
}

methadA 에도 트랜젝션이 있으니 객체를 생성할 것 같지만 ,

 

같은 클라스에서 메서드의 호출에 따란 Transaction 의 중복은 의미가 없이 최초 Transaction 을 기준으로 동작한다.

 

즉 methodB 를 호출해도 데이터 베이스에서  10 명의 학생은 볼 수가 없다 ,  methodB 의 transactional 을 빼주자,

 

 

 

 

 

 

다음과 같이 서로 다른 클라스에서 메서드 각각 트랜 젝션이 걸려 있는  상태에서는 롤백이 어떻게 될까 ?

@Service
public class TotalService {
	...
    
    @Transactional
    public void methodB() {
		someService.methodA();
		otherService.methodG();
        myService.methodE();
    }

}

 

각 서비스 매서드 , 로컬 트랜잭션 3 개는  부모 트랜잭션인 methodB 의 트랜잭션의 합류하여 수행이된다.

즉 , 모두 같은 트랜잭션이 됨으로 어느 하나의 로직이 잘못되어 문제가 발생하면 전부 롤백 된다.

(트랜잭션 전파 수준에 따라 달라지며 위 설명은 기본 설정인 상황이다.)

 

 

참고 :

https://dev-coco.tistory.com/163

 

신입 개발자 기술면접 질문 정리 - 백엔드

💡 WAS(Web Application Server)와 WS(Web Server)의 차이를 설명해주세요. WAS(Web Application Server) 비즈니스 로직을 넣을 수 있음 Tomcat, PHP, ASP, .NET 등 WS(Web Server) 비즈니스 로직을 넣을 수 없음 Nginx, Apache 등

dev-coco.tistory.com

 

https://kangyb.tistory.com/15

 

[Spring] @Transactional 간략 정리 ( AOP, Proxy, 동작 원리, 특이사항 )

@Transactional의 동작 원리와 @Transactional을 사용하면서 생기는 이슈들에 대한 간략 정리 1. DB Transaction ACID 원자성(Atomicity) - 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭제하

kangyb.tistory.com