nestjs 썸네일nestjs

2025-02-03

목차

  1. Docker와 CI/CD 문제 해결 경험
  2. 데이터베이스 쿼리 처리 전략: 디비 쿼리 vs 서비스 로직
  3. Prisma 사용 팁과 bigint, UUID 문제
  4. Prisma 프로덕션 적용 경험과 쿼리 최적화
  5. 마이그레이션 시 주의사항과 시니어 개발자 역할
  6. Nestia typedFormData 에러 관련 질문과 해결 팁
  7. bigint를 number로 변환하는 처리 방식과 주의점
  8. 정적 메서드(static method) 남용과 개발 조직 문화 이슈
  9. 아이디 관리 전략: bigInt, UUID, CUID, ULID 비교
  10. 테스트 도구에서 typia를 활용한 타입 검증 방법

1. Docker와 CI/CD 문제 해결 경험 🐳

  • Dockerfile에서 ENV NODE_ENV=dev 설정은 되어있음.
  • package.json 복사 순서 확인 필요: package.json이 먼저 복사되고, 그다음에 npm install이 실행되어야 함.
  • CI에서 ECR 로그인 및 이미지 빌드, 푸시는 잘 작동하지만, CD 과정에서 ECR 로그인 시 Docker 오류 발생.
  • 오류 원인으로 self-hosted 서버 환경 문제, 특히 docker 바이너리 경로 및 PATH 환경 변수 설정 문제 가능성 제기.
  • 해결 팁:
    • CI/CD job별로 환경변수를 개별적으로 적용해보기.
    • 주석 처리된 코드도 단계별로 주석 해제하며 어떤 부분에서 문제가 발생하는지 확인.
    • self-hosted 서버에 설치된 Docker 경로와 ECR 로그인 명령어가 사용하는 경로 비교.
    • 환경 변수 PATH에 Docker 설치 경로가 포함되어 있는지 반드시 확인.

2. 데이터베이스 쿼리 처리 전략: 디비 쿼리 vs 서비스 로직 🗃️

  • 통계 및 집계 쿼리시 DB 쿼리를 최대한 활용할지, 아니면 기본 조회 후 서비스 로직에서 처리할지 상황별로 판단 필요.
  • 상황별 요점:
    • 디비 일관성이 중요할 경우 DB 내에서 쿼리 처리 권장.
    • 실시간성 데이터이면서 약간의 오차가 허용되는 경우 서비스 로직 처리 가능.
    • 쿼리가 너무 복잡하고 오래 걸리면 스케줄링과 캐시를 활용하는 전략 추천.
  • 빅데이터 쿼리 범위가 너무 넓으면 Athena, BigQuery 같은 별도 시스템 활용 권장.
  • 정산 같이 비즈니스 규칙이 엄격한 경우 서비스 로직에서 처리하는게 더 안전함.
  • 쿼리 빈도와 중요도, 실시간성 요구사항을 고려하여 적절한 방식을 선택해야 함.

3. Prisma 사용 팁과 bigint, UUID 문제 🛠️

  • Prisma로 데이터 조회 시 bigint 타입과 number 타입 간 타입 오류 자주 발생.
  • 해결 방법:
    • DB는 bigint(큰 정수)로 저장하더라도, 프레임워크에서는 number 타입으로 변환하여 사용하는 패턴 제안.
    • 만약 Number.MAX_SAFE_INTEGER (약 9천조) 이상 수가 PK면 문자열로 처리하는 게 안전.
    • UUID는 문자열 타입으로 PK 대체하기도 함.
  • Prisma 미들웨어를 활용해 bigint 타입 자동 변환 처리 가능.
  • 타입 변환시 주의사항:
    • JSON 직렬화 과정에서 bigint를 number로 바로 변환하면 정보 손실 발생하므로 문자열로 처리하는 방식을 권장.

4. Prisma 프로덕션 적용 경험과 쿼리 최적화 🚀

  • Prisma 프로덕션 적용 사례가 많으며, 큰 문제 없이 사용 중.
  • 서비스 레이어에서 타입 강제 및 FK 관계 설정이 잘 된 구조가 안정성에 크게 영향.
  • 최적화가 필요한 로우 쿼리는 Prisma의 로우 쿼리 기능 직접 활용함.
  • Kysely 등 쿼리 빌더 사용도 고려 중이나 프로덕션 적용 전 단계.
  • Prisma 자체는 안정적이나 SQL 마이그레이션 관리 미흡시 문제 발생 우려.

5. 마이그레이션 시 주의사항과 시니어 개발자 역할 🔄

  • 마이그레이션은 섀도우 데이터베이스 -> 개발 -> 라이브 순으로 진행하며 누락 방지를 철저히 해야 한다.
  • 마이그레이션 추적, 테스트 자동화가 매우 중요해 실수가 서비스 장애로 이어짐.
  • 경험 많은 시니어 개발자가 마이그레이션 담당하며 가이드해야 프로젝트 안전성 확보 가능.
  • 시니어 부재 시 본인이 시니어 역할을 해야 한다는 의견 공유.

6. Nestia typedFormData 에러 관련 질문과 해결 팁 ❓

  • Nestia에서 typedFormData 사용 중 공식 문서대로 했는데 에러 발생 사례 공유.
  • 직접 사용해 본 경험자는 적은 상황이며, 최신 문서 및 커뮤니티 의견 참고 바람.

7. bigint를 number로 변환하는 처리 방식과 주의점 🧮

  • bigint 타입을 JSON으로 전달할 때 number로 변환하면 자바스크립트 Number 범위 초과 시 데이터 손실 발생.
  • 해결법:
    • DTO(Request/Response) 클래스로 감싸고 bigint는 문자열로 변환하여 전달.
    • 범위 내 수만 number 사용.
    • 금융, 거래 데이터처럼 큰 수 처리 시 TypeScript의 bigint 타입 사용 추천.
  • 글로벌 서비스에서는 단위 변환으로 큰 숫자가 발생할 수 있으니 유념할 것.

8. 정적 메서드(static method) 남용과 개발 조직 문화 이슈 ⚠️

  • 일부 프로젝트에서 코드가 전부 static method로 작성되어 객체지향 설계 원칙에서 벗어남.
  • static method 과도 사용 시
    • DI(Dependency Injection) 활용 어려움
    • 테스트 및 유지 보수 어려움 증가
  • 개발자들이 개선 의지를 보이나 인력 부족 및 조직 문화 문제로 해결 어려움 호소.
  • 신규 인력도 금방 퇴사하는 악순환 발생 중.
  • 코드 구조 개선 및 협업 문화 변화가 절실함.

9. 아이디 관리 전략: bigInt, UUID, CUID, ULID 비교 🔑

  • 내부 조인용은 bigInt 타입, 외부 노출용 ID는 string(Uuid, Cuid) 타입으로 두개를 함께 사용하는 사례 있음.
  • CUID: 시간 기반으로 생성돼 인덱싱에 유리하고 URL 노출용으로 적합.
  • ULID: 순서가 보장되는 UUID로 간단하고 좋음.
  • TSID, UUID v7, snowflake 등도 사용되며 각각 장단점 존재.
  • MySQL 성능 이슈 있어 내부는 bigInt, 외부는 UUID 조합 구조가 많음.

10. 테스트 도구에서 typia를 활용한 타입 검증 방법 ✅

  • Jest나 Vitest 환경에서 typia를 활용해 타입 검증 시 여러 방식이 가능.
  • 예시 방법:
    • typia.assertEquals<T>(value) 사용해 타입 일치 여부 검증.
    • Jest expect와 함께 사용하여 예외 발생 여부 체크.
  • 에러 발생 시 테스트가 실패하므로 간단하게 값 검증 가능.
  • 커버리지 신경 안 쓰고 에러로 검증하는 간편한 방법도 선호됨.

면접팁⚡

  • Docker CI/CD 문제 해결 시: 환경변수 적용 방식과 명령어 실행 순서가 중요함을 꼭 기억할 것.
  • bigint vs number 타입 처리: 자바스크립트 Number 한계 이해하고, 큰 숫자 안전한 처리는 문자열 변환 혹은 bigint 사용을 추천한다 설명하라.
  • 마이그레이션 경험: 추적, 테스트 자동화와 시니어 개발자 관리 역할을 강조하면 좋음.
  • 정적 메서드 단점: 코드 유지보수, 테스트, DI 어려움을 근거로 단점 설명 가능.
  • ID 전략: 내부용, 외부용 ID 분리 및 ULID/CUID 장점 설명하면 신뢰감 상승.

링크🔗

#Docker#CI_CD#Prisma#bigint#UUID#DB쿼리#마이그레이션#Nestia#typia#테스트자동화