본문 바로가기
반응형

JavaScript & TypeScript40

TypeScript 환경에서 class-transformer 적극적으로 사용하기 요즘 같이 분산 환경이 적극적으로 도입 되고 있는 시기에는 꼭 프론트엔드가 아니더라도 백엔드 환경에서도 외부의 HTTP API를 호출하는 일은 당연한 일입니다. 그래서 HTTP API (저는 Rest API라는 단어는 선호하진 않습니다. 어차피 규약 지키고 있는 경우가 거의 없거든요) 를 통해 원격 서버에서 JSON 객체를 읽어오는 작업을 자주 하게 되는데요. 응답으로 넘어온 JSON 객체는 리터럴 객체이지 클래스의 인스턴스가 아닙니다. Axios를 비롯해서 Got 등 NodeJS & TypeScript 환경에서 자주 사용하는 HTTP API 중 어느 것도 클래스의 인스턴스를 응답으로 넘겨주진 않습니다. Spring이나 닷넷등의 다른 백엔드 프레임워크를 사용해본 분들이라면 여기서 이상한 괴리감을 느낄 수.. 2021. 11. 24.
NestJS에서 응답/요청 객체 직렬화 (Serialization) 하기 저 같은 경우에 최대한 Dto를 불변으로 만들기 위해 setter나 public 필드는 배제하는데요. 어쩔수 없이 public 필드 (혹은 public setter)를 써야하는 경우 (TypeORM의 Entity 등)를 제외하고는 무조건이다 싶을 정도로 딱 필요한 정도로만 외부 제공용 메소드를 만들어서 사용합니다. 이를 위해서는 Controller에서 사용하는 응답/요청 Dto 객체의 직렬화는 필수로 진행하게 됩니다. 이번 시간에는 이런 상황등을 대비해서 응답/요청 객체의 직렬화 하는 방법을 진행해보겠습니다. 1. 응답 객체 직렬화하기 흔히 소프트웨어 설계에서 이야기하는 응집도(cohesion)와 결합도(coupling)가 있습니다. 좋은 코드 디자인이라 하면, 높은 응집도 / 낮은 결합도로 설계해야 하.. 2021. 10. 24.
NestJS (with Mono Repo) WebStorm으로 디버깅 하기 NestJS 공식 문서에서는 아래와 같이 CLI로 서비스 실행을 소개하곤 하는데요. nest start --watch 물론 대부분의 백엔드 API 개발에 있어서는 nest start 를 쓸 일이 거의 없습니다. 대부분 테스트 코드로 단위 테스트 / E2E 테스트를 작성하면서 진행하다보니 서버 실행할 이유가 없기 때문입니다. 어떤 개발 환경에서도 터미널만 있으면 실행할 수 있으니 좋습니다만, 이럴 경우 WebStorm/IntelliJ 등 디버깅 기능이 강력한 IDE의 도움을 못받습니다. 개발에 있어서 디버거의 사용유무는 중요합니다. 실시간 데이터 변경 흐름 파악 특정 지점에서의 별도 로직 수행 Logger를 추가할 수 없는 외부 라이브러리에 대한 코드 추적 등등 디버거를 통해 좀 더 깊게 문제를 확인할 수.. 2021. 10. 16.
TypeORM에서 연관관계 유지한채 FK만 제거하기 (w. NestJS) 데이터베이스의 FK (Foreign Key) 는 데이터 일관성을 적용하여 데이터베이스를 깨끗하게 유지한다는 큰 장점을 가지고 있습니다. 다만, 서비스의 규모가 커져 테이블당 row가 1억건이 돌파하는 시점부터는 FK는 많은 변경의 병목이 되는데요. 이유는 1억건 이상일 경우 alter table 로는 3~5시간씩 수행 되기 때문입니다. 이 시간동안 테이블 Lock이 발생할 수 있으며, 이를 회피하기 위해 아래와 같은 여러 장치들이 지원됩니다. Online DDL Percona pt-online-schema-change 다만, FK가 있을 경우 테이블 복사, OnlineDDL를 비롯해서 클러스터링 / 샤딩 / 파티셔닝 등 여러 대량의 데이터 상황에서 제약들이 발생하여서 일정 규모 이상의 서비스에서는 DBA.. 2021. 10. 10.
js-joda 로 TypeORM Date 타입 대체하기 (with NestJS) JavaScript 의 Date Type은 JavaScript의 단점을 이야기할때 항상 거론되는 점인데요. javascript-date-type-is-horribly-broken 위 글에서 언급한 연산에 관한 문제도 있지만, 단순히 +1 Day를 해야하는데도 아래와 같이 직관적이지 못한 잘못된 인터페이스의 코드를 사용해야하는 것도 문제인데요. // Local time var tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); // UTC var tomorrow = new Date(); tomorrow.setUTCDate(tomorrow.getUTCDate() + 1); 연산 코드 자체가 깔끔하지 못하기 때문에 TypeORM에서 날짜 Type.. 2021. 9. 22.
2. NestJS & TypeORM 환경에서 Monorepo 구성하기 - TypeORM 추가하기 지난 시간 에 이어, Monorepo로 구성된 프로젝트에 TypeORM을 추가해보겠습니다. 1. 환경 설정 저 같은 경우 PostgreSQL을 사용할 예정이라 pg 를 기반으로 진행하겠습니다. 필요한 패키지들을 먼저 추가합니다. yarn add @nestjs/typeorm typeorm pg typeorm-naming-strategies class-transformer typeorm-naming-strategies TypeORM에서 Camelcase 필드를 Snake 컬럼에 매핑하기 를 위해 사용됩니다. class-transformer Entity Json을 Dto Instance으로 편하게 변환하기 위해 사용합니다. 그리고 TypeORM과 연동되어 로컬에서 실행할 PostgreSQL DB를 위해 doc.. 2021. 9. 3.

728x90
반응형