본문 바로가기
반응형

TypeORM10

NodeJS에서 데이터베이스 통합 테스트 성능 개선하기 (TypeORM, Jest, PostgreSQL) 보통 통합 테스트는 SQLite, H2와 같은 InMemory 데이터베이스를 사용한다. 메모리상에만 존재하기 때문에 실제 ORM (SQL) 을 검증이 가능하면서도 병렬로 테스트를 수행할 수 있고, 고속의 쿼리 수행이 가능하기 때문이다. 대부분의 데이터베이스 쿼리는 InMemory 데이터베이스에 대해 실행할 수 있지만 많은 엔터프라이즈 시스템은 실제 Production과 같은 데이터베이스에 대해서만 테스트할 수 있는 복잡한 쿼리를 사용한다. 그래서 운영 환경에서 사용하는 데이터베이스(MySQL, PostgreSQL 등) 에서 지원하는 여러 기능(Windows함수, 프로시저, 트리거 등) 들을 적극적으로 사용하는 환경에서는 InMemory DB로 검증하는데 한계가 있다. 이를 위해 보통은 로컬 PC에서는 D.. 2022. 12. 25.
데이터 변환 계층 (Data Transform Layer) Express와 JS/TS만을 가지고 프로젝트를 진행하다보면 데이터 변환 계층의 기준이 정해져있지 않은 경우를 많이 본다. 사람마다 다르기도 하고, 혹은 같은 사람이 작성한 코드에도 천차만별이다. 이에 대해서는 팀에서 확실하게 컨벤션을 잡지 않으면 서로 데이터 변환 계층을 다르게 두어 프로젝트 전체가 일관성이 떨어지고 코드 가독성과 리팩토링 내성도 떨어지게 된다. 그렇다면 데이터 변환 계층의 기준을 어떻게 세우면 좋을까? 문제 예를 들어 다음과 같은 상황이 있다고 해보자. 프로젝트에서는 js-joda (혹은 Dayjs 등) 날짜 타입을 쓰고 있는 상황에서 Database SQL에서 사용하기 위해서는 Date 로 치환해야하는 경우 API 로 외부에 데이터를 전송 (혹은 요청) 하기 위해 String 으로 .. 2022. 11. 28.
3. 테스트하기 좋은 코드 - 외부에 의존하는 코드 개선 지난 시간에 테스트하기 좋은 코드에 대해 이야기를 나눴다. 1. 테스트하기 어려운 코드 2. 제어할 수 없는 코드 개선 이번 편에서는 테스트하기 어려운 코드를 개선하는 2번째 방법인 외부에 의존하는 코드를 개선하는 방법에 대해 이야기를 해보자. 3-1. 문제 상황 1부 에서 소개했던 cancel() 코드를 다시 보자. export default class Order { ... async cancel(cancelTime): void { if(this._orderDateTime >= cancelTime) { throw new Error('주문 시간이 주문 취소 시간보다 늦을 수 없습니다.'); } const cancelOrder = new Order(); cancelOrder._amount = this._a.. 2022. 9. 27.
NodeJS 와 PostgreSQL Query Timeout 작은 서비스를 운영할때는 문제가 없던 서비스가 데이터가 적재되면 될수록 점점 슬로우 쿼리가 등장하게 됩니다. 이때 쿼리 시간을 제한하지 않으면, 5분/10분씩 수행되는 쿼리가 운영 환경에서 실행하게 되기도 하는데요. 이런 쿼리가 트래픽에 맞춰 여러개 요청이 온다면 결국 Node에서 사용가능한 Connection Pool이 가득차 더이상 쿼리 질의를 못하거나, 심한 경우 데이터베이스의 장애로 서비스가 사용불가능하게 되기도 합니다. 그래서 적정시간 이상으로 쿼리가 수행되면 강제로 종료하고, 다시 요청하도록 하는것이 일반적인 방식인데요. 해당 상황과 PostgreSQL에서의 옵션에 대해 소개드립니다. 1. 실험 환경 실험의 경우 아래 환경에서 진행합니다. Node 16 PostgreSQL 14 (by Dock.. 2022. 1. 14.
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.

728x90
반응형