1. @Transactional을 Service에 적용한 경우 (권장)

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(String name) {
        User user = new User(name);
        userRepository.save(user);
        // 트랜잭션 범위 내에서 실행됨
    }
}

✔ 동작 방식

2. @Transactional을 Controller에 적용한 경우 (권장되지 않음)

❌ Controller에서 @Transactional을 쓰면 발생할 수 있는 문제

  1. 트랜잭션이 Controller 계층에서 시작됨 (비즈니스 로직과 분리됨)
  2. 트랜잭션이 Controller에서 시작되면 비효율적인 커넥션 관리 발생
  3. Spring AOP(Aspect-Oriented Programming) 문제 발생 가능

프록시(AOP) 문제

Spring AOP 기반의 @Transactional같은 클래스 내부에서 호출 시 적용되지 않음.

java
복사편집
@Service
public class UserService {
    @Transactional
    public void methodA() {
        methodB(); // ❌ 같은 클래스 내에서 호출 → 트랜잭션 적용 안됨
    }

    public void methodB() {
        // 트랜잭션 적용 안됨
    }
}