@Transactional 어노테이션은 스프링 프레임워크에서 데이터베이스 트랜잭션을 관리하는 데 사용되는 핵심 어노테이션입니다.
기본적인 사용 방법은 다음과 같습니다:
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Transactional
public void createUser(User user) {
// 사용자 생성 로직
}
}
트랜잭션의 경계를 어떻게 설정할지 결정합니다.
@Transactional(propagation = Propagation.REQUIRED)
public void someMethod() {
// 메소드 내용
}
주요 전파 옵션:
REQUIRED: 기본값. 활성 트랜잭션이 없으면 새로 생성, 있으면 참여.REQUIRES_NEW: 항상 새로운 트랜잭션을 시작.SUPPORTS: 활성 트랜잭션이 있으면 참여, 없으면 트랜잭션 없이 실행.NOT_SUPPORTED: 트랜잭션 없이 실행, 활성 트랜잭션이 있으면 일시 중지.트랜잭션 간의 격리 수준을 설정합니다.
@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {
// 메소드 내용
}
주요 격리 수준:
DEFAULT: 데이터베이스의 기본 격리 수준 사용.READ_UNCOMMITTED: 커밋되지 않은 데이터 읽기 가능.READ_COMMITTED: 커밋된 데이터만 읽기 가능.REPEATABLE_READ: 동일 데이터를 여러 번 읽을 때 일관성 보장.SERIALIZABLE: 가장 높은 격리 수준, 성능 저하 가능성 있음.트랜잭션의 제한 시간을 설정합니다.
@Transactional(timeout = 30)
public void someMethod() {
// 메소드 내용
}
읽기 전용 트랜잭션을 설정합니다.
@Transactional(readOnly = true)
public User getUser(Long id) {
// 사용자 조회 로직
}
특정 예외에 대해 롤백 동작을 지정합니다.
@Transactional(rollbackFor = CustomException.class)
public void someMethod() throws CustomException {
// 메소드 내용
}
@Transactional이 적용된 빈에 대해 프록시를 생성합니다.@Transactional은 기본적으로 public 메소드에만 적용됩니다.@Transactional 메소드를 호출할 경우 트랜잭션이 적용되지 않습니다.readOnly = true를 사용하여 성능을 최적화하세요.@Transactional 어노테이션이 적용된 메소드를 테스트할 때는 다음과 같이 할 수 있습니다:
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Autowired
private UserRepository userRepository;
@Test
@Transactional
void testCreateUser() {
User user = new User("test@example.com");
userService.createUser(user);
User foundUser = userRepository.findByEmail("test@example.com");
assertNotNull(foundUser);
assertEquals("test@example.com", foundUser.getEmail());
}
}
@Transactional 어노테이션은 스프링에서 데이터 일관성과 무결성을 유지하는 데 필수적인 도구입니다. 이를 통해 개발자는 선언적으로 트랜잭션을 관리할 수 있으며, 비즈니스 로직에 더 집중할 수 있습니다. 그러나 그 동작 원리와 제약사항을 잘 이해하고 사용해야 하며, 적절한 설정과 테스트가 중요합니다.
@Repository
@Service
@Configuration
@EnableTransactionManagement
@Bean