EF Core 실무 Migration 배포 전략 질문 드립니다.

안녕하세요.

현재 ASP.NET Core & EF Core 6 를 이용하여 프로젝트를 개발하고 있는 사람입니다.

다름이 아니라, 실제 개발한 서비스를 고객에게 배포를 해야 되는 날이 다가 오고 있는데, EF Core 마이그레이션 배포 전략에 대해서 막막해서 이렇게 질문을 드리게 되었습니다.

우선 Database 는 PostgreSQL Docker Container 로 실행하여 고객 Server 에 배포할 예정입니다.

모든 DB 정보는 로컬에 볼륨 마운트를 하여 데이터를 저장하여 가지고 있을 예정입니다.

1차로 PostgreSQL Docker Container 가 실행 되면, EF Core 의 엔티티 정보들을 마이그레이션 하여 적용시킬 예정입니다.

하지만 만약 1차 Migration 정보 적용 후, 엔티티의 속성이 변경 및 추가가 되면 Database 에 해당 변경 이력을 적용해야 하는데, EF Core 에서는 어떤 식으로 DB 에 배포 전략을 반영하는지 감이 오지 않아서 질문 드립니다.

잠시 Database 서버를 중단하고, 데이터를 백업 한 상태에서 Migration 정보를 적용하면 되는지, 아니면 DB 정지가 필요 없이 그냥 바로 마이그레이션이 되는지 등등 선배님들의 경험 및 조언이 궁금하여 글 남깁니다.

감사합니다.

2개의 좋아요

안녕하세요.

저도 동일하게 서비스를 개발하고 배포를 준비하고 있습니다. 그래서 관련 자료를 찾아 봤었고 아래 공유드립니다.

SQL scripts | Applying Migrations - EF Core | Microsoft Docs

Apply migrations at runtime | Applying Migrations - EF Core | Microsoft Docs

EF Core tools reference (.NET CLI) - EF Core | Microsoft Docs

요약하자면, MS는 production에서 migration을 할 때는 dotnet ef 도구로 SQL Script를 추출하여 DB에 적용하는 방법을 추천하고 있습니다.

그리고 donet ef 도구로 만들어진 migration 코드는 오류가 있을 수 있으므로 반드시 적용 결과를 확인하라고 안내하고 있습니다.

Whatever your deployment strategy, always inspect the generated migrations and test them before applying to a production database. A migration may drop a column when the intent was to rename it, or may fail for various reasons when applied to a database.

위 시나리오로 생각했을 때 migration 순서는 다음과 같지 않을까요?

  1. 서버 중단
  2. SQL Script 반영
  3. 서버 이미지 변경
  4. 서버 시작

쉽게 해결하는건 context.Database.Migrate() 코드를 사용하는 것이며 MS는 추천하지 않고 있습니다.

Warning

  • Carefully consider before using this approach in production. Experience has shown that the simplicity of this deployment strategy is outweighed by the issues it creates. Consider generating SQL scripts from migrations instead.
  • Don’t call EnsureCreated() before Migrate(). EnsureCreated() bypasses Migrations to create the schema, which causes Migrate() to fail.

무중단은 저도 경험이 미천하여 아이디어로 떠오르는건 DB 2개와 서버 2개를 준비하고 하는 방법만 떠오르네요…

7개의 좋아요

정성스럽게 조언해 주셔서 감사합니다!ㅎㅎ

한번 김예건 선배님께서 조언해 주신 대로 저도 배로 전략 수립해 보도록 하겠습니다!

도와주셔서 감사합니다!ㅎㅎ

1개의 좋아요

도움이 되셨다니 다행이네요. :smile:

2개의 좋아요

질문에 대한 답변으로는 조금 결이 틀리겠지만…
저 같은 경우는 SQL SERVER를 리눅스 도커에서 사용중입니다.
그리고, efcore를 사용하지 않는 중입니다.
sql database project로 변경사항을 적용하는 방법을 사용중입니다.
제 경우엔 이 방법이 작업하기 편했습니다.

1개의 좋아요