목차
- Docker와 CI/CD 문제 해결 경험
- 데이터베이스 쿼리 처리 전략: 디비 쿼리 vs 서비스 로직
- Prisma 사용 팁과 bigint, UUID 문제
- Prisma 프로덕션 적용 경험과 쿼리 최적화
- 마이그레이션 시 주의사항과 시니어 개발자 역할
- Nestia typedFormData 에러 관련 질문과 해결 팁
- bigint를 number로 변환하는 처리 방식과 주의점
- 정적 메서드(static method) 남용과 개발 조직 문화 이슈
- 아이디 관리 전략: bigInt, UUID, CUID, ULID 비교
- 테스트 도구에서 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 장점 설명하면 신뢰감 상승.
링크🔗
- Prisma CUID 공식 문서: https://www.prisma.io/docs/orm/reference/prisma-schema-reference#cuid
- Docker 공식 문서: https://docs.docker.com/
- AWS ECR 관련 GitHub Action: https://github.com/aws-actions/amazon-ecr-login
- UUID와 ULID 비교 자료: https://github.com/ulid/javascript
- Typia 라이브러리: https://github.com/samchon/typia
#Docker#CI_CD#Prisma#bigint#UUID#DB쿼리#마이그레이션#Nestia#typia#테스트자동화