
안녕하세요. 오늘은 제가 코딩 연습하다가
하나의 어노테이션 때문에 고생을 했는데요. 이 친구를 소개해볼까 해요.
@ Transactional
Transactional은 트랜잭션 제어용 어노테이션으로
DB 작업을 하나의 단위로 묶어 처리하는데요.
중간에 오류 나면 롤백(rollback), 문제없으면 커핏(commit)을 해줘요.
그런데 왜 고생을 했으냐고 한다면
이 어노테이션 뒤에 (readOnly = true) 적용 시
읽기 전용 트랜잭션 생성으로 읽기만 가능하고 수정이 불가능하게 돼요.
만약 어노테이션이 적용 후 수정하게 될 경우에 오류가 발생하게 됩니다.
// 예제 코드
@Transactional(readOnly = true)
public void someMethod() {
stockRepository.findStockByProductIdForUpdate(...); // 💥 여기서 오류 발생
}
해결 방법
1. readOnly = false로 변경 (기본값)
// 예제 코드
@Transactional // 또는 @Transactional(readOnly = false)
public void someMethod() {
stockRepository.findStockByProductIdForUpdate(...);
}
2. 필요한 메서드에만 어노테이션 @Transactional 분리
읽기 전용은 그대로 두고, 쓰기 작업이 필요한 부분만 트랜잭션 적용으로 분리가 가능해요.
@Transactional(readOnly = true)
public void readOnlyMethod() {
...
updateStock(); // 별도의 쓰기 트랜잭션
}
@Transactional // readOnly = false
public void updateStock() {
stockRepository.findStockByProductIdForUpdate(...);
}
Tansactional 어노테이션 원인과 해결책의 간단 정리
| 코드 오류 원인 | 해결책 |
| @Transactional(readOnly = true) 안에서 FOR UPDATE 실행 | @Transactional에서 readOnly = false 또는 생략 |
| 트랜잭션 분리가 필요한 경우 | 읽기용과 쓰기용 메소드 따로 분리 |

여기까지 간단하게 @Transactional에 대해 알아봤는데요.
코드 실행을 하시고 수정이 안된다면
한 번은 이 친구를 적용시킨 코드를 확인해 보는 건 어떨까요?
'Backend > Java' 카테고리의 다른 글
| Spring Security OAuth2 (0) | 2025.12.08 |
|---|---|
| RESTful API (0) | 2025.09.07 |
| Spring Security - Filter, Provider, Config (0) | 2025.09.02 |
| Spring Boot - JWT (0) | 2025.08.31 |
| Spring Security (2) | 2025.08.29 |