이 게시글은 최근 치렀던 코딩 테스트를 회고하는 게시글입니다. 떨어졌지만, 정말 많은 것을 얻었습니다.
이 게시글에서는 아래 내용을 담습니다.
먼저 이 글은 과제형 테스트를 수행한 소개를 위주로 말씀드리고자 합니다(사실 DDD나 클린 아키텍처 등을 하나의 게시글로 요약하기도 힘들겠죠). 보다 상세한 내용은 연재글로 다시 기록하겠습니다. 1 2
본 과제를 수행하며 이름으로만 듣던 DDD(Domain-driven Design)를 접하게 되었습니다. DDD는 Eric Evans가 제시한 개념입니다. 소프트웨어 설계를 회사(혹은 단체)와 연관있는 일련의 요구사항(비즈니스)을 표현하기 위한 “도메인”이란 단어로 묶어 설계하는 소프트웨어 설계 기법입니다. 도메인은 “(지식·활동의) 영역[분야], (책임의) 범위” 를 의미하지요. 즉, 개발하고자 하는 일련의 아키텍처를 도메인 간의 상호작용으로 이해하고 풀어나가는 방식입니다. 이를 적용하기 위해 자연스럽게 객체지향 패러다임으로 접근하게 되었습니다.
저는 과제에 필요한 도메인을 설계하고, 이를 그림으로 묶었습니다. 이후 설계방법에 대한 방향성을 잡고, 클린 아키텍처와 Hexagonal Architecture(aka. Ports and Adapters Architecture, 이하 헥사고널 아키텍처) 를 참고하였습니다. 그 키워드를 토대로 프로젝트를 구성하였습니다. 3
본 과제를 수행하며 참고한 프로젝트 5개를 소개드리고자 합니다. 모두 파이썬으로 구성되어 있습니다. 추후 DDD 및 클린아키텍처, 나아가 헥사고널 아키텍처를 연재하며 해당 프로젝트를 다시 살펴보도록 하겠습니다.
과제 전반을 보고, 도메인이 어떻게 흘러갈지를 결정해야겠지요. 저는 우선 도메인이 어떻게 흐르는지에 먼저 집중했습니다. 4 아래와 같은 도표를 통해 전체 프로젝트가 어떻게 구상될지 이해하였습니다.
여기까지 정리하고 코드를 쌓는 사항이 가장 오래 걸렸습니다. 정말 오랜만에 학습과 설계를 동시에 하다보니, 노트로 적어가며 필수개념들을 해제했었네요.
FIRST 원칙에 맞게 내 로직을 방어할 수 있는 코드가 있다면 그것만큼 든든한게 없죠. 클린 아키텍처, 헥사고널 아키텍처에서도 마찬가지입니다. 각 레이어별로 필요한 테스트는 반드시 존재해야 한다고 생각했고, 이에 따라 디렉토리를 구성하였습니다. 각각 도메인 레이어 테스트, 인프라스트럭처 레이어 테스트, 서비스 레이어 테스트, e2e 테스트로 나누었고 공통 코드를 util
디렉토리로 빼서 이 쪽을 바라보도록 했습니다.
본 과제에서는 아래와 같은 디렉토리 구조로 구상하였습니다:
.
└── tests
├── modules
│ ├── DOMAIN01
│ │ ├── domain
│ │ └── e2e
│ ├── DOMAIN02
│ │ ├── domain
│ │ ├── e2e
│ │ ├── factories
│ │ ├── infrastructure
│ │ └── service
│ └── DOMAIN03
│ ├── domain
│ ├── e2e
│ └── factories
└── utils
코드 규칙에 대한 추가사항을 정의했습니다.
서비스 레이어에서 커맨드와 쿼리를 별도로 분리해두었습니다.
필요에 따른 분기별 로직 처리를 STRATEGY 패턴으로 풀어보았습니다.
인프라스트럭처 레이어에 쓰이는 기술들은 아래와 같이 선택했습니다.
PostgreSQL
을, 인메모리 DB에는 Redis
를 사용하였습니다(Redis는 시간상의 문제로 구현까지는 생각하지 못하였습니다).Kafka
혹은 레퍼런스가 많은 RabbitMQ
를 생각하였습니다(이 또한 제한 시간 내에는 구현하지 못했네요).표현 레이어에 사용할 웹 프레임워크는 FastAPI를 사용하였습니다.
Gunicorn
매니저 프로세스와 uvicorn
프로세스들을 경우에 맞게 확장하여 Throughput을 확장하도록 구성했습니다.이후, 최종적으로 아래와 같은 디렉토리 구조를 구상하였습니다: 5
.
├── api
│ └── endpoints
├── config
├── modules
│ ├── DOMAIN01
│ │ ├── application
│ │ ├── domain
│ │ └── infrastructure
│ │ │ └── postgres
│ │ │ └── models
│ ├── DOMAIN02
│ │ ├── application
│ │ ├── domain
│ │ │ └── OBJECT01 # [5]
│ │ │ └── helpers
│ │ └── infrastructure
│ │ └── postgres
│ │ ├── models
│ │ └── repositories
│ └── DOMAIN03
│ │ ├── application
│ │ ├── domain
│ │ └── infrastructure
│ │ └── postgres
│ │ ├── models
│ │ └── repositories
│ └── common
└── tests
│ └── ...(아래에 테스트코드 구조를 그대로)
└── utils
mermaid.js
를 통한 도식 표현간단한 도식을 표현하는데는 mermaid.js 만한 도구가 없지요. 복잡해진다면 복잡해질 수록 전문 툴을 사용하는 것이 맞으나, 간단히 처리하는 데는 이만한 녀석이 없습니다.
HTTP Client
마침 이런 도구를 최근에 학습하였고, 빠르게 IDE 내에서 바로 사용할 수 있다는 장점을 십분 활용하였습니다.
ERD Cloud 라는 도구가 쓰기 정말 쉽고 좋았습니다.
이번 테스트를 통해 아래 사항을 얻을 수 있었습니다.
mermaid.js
및 JetBrians의 기본 도구와 ER Diagram 설계 도구를 익혔습니다.다음 2부에서는, 왜 떨어졌을지에 대해 스스로 반추하는 게시글로 찾아뵙겠습니다.