본문 바로가기

NestJS

(8)
Role을 통한 User 인가 프로젝트를 진행하며 모든 데이터에 대한 CRUD API를 만들었다. 기능을 추가해 가면서 CRUD API를 관리자 전용으로 바꾸기로 해서 모든 User에 Role을 부여하고 이를 통한 인가를 구현하기로 했다. 인증? 인가? 인증이란, 사용자의 신원 그 자체를 검사하는 프로세스를 말한다. 로그인을 인증의 예시로 들 수 있다. 인가란, 요청을 보낸 클라이언트를 식별하여 해당 클라이언트의 요청에 대한 권한을 검사하는 것을 말한다. 관리자 전용 API 등을 예시로 들 수 있다. User Entity User Entity를 다음과 같이 정의할 수 있다. User Entity의 role을 사용해 인가를 구현할 것이다. (예시 코드) /** * @description * 일반 사용자 - USER * 관리자 - ADM..
CORS, credentials 배포를 하는데 프론트 쪽에서 CORS 정책 에러가 발생했다는 소식을 들었다. 처음 듣는 말이라 구글링을 해 봤다. CORS는 다른 도메인(Origin) 간에 데이터를 주고받을 수 있도록 허용하는 보안 메커니즘으로, 프론트에서 백엔드에 데이터를 요청하는 경우 CORS를 기반으로 하여 HTTP 요청을 하게 되는데, 적절한 설정이 되어있지 않은 경우 코드상 문제가 없다고 하더라도 HTTP 에러가 발생할 수 있고, 보안 측면에서도 허용되지 않은 출처의 서비스가 악의적인 목적으로 데이터를 요청하고 응답받는 등의 사고가 발생할 수 있기 때문에 CORS 관련 설정을 해 주어야 한다는 사실을 알았다. NestJS에서 CORS 설정을 하려면 main.ts에 enableCors()코드를 추가하면 된다. // main.ts..
NestJS에서 openAI API 연동으로 ChatGPT 활용하기 해커톤을 하며 서비스에 ChatGPT를 활용해 보기로 결정하였다. 검색 교육 프로그램이기 때문에 다양한 답을 정답으로 인정해줘야 했기 때문이다. 언어 모델을 직접 만들어 사용하는 방법도 있었지만, 인공지능에 대해선 아는 게 없었기 때문에 ChatGPT를 활용하기로 했다. ChatGPT를 사용하려면 먼저 KEY를 발급받아야 한다 https://platform.openai.com/overview OpenAI Platform Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform. platform.openai.com 여기에 들어가서 API KEY를 발급받으면 된다. ..
Throttler를 사용한 Rate Limiting 해커톤 동안 프로젝트를 하면서 요청을 제한해야 할 일이 생겼다. chatGPT를 사용한다는 것이 그 이유인데, 처음엔 chatGPT billing 문제로 인해 요청을 제한하고 싶었는데, 다른 곳(사용자 인증과 연관된 곳)에서도 써야 될 것이라 생각해 전역으로 적용하기로 했다. 사용 방법은 다음과 같다. 우선, NestJS에서 제공하는 throttler 패키지를 설치한다. yarn add @nestjs/throttler 설치가 잘 되었다면, rate limiting의 구체적인 내용을 정하면 된다. AppModule에서 ThrottlerModule을 import 할 때 정하면 된다. @Module({ imports: [ ThrottlerModule.forRoot({ ttl: 60, limit: 10, }),..
Provider provider는 프로그램이 제공하는 서비스 기능을 구현하고 수행하는 역할을 맡는 것으로, MVC 모델의 Model에 해당하는 부분이다. 비즈니스 로직을 수행하는 service는 provider에 등록되어 사용된다. service를 설명하기 전 먼저 DI(Dependency Injection)와 IOC(Inversion of Control)에 대해 설명하겠다. DI(Dependency Injection)란 하나의 객체가 다른 객체의 의존성을 제공하는 기술을 말한다. 코드의 결합도를 느슨하게 만들고, 객체의 생성과 사용을 분리하여 코드의 가독성과 재사용성을 높여 준다. 어떤 객체가 다른 객체에 의존성이 있을 때, 의존하는 객체에 변경이 생기거나 다른 객체를 사용해야 하는 경우가 생긴다면 관련 코드를 전부 ..
Controller controller는 클라이언트에서 보낸 HTTP 요청을 받아 라우팅 하며, 프로바이더에게 전달한다. 또한, 프로바이더에게 받은 응답을 다시 클라이언트에게 반환한다. @Controller() 데코레이터를 붙여 정의하는 클래스이다. 다음 예시를 보며 설명해 보겠다. import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { TestService } from './test.service'; import { CreateTestDto } from './dto/create-test.dto'; import { UpdateTestDto } from './dto/update-test.dto'; @Controlle..
NestJS의 프로젝트 구조 NestJS는 모듈화를 통해 프로젝트를 구성한다. 가장 위에 있는 main.ts에서 app.module을 호출하는 것으로 프로그램이 시작된다. app.module은 또 다른 모듈들을 import 하게 된다. 각 모듈은 기본적으로 controller와 provider로 구성된다. controller는 클라이언트에서 보낸 HTTP 요청을 받아 라우팅 하며, 프로바이더에게 전달한다. 또한, 프로바이더에게 받은 응답을 다시 클라이언트에게 반환한다. 자세한 내용은 다른 포스팅에서 다루겠다. provider는 애플리케이션에서 사용되는 서비스, 데이터베이스 이용, 외부 API 호출, 로깅 등의 기능을 수행한다. 핵심 비즈니스 로직을 구현하고, controller에 필요한 데이터와 기능을 제공하는 역할을 한다. 자세한..
NestJS 소개 ※해당 글은 "NestJS로 배우는 백엔드 프로그래밍"(한용재 저)를 토대로 공부한 것을 정리한 것임을 밝힙니다. NestJS란.. NestJS는 Express, Fastify 등과 같은 Node.js의 인기 있는 웹 프레임워크들을 기반으로 개발된 Node.js에 기반을 둔 웹 API 프레임워크이다. Node.js는 손쉽게 사용할 수 있고 뛰어난 확장성을 가지고 있지만, 과도한 유연함으로 인해 결과물의 품질이 일정하지 않고, 알맞은 라이브러리를 찾기 위해 사용자가 많은 시간을 할애해야 한다. 하지만 NestJS는 데이터베이스, ORM(object-relational-mapping), 설정(구성), 유효성 검사 등 수많은 기능을 기본 제공한다. 그러면서도 필요한 라이브러리를 쉽게 설치하여 기능을 확장할 수..