nestjs 썸네일nestjs

2025-02-11

목차

  1. ULID와 UUID의 활용과 이슈
  2. NestJS 내부 구조와 데코레이터 구현
  3. SSE(Server-Sent Events)의 개념과 NestJS 적용
  4. 타입스크립트에서의 any 타입 문제와 관리법
  5. 레거시 코드와 기술 부채, 그리고 개선 문화
  6. 모니터링 시스템과 저비용 솔루션 추천
  7. 크롤링 시 차단 문제와 해결 방법
  8. 기타 툴 및 서비스 추천
  9. 개발자의 심리와 업무 환경에 관한 토론

1. ULID와 UUID의 활용과 이슈 🎯

  • ULID란?
    ULID(Universally Unique Lexicographically Sortable Identifier)는 시간순으로 정렬 가능한 고유 식별자이다. UUID와 비교해 순차 발행 특성이 있어 데이터베이스에서 성능상 이점이 있음.
  • UUID 버전 체크 불가
    UUID는 버전 정보를 포함하지만, ULID를 UUID로 변환 시 버전 체크가 어려워진다는 이슈가 있음.
  • Monotomic과 시드타임
    Monotomic 방식은 단일 서버 환경에 적합하며, 시드타임은 같은 ULID를 순차적으로 생성하는 방법으로 상황에 따라 선택 가능.

2. NestJS 내부 구조와 데코레이터 구현 🧱

  • NestJS 소스코드는 공개되어 있어 깃허브(https://github.com/nestjs/nest)에서 확인 가능
  • 데코레이터는 어떻게 작동하는가?
    • 런타임에 메타데이터를 주입하고, 이를 통해 의존성 주입(DI)을 구현함.
    • @Injectable 같은 데코레이터는 클래스의 메타데이터를 지정해 런타임에 사용할 수 있게 함.
  • SSE 데코레이터(@Sse) 구현 방식
    • Reflect API를 이용해 HTTP 경로, 메서드, SSE 관련 메타데이터를 메서드에 붙임.
    • 리턴 타입은 RxJS의 Observable로 간주되어 이벤트 스트림을 관리함.
    • NestJS는 코드 품질 면에서 any 타입과 mutable 코드 사용을 많이 하는 편이며, 타입 추론이 어렵게 만드는 부분이 있음.

3. SSE(Server-Sent Events)의 개념과 NestJS 적용 🔄

  • SSE란?
    서버가 클라이언트에게 단방향 스트림 데이터를 보내는 기술로, 클라이언트가 서버에 연결을 유지하며 실시간 데이터를 받는 방식.
  • SSE vs 롱풀링(Polling)
    롱풀링은 클라이언트가 주기적으로 서버에 요청하지만 SSE는 서버가 이벤트를 지속적으로 전송함. 차이점 이해가 필수.
  • NestJS에서 SSE 사용법
    @Sse 데코레이터를 붙인 메서드가 Observable을 반환하면 HTTP 헤더와 함께 실시간 이벤트 스트림으로 전달됨.

4. 타입스크립트에서 any 타입 문제와 관리법 ⚠️

  • any는 타입스크립트에서 "어떤 타입이든 가능"함을 의미
  • 문제점
    • 타입 안전성을 포기하게 하고, 협업 시 코드 품질이 떨어질 수 있음.
    • any가 전염병처럼 번지는 경우도 있어 관리가 어려움.
  • 이유
    • 초기 타입스크립트 버전과 호환을 위해서도 많이 쓰였고 마이그레이션 과정에서 임시땜빵용으로 사용됨.
    • 타입 추론이 어려운 데코레이터 구현체에서 생기기도 함.
  • 관리 팁
    • 린트 툴(ESLint)을 활용해 any 사용 제한 가능.
    • 신규 프로젝트는 strict 모드를 켜고 타입 체크 엄격하게 하여 방지 권장.
    • any 사용을 줄이면서 점진적으로 타입 개선을 시도하는 것이 좋음.

5. 레거시 코드와 기술 부채, 그리고 개선 문화 🏚️➡️🏗️

  • 레거시 코드는 오래된 시스템이지만, 문제가 되는 것은 유지보수 어려움과 신뢰 문제
  • 기술 부채는 체계적으로 관리하지 않으면 점점 누적되어 대규모 리팩토링을 요구하게 됨.
  • 개발 문화
    • 지속적 개선과 리팩토링을 습관화해야 하며, 새로운 기능 추가 시 항상 코드 질 개선을 병행하는 것이 중요.
    • 잦은 개발자 교체와 지식 전수 미흡이 문제 악화 요인.
  • 비유적 표현
    • “식도에 똥구멍 붙이기” 같은 비유로, 엉성한 구조가 누적되면 원래 코드 파악도 어려워짐.
  • 해결 방법
    • 개선 시간 및 인력 확보, 최신 기술 도입, 코드 리뷰 문화 강화 필수.

6. 모니터링 시스템과 저비용 솔루션 추천 🛠️

  • 요구사항
    • API 응답 모니터링, 전체 레이턴시 체크, 커스텀 스팬 생성 등.
  • 추천 오픈소스 툴
    • OpenZipkin, OpenTelemetry: 분산 추적 및 모니터링 위한 표준 오픈소스.
    • Grafana: 시각화 대시보드. 직접 세팅 필요.
  • 상용 솔루션 비교
    • New Relic, Datadog, 와탭, 제니퍼소프트 등이 있으나 가격 문제 존재.
    • 비용과 개발자 공수 사이에서 트레이드오프 고려 필요.
  • 기타 도구
    • pm2.io, Sentry: 프로세스 매니징, 에러 모니터링에 유용.

7. 크롤링 시 차단 문제와 해결 방법 🕷️

  • 문제점
    • 특정 사이트에서 크롤링을 하면 IP 차단되는 경우가 잦음.
  • 해결 방법
    • VPN 또는 Proxy 서버를 사용해 IP를 주기적으로 바꾸며 우회.
    • 네트워크 환경 변경(예: 핫스팟 전환)으로 접근 시도.
    • AWS EC2 같은 클라우드 인프라에 VPN 세팅 후 이용 가능.

8. 기타 툴 및 서비스 추천 🧰

  • DB 설계 도구
    • dbdiagram.io: 직관적이고 쉬운 ERD 도구로 추천.
  • 프레임워크 및 대안
    • NestJS는 typedstack 라이브러리 조각을 모아 만든 것으로 일부 코드 품질 이슈가 있음.
    • Routing-controllers, tsed, Marvel.js 등 대안도 있음.
    • 개발자들은 필요 시 포크하거나 새 프레임워크 개발을 제안하기도 함.
  • 기타
    • Session Replay 도입 시 몫 제공 제한과 on/off 옵션 고민 필수.
    • TypeScript 마이그레이션, 코드 품질 향상 위한 다양한 블로그 및 깃허브 리소스 공유됨.

9. 개발자의 심리와 업무 환경에 관한 토론 💬

  • 업무 재미와 동기부여
    • 아이 키우기, 새로운 챗봇 개발 경험 등이 업무에 활력을 줌.
  • 일과 삶 균형
    • 야근에 대한 긍정/부정 의견이 교차함.
  • 개선과 포기의 딜레마
    • 일부는 오래된 시스템 개선을 주저하며 포기하는 분위기도 존재.
    • 반면 지속적인 개선을 위한 노력이 필요하다는 목소리도 큼.
  • 문화적 변화 필요성
    • 개발자마다 개발 철학이 다르고, 이를 맞추기 위한 팀 문화와 환경 조성이 중요함.

면접팁⚡

  • NestJS 데코레이터 동작 원리 설명 준비
    • 메타데이터 주입과 런타임 처리 과정을 알기 쉽게 설명하길 권장.
  • SSE 개념과 롱폴링 차이점 숙지
    • 실시간 데이터 전송 기술 이해도를 보여줄 수 있음.
  • TypeScript any 타입 문제와 관리 방법 고찰
    • 프로젝트 관리 및 협업 능력 평가에 도움이 되는 주제임.
  • 레거시 코드 문제 대응 전략 공유
    • 유지 보수 및 기술 부채 관리 경험을 말할 수 있으면 플러스.
  • 오픈소스 및 비용 효율적인 모니터링 솔루션 활용 경험
    • 실제 프로젝트 적용 경험이나 학습 의지를 표현하면 좋음.

링크🔗

#ULID#UUID#NestJS#TypeScript#SSE#any타입#레거시코드#모니터링#크롤링#개발문화