반응형
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 |