공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 15 / 22

@Transactional 심화

전파·격리·readOnly·롤백 규칙·self-invocation·REQUIRES_NEW·락
섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

4. 응용 변형 예제

4.1 실제 Spring 코드로 보면 이렇습니다

java
@Service
public class AccountServiceImpl implements AccountService {

    @Transactional(rollbackFor = Exception.class)
    public void transfer(String from, String to, int amount) throws AuditException {
        // ...
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logFailure(String message) {
        // 바깥이 롤백돼도 이 로그는 남는다
    }
}

이 레슨의 Tx.Transactional 과 Tx.proxy() 는 위 코드가 스프링 내부에서 어떤 순서로 처리되는지를 최소 구현으로 보여 준 것입니다.

4.2 self-invocation 회피 세 가지 비교

방법 코드 위치 비고
자기 프록시 주입 같은 클래스, self 필드 이 레슨이 쓰는 방식
AopContext.currentProxy() 같은 클래스 exposeProxy=true 필요
메서드를 별도 빈으로 분리 다른 클래스 가장 명확하지만 클래스 증가

4.3 낙관적 락 버전 컬럼 예시

java
// MyBatis: 조회한 버전과 다르면 0건 갱신 -> 충돌로 판단
int updated = accountMapper.updateWithVersion(id, newBalance, seenVersion);
if (updated == 0) {
    throw new OptimisticLockException("다른 트랜잭션이 먼저 수정했습니다");
}

비관적 락처럼 대기하지 않는 대신, 실패 시 재시도 로직을 호출자가 준비해야 합니다.

응용 변형 예제
  • 4.1 실제 Spring 코드로 보면 이렇습니다
  • 4.2 self-invocation 회피 세 가지 비교
  • 4.3 낙관적 락 버전 컬럼 예시
이전 섹션3 코드 예제4 / 7다음 섹션5 자주 하는 실수 (Tip)