성숙한 생태계 현대화: Clean Architecture & Read-Only Microservices의 성능

발행: (2025년 12월 3일 오전 08:46 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

시나리오 개요

최근 대기업 환경에서 흔히 마주치는 문제에 도전했습니다: 중앙 시스템의 안정성을 해치지 않으면서 통합 데이터베이스의 데이터를 소비하는 새로운 고성능, 확장 가능한 기능을 만드는 것.

목표는 읽기 전용 마이크로서비스를 설계하여 데이터 시각화 인터페이스와 내보내기 루틴에 데이터를 제공하는 것이었습니다. 비즈니스 요구는 빠른 전달이었고, 제가 스스로 설정한 기술 요구는 엔지니어링 우수성과 장기 유지 보수성이었습니다.

핵심 복잡성

  • 방대한 데이터 양과 복잡한 구조를 가진 관계형(SQL) 데이터베이스.
  • Node.js 이벤트 루프를 차단하지 않고 다수의 동시 클라이언트를 서비스하기 위한 고가용성.
  • 엄격한 보안 요구사항 및 스테이징과 프로덕션 환경 간 완전 격리.
  • 비용 효율적인 최적화가 필요한 AWS 인프라(컴퓨팅/스토리지).

🇧🇷 한국어 버전 여기서 읽기

클린 아키텍처 레이어

오래 지속될 수 있도록 클린 아키텍처를 채택하여 비즈니스 규칙을 웹 프레임워크나 데이터베이스 드라이버와 같은 구현 세부 사항으로부터 분리했습니다. 프로젝트는 다음 네 가지 레이어로 구성되었습니다:

레이어책임
Domain애플리케이션의 인터페이스와 순수 모델
Data유스케이스와 비즈니스 규칙
Infra외부 구현(리포지토리, 암호화, 통합)
Main의존성을 주입하고 서비스를 초기화하는 구성 레이어

이러한 분리는 예를 들어 HTTP 프레임워크(예: Express → Fastify)나 ORM을 교체해도 도메인 로직에 영향을 주지 않게 해줍니다.

Prisma를 이용한 데이터 접근

기존 스키마 안전하게 매핑하기

수동 SQL 쿼리는 향후 유지 보수에 취약합니다. 저는 Prisma ORMIntrospection 기능을 사용해 기존 스키마를 읽고 자동으로 TypeScript 타입을 생성했으며, 마이그레이션(위성 서비스 범위 외) 없이 진행했습니다.

복합 키 처리

오래된 관계 테이블은 고유 식별자 대신 복합 키를 사용합니다. Prisma의 네이티브 스키마 매핑은 이를 깔끔하게 처리합니다:

model ExampleRelation {
  userId Int
  itemId Int

  // 컬럼을 조합해 고유 식별자를 정의
  @@id([userId, itemId])
}

이렇게 하면 데이터 소비에 타입 안전성이 확보되어 런타임 오류를 방지하고 개발 속도가 빨라집니다.

인프라 최적화

Docker 멀티‑스테이지 빌드

이미지를 가볍게 유지하기 위해 Alpine Linux 기반 멀티‑스테이지 빌드를 구현했습니다:

  1. Builder Stage – 의존성을 설치하고, TypeScript를 컴파일하며, 아티팩트를 생성.
  2. Runner Stage – 트랜스파일된 dist 폴더와 프로덕션 의존성만 복사.

결과: 최종 이미지가 약 150 MB 수준으로 압축되어 배포가 빨라지고 Amazon ECR의 스토리지 비용이 감소합니다.

PM2 클러스터 모드

표준 Node.js 프로세스는 단일 코어에서 실행돼 멀티코어 클라우드 인스턴스를 충분히 활용하지 못합니다. PM2를 클러스터 모드로 실행하면 CPU 가용량에 따라 여러 워커가 생성되어 처리량이 최적화됩니다. 워커가 재시작되면 PM2 내부 로드밸런서가 트래픽을 재분배해 서비스 가용성을 유지합니다.

아키텍처 다이어그램

제안된 아키텍처의 개념적 뷰

(다이어그램 이미지 삽입)

CI/CD 파이프라인 및 환경 관리

불변 아티팩트를 통해 환경 간 일관성을 확보합니다:

  • Dockerfile 하나만으로 Dev, Staging, Prod를 모두 빌드.
  • 민감한 환경 변수는 컨테이너 실행 시점에만 주입.
  • 환경 구분은 컨테이너 레지스트리의 태그로 관리.

보안 조치

  • 허가된 도메인만 허용하는 엄격한 CORS 미들웨어.
  • 모든 라우트에 대한 인증 검증.

이러한 방어책은 환경 간 격리를 보장하고 읽기 전용 서비스가 무단 접근으로부터 보호되도록 합니다.

결론

이 사례 연구는 현대 소프트웨어 엔지니어링 패턴이 성숙한 생태계를 성공적으로 현대화할 수 있음을 보여줍니다. 클린 아키텍처로 조직을 정리하고, Prisma로 타입‑안전한 데이터 접근을 구현하며, Docker/PM2로 운영 효율성을 높이면 유지 보수가 쉽고 확장 준비가 된 견고한 백엔드를 만들 수 있습니다.

Back to Blog

관련 글

더 보기 »