Skip to content

Commit bd8242a

Browse files
f-lab-pizclaude
andcommitted
docs: README에 Alembic 마이그레이션 가이드 추가
- Alembic 소개 및 주요 명령어 정리 - 마이그레이션 생성, 적용, 상태 확인 방법 - 스키마/데이터 마이그레이션 예시 코드 - 무중단 배포와의 통합 설명 - 트러블슈팅 가이드 내용 구성: 1. Alembic이란? - 개념 소개 2. 주요 명령어 - 로컬/Docker 실행 방법 3. 마이그레이션 파일 구조 4. 실제 마이그레이션 예시 (스키마/데이터) 5. 무중단 배포와의 통합 6. 트러블슈팅 (충돌, 실패 처리) 사용자 편의: - 복사 가능한 명령어 예시 - 실제 프로젝트 파일 참조 - plan.md 상세 학습 내용 연결 이제 사용자가 README만 보고도 Alembic을 실전에서 바로 사용할 수 있습니다. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent a4ff441 commit bd8242a

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed

README.md

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,138 @@ localhost:8089 에 접속해서 http://localhost 에 요청 보내기 시작.
223223
# 터미널 2: 배포 실행
224224
./deploy.sh
225225
```
226+
227+
## 데이터베이스 마이그레이션 (Alembic)
228+
229+
### Alembic이란?
230+
231+
Alembic은 SQLAlchemy를 위한 데이터베이스 마이그레이션 도구입니다. 데이터베이스 스키마 변경을 버전 관리하고, 여러 환경에서 일관되게 적용할 수 있습니다.
232+
233+
### 주요 명령어
234+
235+
```bash
236+
# 로컬에서 실행 (개발 시)
237+
DATABASE_URL="postgresql://user:password@localhost:5433/testdb" python3 -m alembic <command>
238+
239+
# Docker 컨테이너에서 실행 (배포 시)
240+
docker-compose run --rm app1 alembic <command>
241+
```
242+
243+
#### 마이그레이션 생성
244+
245+
```bash
246+
# 스키마 변경 자동 감지하여 마이그레이션 생성
247+
alembic revision --autogenerate -m "설명"
248+
249+
# 수동 마이그레이션 생성 (데이터 변환 등)
250+
alembic revision -m "설명"
251+
```
252+
253+
#### 마이그레이션 적용
254+
255+
```bash
256+
# 최신 버전으로 업그레이드
257+
alembic upgrade head
258+
259+
# 특정 리비전으로 업그레이드
260+
alembic upgrade <revision_id>
261+
262+
# 한 단계 롤백
263+
alembic downgrade -1
264+
265+
# 특정 리비전으로 다운그레이드
266+
alembic downgrade <revision_id>
267+
```
268+
269+
#### 마이그레이션 상태 확인
270+
271+
```bash
272+
# 현재 적용된 마이그레이션 확인
273+
alembic current
274+
275+
# 마이그레이션 히스토리 확인
276+
alembic history
277+
278+
# 적용되지 않은 마이그레이션 확인
279+
alembic heads
280+
```
281+
282+
### 마이그레이션 파일 구조
283+
284+
```
285+
alembic/
286+
├── env.py # Alembic 환경 설정
287+
├── script.py.mako # 마이그레이션 템플릿
288+
└── versions/ # 마이그레이션 파일들
289+
├── 0fee3ec0c79f_initial_migration_create_items_table.py
290+
├── 211d1fe6d912_add_price_and_stock_columns_to_items_.py
291+
└── f25407aec7a2_set_default_values_for_existing_items.py
292+
```
293+
294+
### 마이그레이션 예시
295+
296+
#### 1. 스키마 마이그레이션 (자동 생성)
297+
298+
```python
299+
# alembic/versions/211d1fe6d912_add_price_and_stock_columns_to_items_.py
300+
def upgrade() -> None:
301+
op.add_column('items', sa.Column('price', sa.Numeric(precision=10, scale=2), nullable=True))
302+
op.add_column('items', sa.Column('stock', sa.Integer(), nullable=True))
303+
304+
def downgrade() -> None:
305+
op.drop_column('items', 'stock')
306+
op.drop_column('items', 'price')
307+
```
308+
309+
#### 2. 데이터 마이그레이션 (수동 작성)
310+
311+
```python
312+
# alembic/versions/f25407aec7a2_set_default_values_for_existing_items.py
313+
def upgrade() -> None:
314+
op.execute("UPDATE items SET stock = 0 WHERE stock IS NULL")
315+
op.execute("UPDATE items SET price = 1000.00 WHERE price IS NULL")
316+
317+
def downgrade() -> None:
318+
pass # 데이터 마이그레이션은 롤백이 어려움
319+
```
320+
321+
### 무중단 배포와 마이그레이션
322+
323+
배포 스크립트([deploy.sh](deploy.sh))는 자동으로 마이그레이션을 실행합니다:
324+
325+
```
326+
1. 이미지 빌드
327+
2. 데이터베이스 마이그레이션 실행 ← alembic upgrade head
328+
3. app1 배포
329+
4. app2 배포
330+
```
331+
332+
**하위 호환 마이그레이션 원칙:**
333+
- ✅ 컬럼 추가는 `nullable=True`로 설정
334+
- ✅ 인덱스 추가는 안전
335+
- ⚠️ 컬럼 삭제, NOT NULL 제약은 2단계 배포 필요
336+
337+
### 트러블슈팅
338+
339+
#### 마이그레이션 충돌
340+
341+
```bash
342+
# 현재 상태 확인
343+
alembic current
344+
345+
# 마이그레이션 히스토리 확인
346+
alembic history
347+
348+
# 특정 리비전으로 강제 설정 (주의!)
349+
alembic stamp <revision_id>
350+
```
351+
352+
#### 마이그레이션 실패 시
353+
354+
마이그레이션은 트랜잭션 내에서 실행되므로 실패 시 자동 롤백됩니다. 하지만 배포는 중단되므로:
355+
356+
1. 오류 로그 확인
357+
2. 마이그레이션 파일 수정
358+
3. 다시 배포 실행
359+
360+
더 자세한 학습 내용은 [plan.md](plan.md)의 "6단계: Alembic 데이터베이스 마이그레이션" 섹션을 참고하세요.

0 commit comments

Comments
 (0)