Daily Dev Q&A: 트랜잭션 (Transaction)

2025. 12. 22. 08:48·Archive/Daily Dev Q&A

Topic (오늘의 주제)

트랜잭션 (Transaction)

: 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위. (쪼개질 수 없는 업무 처리의 최소 단위)

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 여러 단계로 이루어진 작업(예: 결제 = 재고 감소 + 포인트 사용 + 주문 생성) 중 하나라도 실패했을 때, 데이터가 꼬이는 것(정합성 깨짐)을 막기 위해 사용한다.
  • 구조적 의미: "모두 성공하거나, 아니면 아예 없던 일로 하거나(All or Nothing)"를 보장하여 시스템의 안정성을 확보한다.
  • 면접 의도: 데이터 무결성을 어떻게 지키는지, 그리고 프레임워크(Spring 등)에서 트랜잭션을 어떻게 제어하는지 아는지 확인한다.

Core Concept (핵심 개념 정리)

요소 내용
개념 정의 DB에서 한 번에 수행되어야 할 일련의 연산들을 묶은 것.
제어 명령어 (TCL) Commit: 트랜잭션 작업을 성공적으로 마치고 DB에 영구 반영.

Rollback: 작업 중 문제가 발생하여 트랜잭션 시작 전 상태로 되돌림.

Savepoint: 롤백할 때 특정 지점까지만 되돌릴 수 있도록 저장점 설정.
상태 변화 Active (활동): 트랜잭션 실행 중.

Partially Committed (부분 완료): 마지막 연산까지 실행했으나 Commit 전.

Committed (완료): 성공적으로 Commit 됨.

Failed (실패): 오류 발생.

Aborted (철회): Rollback 되어 종료됨.
필요 조건 DML(INSERT, UPDATE, DELETE) 명령어들이 트랜잭션의 대상이 된다. (DDL은 자동 커밋되므로 제외)

💡 핵심: 트랜잭션의 생명주기

  1. Begin: 트랜잭션 시작. (이제부터 하는 건 한 묶음이야!)
  2. Operation: DML 쿼리들 수행. (DB 메모리 상에서만 변경됨, 아직 실제 파일엔 안 써짐)
  3. Commit: 문제 없으면 저장. (실제 DB 파일에 기록)
  4. Rollback: 에러 나면 취소. (메모리에 있던 변경 사항 삭제)

Interview Answer Version (면접 답변식 요약)

"트랜잭션은 데이터베이스에서 하나의 논리적인 기능을 수행하기 위한 작업의 단위입니다.

핵심은 'All or Nothing'입니다. 여러 개의 쿼리가 묶여 있을 때, 모두 성공하면 Commit하여 결과를 반영하고, 하나라도 실패하면 Rollback하여 작업을 취소함으로써 데이터의 정합성을 보장하는 역할을 합니다."

Practical Tip (사용시 주의할 점 or 활용 예)

1. Spring @Transactional의 롤백 규칙 (Java 개발자 필수!)

스프링에서 @Transactional 어노테이션을 쓸 때 가장 많이 하는 실수입니다.

  • 기본 동작: RuntimeException (Unchecked Exception)이 발생하면 자동 롤백됩니다.
  • 함정: Exception (Checked Exception)이 발생하면 롤백되지 않습니다.
  • 해결: 체크 예외(Checked Exception)에서도 롤백하고 싶다면 rollbackFor 옵션을 써야 합니다.
  • Java
    @Transactional(rollbackFor = Exception.class) // 모든 예외 발생 시 롤백
    public void processPayment() throws Exception { ... }
    

2. 트랜잭션 범위는 최소화하라

트랜잭션이 시작되면 DB 커넥션을 계속 붙잡고 있습니다.

  • Bad: 외부 API 호출, 파일 업로드 등 오래 걸리는 작업을 트랜잭션 안에 넣으면 DB 커넥션 풀이 말라서 서버가 멈출 수 있습니다.
  • Good: DB 작업만 딱 묶어서 트랜잭션을 짧게 가져가세요.

예상 꼬리 질문 정리

  1. "교착 상태(Deadlock)란 무엇이며, 트랜잭션에서 언제 발생하나요?"
    • (두 트랜잭션이 서로 상대방이 점유한 자원(Lock)을 기다리며 무한 대기하는 상태 설명)
  2. "트랜잭션 격리 수준(Isolation Level)에 따라 발생할 수 있는 문제들은 무엇인가요?"
    • (Dirty Read, Phantom Read 등 동시성 문제 설명)
  3. "스프링에서 트랜잭션 전파(Propagation) 속성에 대해 들어본 적 있나요?"
    • (기존 트랜잭션에 참여할지, 새로 만들지 결정하는 REQUIRED, REQUIRES_NEW 등의 옵션)

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: IoC & DI  (0) 2025.12.26
Daily Dev Q&A: Spring Framework  (0) 2025.12.23
Daily Dev Q&A: DDL, DML, DCL  (0) 2025.12.18
Dailly Dev Q&A: 정규화  (0) 2025.12.18
Daily Dev Q&A: 자바의 람다 표현식  (0) 2025.12.16
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: IoC & DI
  • Daily Dev Q&A: Spring Framework
  • Daily Dev Q&A: DDL, DML, DCL
  • Dailly Dev Q&A: 정규화
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Spring비교
    network
    경기기후바이브코딩
    REACT
    프로덕트개발자
    SpringBoot
    클로드코드
    OrphanRemova
    java
    프로젝트회고
    til
    jpa
    backend
    aws_s3
    DevFestIncheon2025
    spring
    devlog
    Project_Review
    데브페스트
    커리어리셋
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 트랜잭션 (Transaction)
상단으로

티스토리툴바