분류 전체보기

    nestjs-query_02_Hook, Authorize

    nestjs-query_02 1. BeforeCreateOneHook, BeforeUpdateOneHook nestjs-query에서는 몇 가지 훅들을 제공한다. 그중 가장 대표적으로 BeforeCreateOneHook과 BeforeUpdateOneHook이다. 해당 훅들은 module에서 자동으로 만들어 주는 CreateOne, UpdateOne 전에 실행되게 사용할 수 있는 기능이다. resolver에 도달하기 전에 실행되기 때문에 nestjs의 interceptor라고 봐도 된다. 2. 사용법 2-1. BeforeCreateOneHook 사용법 아래 보이는 것처럼 BeforeCreateOneHook를 사용해 구현할 수 있다. instance는 자동 생성되는 createOne의 input query를..

    nestjs-query_01_세팅

    nestjs-query nestjs-query는 graphql의 crud를 자동으로 만들어주고 기타 기능들을 제공해주는 라이브러리다. 기존 graphql의 경우 손쉽게 서버를 구성하고 사용할 수 있었지만 querying, sorting, paging기능을 구현하고, dto와 같은 타입들을 모두 지정해줘야 하기 때문에 중복된 일을 하는 경우가 많았다. nestjs-query는 이런 문제들을 단순 설정을 통해 쉽게 세팅할 수 있게 해준다. 1. @ptc-org/nestjs-query 구글에 nestjs-query를 치면 https://doug-martin.github.io/nestjs-query/ 이 주소가 제일 상단에 나온다. 해당 라이브러리는 0.3버전 이후 업데이트가 멈춰진 상태이기 때문에 https:..

    20231030

    너무 오랜만에 글 쓰는 것 같다. 올해 7월쯤부터 많은 일이 있었다. 결론적으로 최근에 이직한 회사에서 적응하는 중이고, 개인적으로는 애기 때문에 좀 더 큰집으로 이사도 했다. 기타 이런저런 일들도 너무 많았지만 이제 주변정리가 다 끝나서 다시 블로그도 열심히 써보려고 한다. Graphql 현재 회사는 Nest + graphql을 사용한다. 예전에 nest환경에서 graphql을 구현할때 가장 귀찮았던 부분이 Query나 Mutation마다 인풋, 아웃풋에 대한 정의를 모두 해줘야 한다는 것이었다. 이때도 최대한 중복되는 건 하나로 묶어서 처리하려고 이런저런 방법을 사용했었는데, 회사에서 사용하는 nestjs-query 라이브러리를 사용하면 귀찮은 부분들도 쉽게 처리가 가능하고 기초적인 CRUD의 ..

    모듈 간의 순환참조

    모듈 간의 순환참조

    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을 사용해서 특정 데이터를..

    비즈니스 로직(Service layer)의 역할

    비즈니스 로직(Service layer)의 역할

    개발자로 일을 하다 보면 개발에 관련된 모든 것들은 추상화로 이루어져 있다는 생각이 들 때가 있다. 결국 개발 언어나 라이브러리, 프레임워크 전부 다 내부적으로 어떻게 구동되는지는 몰라도 결과값을 유추할 수 있고 해당 결과값들의 집합으로 완성된 서비스를 만들 수 있다. 서비스를 구현할 때 좋은 구조의 설계를 하기 위해 역할과 책임에 따라서 계층을 나누게 된다. 보통 3계층 아키텍처를 많이 사용하는데 구조는 아래와 같다. 1. 비즈니스 로직 비즈니스 로직은 서비스의 핵심 로직이라고 생각하기 때문에 Service 계층에서 구현하고 다른 계층의 문제가 전파되지 않게 아키텍처 설계를 하고 있다. 1-1. Service 계층에서의 의존성 회사에서 개발할 때 Service 계층에선 Repository 계층을 의존..

    객체지향적으로 머드게임 만들기 - DI 프레임워크 만들어서 리팩토링

    객체지향적으로 머드게임 만들기 - DI 프레임워크 만들어서 리팩토링

    1. 객체지향적으로 머드게임 만들기 (2022년) 2022년 말에 객체지향적으로 머드게임 만들기라는 주제로 회사 내부 세미나를 진행했었다. 객체지향적으로 간단한 머드게임 만들기 최근 회사 개발자 전원에게 '객체지향적으로 간단한 머드게임 만들기'라는 과제가 주어졌다. 기본적인 룰은 제공을 해주는 과제였다. 해당 자료는 해당 과제 발표자료이다. 게임 기초 룰 위의 joorrr.tistory.com 해당 세미나는 언어나 프레임워크에 제한이 없어서 Typescript로 프레임워크나 라이브러리 사용 없이 구현했었다. 그러면서 객체지향적으로 구현하기 위해서 역할과 책임에 따라 나누고 객체 간의 관계를 의존성 주입으로 설계했기 때문에 객체 간에 얽혀있는 의존성을 직접 관리해 줘야하는 불편함이 있었다. 아래는 그때 ..

    Reflect API

    Reflect API는 Reflection이라는 개념(런타임 시점에 사용되는 자신의 구조와 행위를 관리하고 수정하는 개념)이 들어간 자바스크립트 내장 객체로 Proxy와 같이 자바스크립트 명령 중간에 실행할 수 있는 기능이다. 1. Reflect.get, Reflect.set 대표적인 Reflect api로는 get, set이 있다. 먼저 MDN에 나와있는 Reflect.get 예제 코드를 보게 되면 아래와 같다 1-1. Reflect.get // Reflect.get(target, propertyKey, receiver?) // MDN 예제 코드 const object1 = { x: 1, y: 2 }; console.log(Reflect.get(object1, 'x')); // Expected out..

    Express에서 DI 프레임워크 만들어보기

    Nodejs 진영에서 DI/IoC를 사용해 서버를 구축하기 위해선 DI 프레임워크인 Nestjs를 사용하거나 Express에서 typedi를 활용해 서버를 구축해야 한다. Nestjs에선 데코레이터(@)와 Module을 활용해 의존성들의 관계만 신경 써주면 쉽게 주입받아 관리할 수 있고, Express에서 typedi로 의존성을 관리하는 것도 비슷하다. (@Service 데코레이터를 통해서 IoC 컨테이너에 자동으로 등록되고 런타임 때 typedi를 통해 알아서 주입받아 사용하는 형태다) 최근 들어 Nestjs에서 데코레이터를 커스텀해 사용할 일이 많아지다 보니 도대체 데코레이터의 동작원리가 어떻게 된 건지 궁금해졌다. 하지만 Nestjs에서 제공하는 커스텀 데코레이터 메서드들은 한번 더 추상화된 메서드..