Backend/Java

@Transactional

개발자의 첫 걸음 2025. 9. 4. 10:00

안녕하세요. 오늘은 제가 코딩 연습하다가

 

하나의 어노테이션 때문에 고생을 했는데요. 이 친구를 소개해볼까 해요.

 

 

 

@ 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