저번 시간에 이어, 이번엔 Spring의 @Transactional Annotation 질문에 대해 알아보겠습니다. 이번 질문은, 제가 서비스 플랫폼 기업 K사에서도 받은 질문인데요, 써본 경험은 있지만 이것에 대해 표현해볼 생각은 안 해봤어서 얼버무렸던 기억이 납니다. 한 번 정리해서 간단하게 대비해보시길 권합니다.
Q: 스프링의 @Transactional 어노테이션에 대해서 아시나요?
스프링에서 트랜잭션을 처리하는 어노테이션으로 선언적 트랜잭션이라고 부르며, 범위 내에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit/rollback을 진행해줍니다.
Q: @Transactional의 옵션에 대해 아는대로 말씀해주세요
- isolation : 트랜잭션에서 일관성 없는 데이터 허용 수준을 설정합니다.
- propagation : 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정합니다.
- noRollbackFor : 특정 예외 발생 시 rollback 하지 않습니다.
- rollbackFor : 특정 예외 발생 시 rollback합니다.
- timeout : 지정한 시간 내에 메서드 수행이 완료되지 않으면 rollback 합니다.
- -1일 경우 timeout을 사용하지 않습니다.
- readOnly : 트랜잭션을 읽기 전용으로 설정합니다.
Q: Transaction의 개념과 @Transactional이 어떤 역할을 하는지 설명해주세요
Transaction은 DB 연산의 논리 단위로, 하나 이상의 작업이 모두 성공하거나 실패하는 것을 보장합니다. @Transactional은 이러한 Transaction을 관리할 때 사용되고 해당 어노테이션이 붙은 메서드가 실행될 때 트랜잭션의 시작/커밋/롤백 등을 자동으로 처리해줍니다.
Q: @Transactional 어노테이션 적용 범위는 어떻게 되나요? 메서드만 가능할까요?
아닙니다. 메서드 수준 사용이 일반적이긴 하지만, 클래스 수준에서도 적용할 수 있습니다. 클래스에 적용하면 클래스 내의 모든 public 메서드에 동일한 Transaction 설정이 적용됩니다.
마치며
@Transactional 어노테이션에 대해 알아보았습니다. Spring에서는 트랜잭션 처리를 위해 선언적 트랜잭션을 사용하며, XML 설정이나 위에서 알아본 어노테이션 설정을 사용합니다. 어노테이션 기반 AOP로 구현되었다는 특징이 있으며, 주요 Business Logic과는 독립적으로 작동하여 관심사를 분리하고 개발할 수 있습니다.
다음 시간에는 Spring Bean에 대해 알아보겠습니다.
답글 남기기