분류 전체보기

    Nest.js에서 모듈간의 의존성 관리하기

    Nest.js를 사용해서 개발하게 되면 도메인 모델을 기준으로 수많은 모듈이 생기게 된다. 도메인 모델 별로 나누기 때문에 해당 파일이 어떤 역할을 하는지 명시적으로 알 수 있어 매우 편리하지만 서로 다른 모듈끼리 의존성을 관리해줘야 한다. 서로 다른 모듈의 의존 관계 설정 아래는 예시 코드이다. // user.module.ts import { Module } from '@nestjs/common'; import { UserService } from './user.service'; @Module({ providers: [UserService], exports: [UserService], }) export class UserModule {} // auth.module.ts import { Module } ..

    AuthGuard 예외처리 조건 만들기

    AuthGuard는 Nestjs에서 제공하는 미들웨어이다. AuthGuard는 Strategy와 사용되는데 보통 Passport 라이브러리를 활용하여 다양한 인증 전략을 구성할 수 있게 해 준다. 아래는 예시 코드이다. 보통 Controller layer에서 데코레이터를 활용해 사용할 수 있다. (라우터에서도 사용 가능함) 여기서 'jwt'는 Passport를 활용해 작성된 Strategy이고, 거기에 decorator로 만든 user.decorator까지 사용하게 되면 http 통신이 올 때 먼저 토큰 검증부터 진행할 수 있다. // Controller layer @Controller('example') export class ExampleController { constructor(private ex..

    그냥 일기 (20230406)

    1. 심바(김채원) 탄생 예정일 보다 4일 빠른 3월 21일에 심바가 태어났다. 갑자기 출산휴가를 사용하고 앞에 놓인 일들을 하나씩 처리하면서 지냈다. 이제 부양가족이 생겼으니 더 열심히 해야겠다. (최근까지 조리원에서 아내랑 시간을 보내다보니 뭐가 됐든 엄마역할이 제일 힘들다는 걸 느꼈다) 2. copilot, chatgpt 지금까지 copilot과 chatgpt가 내 성장에 방해가 된다는 생각이 들어 사용하지 않았다. 하지만 어느 날 문득 해당 AI 툴들을 활용해서 좀 더 좋은 생산성을 갖는 게 앞으로 내 커리어에 있어서 더 좋은 방향이라는 생각이 들어 홀린 듯이 결제 후 사용 중이다. 둘 다 너무 편리하게 사용하고 있지만 AI가 추천해 준 코드에 문제가 없는지 확인하는 단계가 꼭 필요하다는 생각..

    Nest.js 에서 역직렬화 하기

    최근까지 repository 계층에서 리턴되는 타입에 entity를 그대로 사용했었다. 하지만 단위 테스트를 작성하다 보니 entity를 타입으로 지정하면 테이블 조인되어 있는 부분까지 명시해줘야 하는 불편함이 있었다. 이에 아웃풋 타입 DTO를 작성해 하려다보니 계속해서 실제 리턴타입과 명시된 아웃풋 DTO가 다르다는 에러가 발생했다. 내가 모르는 리턴 타입에 대한 DTO 작성 방법에 대해 찾다 보니 역직렬화에 대해 알 수 있었다. 역직렬화를 말하기전에 직렬화에 대해서 말하자면 객체(class) 형태의 데이터를 json 형태로 변환하는 과정이다. http 통신을 통해 데이터를 주고받을 때 json으로 주고받기 때문에 서버로 넘어온 데이터를 직렬화를 통해 객체(class) 형태로 바꿔주기 위해 필요한 ..

    Nest.js custom decorator 사용하기

    nestjs에선 decorator에 대한 여러 가지 기능을 제공한다. 먼저 request에 해당하는 부분에 데이터를 데코레이터를 사용해 핸들링할 수 있고, 여러 데코레이터들을 하나로 묶는 기능도 제공한다. 1. request 관련 데이터 커스텀 데코레이터 사용하기 import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const User = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.user; }, ); 해당 코드는 nestjs 공..

    테스트 구축하기 관련 발표 자료

    테스트 구축하기 관련 발표 자료

    리팩터링 2판 챕터 4 테스트 구축하기에 대한 세미나 발표 자료이다. 리팩터링 책에선 테스트 코드에 대해 중요하다 하지만 자세히 다루고 있지 않기 때문에 간단한 TDD에 대한 설명과 내가 테스트 코드 공부하면서 느꼈던 것들을(+ 시행착오) 정리했다. 1. chapter 04_ 요약 리팩터링 2판의 챕터 4는 테스트 구축하기에 대한 내용이다. 하지만 테스트에 대해 자세히 다루지 않고 아래와 같이 구현코드에 대한 간단한 테스트 + 약간의 팁으로 끝난다. 해당 챕터를 요약해서 세미나를 준비하다 보니 테스트코드를 해본 적 없는 사람들이 대상이었기 때문에 내 마음대로 발표 자료로 만들기 좋은 문장 두 개를 가져와 발표를 준비했다. 2. 발표 자료로 만들기 좋은 문장 두 개 먼저 TDD에 대한 문장 (테스트를 작성..

    AWS Lambda - SQS를 활용한 인프라 아키텍처 재설계 ( + S3, 맥미니?)

    AWS Lambda - SQS를 활용한 인프라 아키텍처 재설계 ( + S3, 맥미니?)

    1. 갖고 있던 문제 자세히 말할 수는 없지만 회사에 그래픽카드가 필요한 컨버팅 서버가 있었다. 해당 서버는 AWS EC2에서 그래픽 카드가 있는 맥서버로 배포되어 있었는데 큰 문제가 있었다. 바로 월 100만 원가량의 비싼 비용과 트래픽에 취약하다는 문제였다. 해당 서버를 배포한 동료직원의 얘기를 들어보면 컨버팅에 필요한 프로그램을 돌리는데 필요한 최소조건의 서버를 빌렸다고 했기 때문에 사양을 낮춰서 금액을 줄이는 방법은 사용할 수가 없었다. 그리고 http통신으로 컨버팅에 필요한 정보를 받아오는 구조였는데 트래픽에 대한 대비가 전혀 없어 위험했고, 오토스케일링으로 스케일 아웃을 적용하려고 해도 비싼 비용이 너무 부담되는 상황이었다. 2. 인프라 아키텍처 재설계 회사에서도 해당 서버 비용에 대한 부담이..

    Data Mapper 패턴, Active Record패턴

    예전에 Sequelize나 TypeORM을 사용하려 공부할 때 여러 가지 패턴으로 엔티티를 구현하는 것을 보고 많이 헷갈렸었다. 그 이후로는 습관적으로 한 가지 방식으로만 사용하고 있다가 나중에 해당 패턴인 Data Mapper 패턴이라는 것을 알았다. - Data Mapper 패턴이란? Data Mapper 패턴은 데이터베이스 모델 (엔티티) 와 쿼리가 분리된 패턴이다. (데이터베이스에 접근하는 쿼리들을 repository 계층에서 관리) 이렇게 역할에 따라서 계층을 나누게 되면 서로 독립적으로 유지될 수 있다는 장점이 있다. 아래 예시 코드를 보면 모든 쿼리는 repository 계층에 모여있고, entity는 다른 계층에 별도의 클래스로 관리되고 있다. // repository 계층 @Injecta..

    @nestjs/config 사용하는 이유

    보통 프로그래밍을 할 때 노출되면 위험한 민감한 정보들은. env 파일에 담아두고 사용하게 된다. 이렇게 환경변수로 담아두고 사용하게 되면 테스트 환경이나 개발 환경, 배포 환경으로 나눠서 사용할 수 있다. nestjs에서도 상황에 맞게 가져와 사용할 수 있게끔 라이브러리 @nestjs/config를 제공한다. @nestjs/config 설치 npm install @nestjs/config ConfigModule Root module에 등록하기 configMoudle을 사용하기 위해선 Root module에 등록하고, 이때 isGlobal 옵션을 true로 설정하면 하위에 있는 모든 모듈에서 쉽게 주입받아 사용이 가능하다. 만약 옵션은 false로 지정하면 매번 다른 모듈에서 imports에 등록해줘야 ..

    테스트하기 쉬운 코드, 구조 (2) : mocking 없이 테스트 코드 작성하기

    이전 글에서 작성했던 테스트 코드는 mocking을 사용해서 구현했다. mocking을 사용하면 내가 테스트하고자 하는 계층에 물려있는 의존성들을 대신할 객체들을 손쉽게 만들어 낼 수 있다. 하지만 mocking을 남용하는 것은 코드 단계에서의 설계가 좋은 설계인지 나쁜 설계인지를 판별하기 어렵게 하는 단점이 있다. 먼저 이전 글에서 작성했던 구현 클래스를 보고 mocking 없이 테스트를 구현해 보면 // 이전 글에서 작성했던 구현 클래스 // blog.service.ts import { Test1Repository } from './test2.repository'; import { Test2Repository } from './test2.repository2'; import { Test3Reposit..