nestjs 썸네일nestjs

2025-02-18

목차

  1. 삼촌 에이전트와 Docker Compose
  2. PostgreSQL 도메인 타입과 매핑 이슈
  3. Prisma에서 조건문(where) 타입 문제와 satisfies 연산자
  4. 헥사고날 아키텍처(Hexagonal Architecture) 토론
  5. 2차 캐시 (2L Cache)와 캐시 일관성 문제
  6. 프론트엔드와 백엔드 배포 전략
  7. 정규식과 타입 검증 - typia 라이브러리 사례
  8. 오픈소스 기여 권장 및 typia 이슈 사례
  9. 개발 도구로서 화이트보드 활용법
  10. 기타 질문과 의견

1. 삼촌 에이전트와 Docker Compose 🚀

  • "삼촌" 이미지를 Docker Compose로 실행한다는 재밌는 표현.
  • Docker Compose는 여러 컨테이너를 정의, 동시에 실행할 수 있는 도구임.
  • 에이전트(Agent) 개념을 코드로 만들어 확장하는 흐름이 미래 지향적이라는 의견.

2. PostgreSQL 도메인 타입과 매핑 이슈 🐘

  • PostgreSQL의 CREATE DOMAIN은 기존 타입을 확장하거나 제한해서 만든 커스텀 타입임.
  • 도메인 타입은 Enum과는 다르며, DB 수준에서 데이터 유효성이나 형식을 제한할 수 있음.
  • 하지만 단순 게시판같은 작은 프로젝트에서는 모든 데이터 필드를 도메인 객체로 매핑하는 건 오히려 유지보수에 부담이 됨.
  • 사수가 모든 DB 데이터타입을 도메인 객체로 무분별하게 만들어 재앙이 된 사례도 있음.

도메인 객체(Domain Object) 란?
이는 애플리케이션의 핵심 비즈니스 로직이나 의미를 갖는 객체로, 데이터베이스 타입과는 별개임. 무차별 매핑보단 필요에 맞는 범위에서 이용하는 게 효율적임.

3. Prisma 조건문과 TypeScript 타입 문제 🔍

  • findMany 쿼리 시 where 조건을 여러 방식으로 쓰는데 1번째 방식은 실패, 2번째는 성공하는 경우 발생.
  • 타입이 좁혀지지 않아 1번 방식 실패 가능성 큼.
  • satisfies 연산자 사용 시 타입을 더 엄격히 체크 가능 (관련 공식 블로그 참고: https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb).
  • 타입 정의가 올바르게 되어야 쿼리가 정상 작동함.

4. 헥사고날 아키텍처(Hexagonal Architecture) 논쟁 🏗️

  • 헥사고날 아키텍처는 시스템을 포트(Ports)어댑터(Adapters) 로 분리하여 내부 비즈니스 로직과 외부 인프라를 격리하는 설계 방식.
  • 핵심 개념은 여러 어댑터로 외부 기능을 쉽게 교체 가능하다는 점임.
  • 하지만 실제 프로젝트에서는 DB 교체 사례가 드물고, 복잡도만 증가하는 경우가 많아 비선호하는 의견도 존재.
  • 레포지토리 패턴도 비슷하게 DB 관련 코드를 격리하지만, DB 교체 목적보다는 유지보수 및 코드 관리에 더 유용.
  • 대형 기업에서는 fallback(대체 수단)이 많아 헥사고날 아키텍처가 효과를 볼 때도 있음.(예: 지도 서비스 여러 API 연동)
  • 헥사고날은 구조 강제 및 테스트 도입이 쉬움 장점도 있어 작은 조직보단 복잡한 서비스에 적합.
  • 빠른 사업 모델(BM) 변화 대응에는 유연하지 않는 한계 존재.

포트와 어댑터란?

  • 포트는 애플리케이션 내부와 외부가 소통하는 인터페이스를 의미.
  • 어댑터는 포트를 구현하는 외부시스템과의 연결 부품으로 DB, 메시징, 외부 API 등이 해당.

5. 2차 캐시 (2L Cache)와 캐시 일관성 문제 🗃️

  • 2차 캐시란 로컬 캐시와 Redis 같이 분산 캐시를 조합하여 성능과 지연 시간 감소를 목표로 함.
  • 로컬 캐시를 여러 서버 노드가 각각 가지고 있으며 Redis가 중앙 캐시 역할.
  • 캐시 일관성 유지가 중요한 이슈로, API로 eviction(캐시 무효화)을 시키는 작업이 복잡.
  • 주로 update 방식 캐시 무효화(데이터가 변경될 때 업데이트) 사용.
  • 예: 다중 서버 환경에서 라우팅 규칙 변경시 DB I/O 비용 절감을 위해 local/remote 캐시를 복합적 관리.
  • 장애 상황 대응을 위한 캐시 정책도 필요하며, TTL(Time To Live)을 통해 데이터 신선도 유지.

6. 프론트엔드와 백엔드 배포 전략 🖥️

  • Next.js(프론트)와 Nest.js(백엔드)를 각각 Vercel, AWS EC2에 분리 배포하는 전략 추천.
  • 프론트와 백엔드를 한 서버(EC2)에 통합해도 가능하지만, 배포 간 의존성 및 충돌 발생 가능.
  • 분리 배포 시 각각 독립적 배포 및 운영 가능하므로 관리가 수월.
  • 그러나 관리 역량이나 배포 편의성에 따라 결정 가능.
  • AWS EC2에 Docker Standalone 옵션 켜고 빌드 후 배포도 어렵지 않음.

7. 정규식과 타입 검증 - typia 라이브러리 사례 🔡

  • typia는 타입스크립트 타입을 기반으로 런타임 데이터 검증을 지원하는 라이브러리.
  • 정규식을 타입에 박아서 URI 형식 등 복잡한 포맷을 체크함.
  • 하지만 정규식을 컴파일 타임에 검사하는 기능은 아직 없어 런타임에서 if문 등으로 검사.
  • 그룹 캡처, 교차 타입 정의 등에서 발생하는 복잡성과 버그가 존재.
  • 관련 이슈는 GitHub에 활발히 공유 중(https://github.com/samchon/typia/issues/1503).
  • 오픈소스 기여 권장됨.

8. 오픈소스 기여 권장 및 typia 이슈 사례 🌍

  • 개발자들은 typia 이슈에 직접 PR을 올려 기여하는 문화 조성 중.
  • 기여는 공식 문서 개선, 버그 수정 등으로 신입부터 고급 개발자까지 참여 가능.
  • 협업을 장려하며 실전 경험 쌓기에 좋은 기회 제공.

9. 개발 도구로서 화이트보드 활용법 📝

  • 화이트보드는 복잡한 설계나 캐시, 아키텍처 설명에 매우 유용.
  • 최근엔 창문에 붙이는 종이형 화이트보드도 인기.
  • 장점: 즉각적인 아이디어 공유와 팀원간 의사소통 강화.
  • 단점: 지우기 어려움, 때로는 청소(물 묻히기) 필요.

10. 기타 질문과 의견 💬

  • 헥사고날 아키텍처는 신입 개발자 교육에 부담될 수 있어 신중하게 도입 권장.
  • 큰 트래픽 서비스에선 복잡한 fallback과 캐시 계층 관리가 필요해 헥사고날이 도움이 될 수 있음.
  • NestJS SDK 구성에 대해 base URL 세팅 방법 논의.
  • 개발자들 사이에 유머와 협력적인 분위기 형성.

면접팁⚡

  • 헥사고날 아키텍처의 핵심 개념과 장단점을 명확히 이해하고, 실제 프로젝트 적합성 여부를 설명할 수 있어야 함.
  • PostgreSQL 커스텀 도메인 타입과 일반 Enum 타입 차이를 정확히 말할 수 있어야 함.
  • Prisma 쿼리 시 타입 문제에 대해 타입스크립트의 좁혀진 타입과 satisfies 연산자의 역할을 설명할 수 있음.
  • 2차 캐시(2L Cache) 개념과 캐시 일관성 문제, eviction 전략을 기술 문제로 대비.
  • 오픈소스 기여 경험이나 개발 문화에 대해 질문 나오면 github PR 경험을 활용.

링크🔗

#HexagonalArchitecture#Prisma#PostgreSQL#2LCache#NestJS#NextJS#Deployment#Typia#캐시관리#개발문화