전체 글

전체 글

    모듈 간의 순환참조

    모듈 간의 순환참조

    Nest.js를 사용해서 개발을 진행하다보면 도메인 모델 계층에서 정말 많은 모듈로 분리해서 개발을 진행하게 된다. 명확한 명칭으로 모듈을 분리하게 되면 해당 모듈이 어떤 역할을 하는지 쉽게 알 수 있어 매우 좋지만 서로 다른 모듈끼리의 의존성을 조금만 신경쓰지 않으면 순환참조와 같은 문제가 발생한다. 순환참조란? 순환참조는 객체, 데이터, 모듈, 함수 등이 서로를 참조하는 것을 말한다. 간단한 자바스크립트 코드로 예시를 들면 아래와 같다. let obj1 = {}; let obj2 = {}; obj1.otherObj = obj2; obj2.otherObj = obj1; 이처럼 서로를 참조하는 경우 프로그램의 복잡성을 증가시키고 디버깅을 어렵게 만든다. 또한 메모리 누수, 스택 오버플로우, 무한 루프 ..

    Nest.js 라이프사이클

    Nest.js 라이프사이클

    최근에 Nest.js 라이프사이클에 대한 질문을 받은 적이 있었다. 런타임 때나 통신이 일어날 때 타이밍에 맞는 라이프사이클이 있다는 것은 알고 있었지만 제대로 정리해 본 적이 없어 정리된 대답을 하지 못했다. 그래서 개념을 다시 정리하려고 한다. 1. Lifecycle 먼저 Nest.js documentation 을 보면 아래와 같은 그림이 나와있다. 제일 위부터 보면 Bootstrapping starts에서 런타임이 시작되고 아래 여러 가지 이벤트를 지나서 Application is running에 도달해서 서비스가 돌아가기 시작한다. onModuleDestroy부터는 서비스를 종료한다는 신호를 보냈을 때 일어나는 이벤트 들이다. 1-1. Lifecycle Events 위 그림에서 검은색 바로 되어있..

    TypeORM에서 불필요한 SELECT 실행

    현재 회사에서 데이터베이스를 다룰 일이 있으면 TypeORM + MySQL으로 조합해서 사용하고 있다. ORM 특성상 객체지향적으로 데이터베이스를 다룰 수 있기 때문에 좀 더 직관적이고 쿼리 짜는 게 편리한 장점이 있다. 하지만 작성되어 있는 ORM 쿼리 실행문을 보다 보면 불필요한 SELECT 쿼리가 실행되는 문제가 있었다. 1. 불필요한 SELECT 문 실행 문제 아래는 불필요한 SELECT 문이 실행되는 부분의 코드이다. const result = await this.hashTagsRepository.findOne({ name: 'test1' }); result.name = 'test2'; await this.hashTagsRepository.save(result); ORM을 사용해서 특정 데이터를..