반응형

 

Spring에서 DB에 대한 연산을 할 때 

@Transactional 어노테이션을 통해 트랜젝션 작업 단위로 묶어서 처리한다.

 

트랜젝션을 위해 @Transactional 어노테이션을 붙여도 동작하지 않는 상황에 주의해야한다.

 

1. @Transactional을 붙인 메서드의 접근지정자가 private인 경우

public class GameService {
	
	//..........
    
	public void doSave() {
		save();
	}
    
	@Transactional
	private void save() {
		//..........
	}
	
}

이는 Spring AOP가 프록시 기반으로 하기 때문에 발생하는 것으로 접근지정자를 public으로 지정하면 된다.

 

2.  @Transactional이 붙지 않은 메서드에서 @Transactional이 붙은 메서드를 호출하는 경우

public class GameService {
	
	//..........
    
	public void doSave() {
		save();
	}
    
	@Transactional
	public void save() {
		//..........
	}
	
}

@Transactional은 Proxy를 이용해 메서드가 실행되기 전 트랜젝션을 묶게 된다. 따라서 @Transactional이 붙지 않은 doSave() 메서드를 호출하게되면 트랜젝션이 적용되지 않은 상태로 doSave() 메서드를 실행하고 이 메서드 내에서 save() 메서드를 호출하게 되므로 save() 메서드에 트랜젝션이 정상적으로 적용되지 않는다.

 

해결방법

- doSave를 통해 save를 호출하는게 아닌 save 메서드를 호출하게 되면 정상적으로 트랜젝션이 동작하게 된다.

- doSave메서드에 @Transactional 어노테이션을 붙인다.

public class GameService {
	
	//..........
    
	@Transactional
	public void doSave() {
		save();
	}
    
	@Transactional
	public void save() {
		//..........
	}
	
}

 

반응형

'공부 > Spring' 카테고리의 다른 글

[Spring] DI란?  (0) 2021.09.20
[Spring] IoC란 무엇인가?  (0) 2021.09.16
[Spring] AOP란?  (0) 2021.09.08
[Spring] Filter & Interceptor  (0) 2021.05.05
Servlet Working Flow  (0) 2021.05.04

+ Recent posts