회고: ASP.NET Core 3.0 웹 응용프로그램을 도커 컨테이너로 실행

ASP.NET Core 3.0 웹 응용프로그램을 도커 컨테이너로 실행하는 외주 작업 회고입니다.

작업기간: 일주일
비용: 비공개

목표

ASP.NET 2.0 프로젝트를 ASP.NET Core 3.0 으로 대상 프레임워크 변경해서 Ubuntu 서버에서 도커 컨테이너로 실행합니다.

컨테이너 요약

웹 응용프로그램

웹사이트 형식의 ASP.NET 2.0 프로젝트를 ASP.NET Core 3.0 으로 대상 프레임워크를 변경하고, 리팩터링합니다.

  • 사용되지 않는 코드를 제거합니다.
  • 상수를 한 곳으로 모아서 관리하기 편하도록 합니다.
  • 구성값으로 처리하면 관리에 도움이 되는 상수는 구성값으로 분리합니다.
  • IoC 를 적용해서 클래스간 의존도를 낮추도록 노력합니다.
  • .NET Core 로 데이터베이스 프로바이더가 제공되는 데이터베이스를 모두 지원할 수 있도록 데이터 처리 계층을 분리합니다.
  • 응답 데이터는 text/xml 또는 application/json 중 하나를 기본값으로 지정할 수 있어야 하고, 요청 헤더 Accept 에 따라 처리되어야 합니다.
  • 모든 엔드포인트는 미들웨어에서 처리합니다.

⚠ 응용프로그램을 가상화하지 않고, ASP.NET Core 3.0 런타임 이미지를 사용해서 컨테이너를 실행하고, 로컬 디렉터리를 마운트해서 ASP.NET Core 웹 응용프로그램을 실행합니다.

ASP.NET Core 웹 응용프로그램은 호스트 장치에서 빌드, 동작 확인 후 게시합니다.
게시 위치는 ASP.NET Core 런타임 컨테이너에 마운트된 디렉터리입니다.

게시

Nginx 를 역방향 프록시 서버로 사용합니다.
Nginx 도 도커 컨테이너로 실행합니다.

데이터베이스

대상 데이터베이스를 Microsoft SQL Server 에서 MySQL Server로 변경하려고 하였으나, 저장 프로시져를 재작성해야 해서 대상 데이터베이스는 Microsoft로 지정합니다.

MySQL Server 에서 사용할 저장 프로시져 작성 후 사용할 수 있도록 데이터베이스 변경에 대한 지원이 필요합니다.

Microsoft SQL Server 도 도커 컨테이너로 실행합니다.

진행

기존 프로젝트에 대한 설명을 자세하게 해주셔서 코드 확인을 큰 문제없이 진행했습니다.

슬랙노션으로 자료를 잘 정리해 주셨습니다.

코드 재작성 후 Hyper-V 에서 Ubuntu 18.04 를 실행하고, 세개의 도커 컨테이너로 동작을 확인한 후 전달 해드리고 프로젝트를 마무리했습니다.

ASP.NET Core 3.0

미들웨어로 요청을 처리합니다.

요청 본문 데이터 정의
IDictionary<string, string> 으로 결정

응답 본문 데이터 정의
– 처리 결과 데이터로 결정

요청 본문의 데이터를 객체로 변환하는 변환기 작성

  • .NET Core 3.0 에 추가된 System.Text.Json 네임스페이스 사용
  • .NET Core 3.0 의 System.Text.Json 네임스페이스의 기본 직렬화 처리기로 IDictionary<stirng, string> 또는 IDictionary<string, object> 처리 불가능합니다. ➡ 역직렬화를 위해 Json 변환기 작성
  • 요청 내용의 형식에 따른 분기 필요 application/json 또는 multipart/form-data
public class RequestModelJsonConverter : JsonConverter<RequestModel>
{
    public override RequestModel Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // ❤❤❤
    }
}

처리 결과 객체를 응답 본문의 내용으로 변환하는 변환기 작성
– .NET core 3.0 에 추가된 System.Text.Json 네임스페이스 사용
– XML 직렬화 처리기 작성
– Json 직렬화 처리기 작성

public interface ISerializer
{
    string Serialize(ResponseModel model);
}
public class XmlSerializer : ISerializer
{
    public string Serialize(ResponseModel model)
    {
        // ❤❤❤
    }
}
public class JsonSerializer : ISerializer
{
    public string Serialize(ResponseModel model)
    {
        // ❤❤❤
    }
}

기능 기반 클래스 설계

  • 파일 처리
  • 데이터 처리
  • 데이터베이스 질의
  • 그 외 …

마무리

docker-compose.yml 파일 전달

  • Nginx 컨테이너
  • ASP.NET Core 3.0 runtime 컨테이너
  • Microsoft SQL Server 컨테이너

docker-compose 로 세개의 컨테이너를 순차적으로 실행할 때, 문제가 발생해서 각각 실행하는 것으로 마무리합니다.

노션으로 문서화

따라하기 형식의 문서를 노션으로 작성하여 전달합니다.

회고

이렇게 잘 지원해주시는 분과 작업을 한다면 외주 작업만 해도 좋을 것 같아요. ❤❤❤

댓글 남기기