@@ -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