습관적으로 서비스 레이어에서 @Transactional 을 많이 사용하였다. @Transactional 에 대해 얕게 알아보면 좋을 것 같다.
원자성과 안정성 보장
트랜잭션은 원자성(Atomicity)을 보장한다. 즉, 트랜잭션 내에서 모든 작업은 성공하면 커밋하고, 실패하면 롤백된다. 이로써 데이터베이스의 안전성을 유지할 수 있다.
트랜잭션과 영속성 컨텍스트
스프링 JPA는 영속성 컨텍스트를 사용하여 엔티티 객체와 데이터베이스 간의 상호작용을 관리한다.
@Transactional 이 있는 경우, db의 변경 사항을 곧바로 데이터 베이스에 업데이트 하지 않는다. 트랜잭션 종료 시, 영속성 컨텍스트는 엔티티의 상태를 확인하고 변경된 내용을 데이터베이스에 반영한다.
Readonly 트랜잭션
readOnly 속성을 true로 설정하면 해당 트랜잭션은 읽기 전용으로 동작한다. 이렇게 하면 트랜잭션 Commit 시 영속성 컨텍스트가 자동으로 flush되지 않아 예상치 못한 수정을 방지할 수 있다. 또한 초기 데이터에 대해 저장할 필요가 없어 메모리 절약도 된다. 뿐만 아니라 Slave DB에서 데이터를 가져오도록 동작할 수 있다.
클래스 레별에 적용
@Transactional은 클래스 레벨에도 적용할 수 있다. 이렇게 하면 해당 클래스의 모든 메서드에 트랜잭션 처리가 자동으로 적용된다. 서비스 클래스 등에서 사용하면 트랜잭션의 범위를 쉽게 관리할 수 있다.
롤백 관리
트랜잭션 롤백은 예외가 발생했을 때 자동으로 처리된다. 하지만 롤백을 원하는 특정 예외가 있을 경우 `@Transactional` 어노테이션에 `rollbackFor` 속성을 사용하여 롤백 대상 예외를 명시할 수 있다.
[참고한 글]
'Backend > Java Spring' 카테고리의 다른 글
[Java] 제너릭(Generic) (0) | 2023.11.17 |
---|---|
[Java] 직렬화와 역직렬화 (0) | 2023.11.15 |
[Java] 공유 중인 가변 데이터 (0) | 2023.11.12 |
[Spring] singleton scope (0) | 2023.11.05 |