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은 자동 커밋되므로 제외) |
💡 핵심: 트랜잭션의 생명주기
- Begin: 트랜잭션 시작. (이제부터 하는 건 한 묶음이야!)
- Operation: DML 쿼리들 수행. (DB 메모리 상에서만 변경됨, 아직 실제 파일엔 안 써짐)
- Commit: 문제 없으면 저장. (실제 DB 파일에 기록)
- 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 작업만 딱 묶어서 트랜잭션을 짧게 가져가세요.
예상 꼬리 질문 정리
- "교착 상태(Deadlock)란 무엇이며, 트랜잭션에서 언제 발생하나요?"
- (두 트랜잭션이 서로 상대방이 점유한 자원(Lock)을 기다리며 무한 대기하는 상태 설명)
- "트랜잭션 격리 수준(Isolation Level)에 따라 발생할 수 있는 문제들은 무엇인가요?"
- (Dirty Read, Phantom Read 등 동시성 문제 설명)
- "스프링에서 트랜잭션 전파(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 |