@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(String name) {
User user = new User(name);
userRepository.save(user);
// 트랜잭션 범위 내에서 실행됨
}
}
createUser() 실행 → 트랜잭션 시작userRepository.save(user) 실행 → DB에 INSERT 수행 (하지만 아직 Commit되지 않음)@Transactional을 Controller에 달면, 트랜잭션이 응답을 보내는 시간까지 유지됨 → DB 연결이 불필요하게 오래 유지됨.@Transactional은 기본적으로 Spring AOP 기반으로 동작하는데, Controller에서 직접 사용하면 AOP 적용이 어려울 수 있음.@Transactional을 적용하는데, Controller는 일반적으로 프록시 객체로 감싸지지 않음.Spring AOP 기반의 @Transactional은 같은 클래스 내부에서 호출 시 적용되지 않음.
java
복사편집
@Service
public class UserService {
@Transactional
public void methodA() {
methodB(); // ❌ 같은 클래스 내에서 호출 → 트랜잭션 적용 안됨
}
public void methodB() {
// 트랜잭션 적용 안됨
}
}