프레임워크/NestJS 16

[NestJS] Prisma db 여러개 연결하기

현재 서버의 데이터를 이용해서 의미있는 데이터를 만들고 싶었다. 하지만 이 작업을 수행하게 되면 DB에 자원이 많이 소모되기 때문에, 기존의 db를 새 db에 마이그레이션 한 이후 이 db에서 데이터를 추출하고 싶었다. 여기서 문제가 되는 것이 복사한 db에서 의미있는 값을 뽑아낸 뒤에 기존의 db에 바로 올리기 위해서는 한 대의 서버에 2개의 db를 연결해야 했다. 나는 NestJS + Prisma 를 사용하므로, Prisma에 대한 방법을 정리해 보았다. DB 2개 연결하기 Prisma에 DB를 연결하는 방법은 prisma.schema 파일에 db의 주소를 넣으면 된다. 현재 생성하는 db가 2번째 일 경우, 스키마에 새로 추가할 것이 output 항목이다. generate 명령어를 실행하게 되면 클..

[NestJS] DB 캐시 Redis 사용하기

현재 앱 운영이 순조롭게 되고 있는 것 같지만, 내부적으로 서버 응답 속도가 느리다는 문제가 꾸준히 있었다. 사실 이 문제는 AWS CloudWatch에서도 꾸준히 보고되었고 예전부터 해결해야 할 과제 중 하나였는데, 다른 작업들에 밀려 우선순위가 낮아졌다. 이제서야 이 문제를 해결하게 되었다. 현재 문제 상황 현재 운영 중인 데이터의 구조는 postgresql에서 부모 데이터에 자식 데이터가 1:n으로 물려 있는 형태이다. 여기서 부모 데이터는 15만개 정도의 row 데이터가 있고, 자식 데이터는 그것의 10배 정도의 row 데이터가 있다. 이 데이터는 사용자의 tz 기준으로 하루에 대한 데이터를 뽑아내야 한다. 여기서 문제가 되는 것은 time을 기준으로 데이터를 범위 검색을 하다 보니 하루에 대한 ..

[NestJS] Guard 사용하기

웹서버에서 중요한 것 중의 하나는 보안 관련한 로직일 것이다. NestJS에서는 허용된 User가 아니면 query나 Mutation, Subscription을 요청하지 못하도록 하는 Middleware를 제공한다. 이것을 UseGuard라는 decorator로 제공하고 있다. 이번에 Query, Mutation, Subscription에 관해서 Guard를 제작한 경험을 작성하고자 한다. Guard 개념 Guard 개념은 간단하다. 허용된 유저가 아니면 요청 자체를 막아버리는 것이다. 예를 들어 모든 사용자가 서버에 요청을 할 수 있다면, DDos 같은 엄청난 트래픽이 들어올 때 모든 요청에 대하여 응답을 하게 될 것이다. 이러한 상황이 지속되면 서버의 자원에 낭비가 올 수 밖에 없으며, 결국에는 서버..

[NestJS] 네이버 문자인증 로직 제작하기

새로 제작할 어플에 문자인증 로직이 새로 생겨서 문자인증 로직을 구현해야 했다. 문자 인증같은 경우에는 처음 시도해 보는 것이라서 생각이 좀 필요했다. 로직 구상하기 찾아보니, 문자 인증 자체를 제공하는 API는 거의 찾을 수 없었다. 그 대신 문자를 보낼 수 있는 API는 참 많았다. 그래서 문자를 보내는 API를 내 입맛에 잘 맞추어서 적용하면 문자인증 로직을 충분히 구현할 수 있을 것 같았다. 문자전송 API는 네이버 클라우드 플랫폼에서 제공하는 SENS를 사용하기로 했다. 기존의 문자 인증 메시지를 보면, 특정 자릿수의 난수를 불러주고 시간제한을 두면서 입력을 요구한다. 난수 생성은 간단히 6자리의 숫자로 이루어진 문자열을 반환하고, 시간이 지나면 문자 인증을 할 수 없게 한다. 여기서 기존에 만..

[NestJs] PayloadTooLargeError: request entity too large 해결하기

최근에 대량의 Mutation을 실행하기 위해서 서버에 요청을 보낸 적이 있었다. 그런데 PayloadTooLargeError: request entity too large 라는 에러가 뜨면서 Mutation 요청에 실패하는 일이 발생했다. 찾아보니 express 기반의 서버에서 발생하는 오류 같은데, 요청이 특정 크기를 넘어가게 되면은 막아버리는 것 같았다. 그래서 해결법을 찾아보니 express의 버전에 따라서 약간의 차이는 있으나, 해결법은 비슷해 보였다. 해결법 나는 아래와 같은 방법으로 해결했다. bodyParser 모듈을 설치한 다음 limit를 풀어 주었다. 아래 코드들은 main.ts 파일이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import { NestF..

[NestJs] 환경변수 설정하기

NestJs 서버를 구축하면서 서버 환경에 따라 달라지는 변수나 설정값들이 있다. 대표적 예시로는 prod 서버와 test 서버가 있을 것이다. prod 서버는 prod db 또는 그에 맞는 환경이 있고, test 서버는 test db 또는 그에 맞는 설정값들이 있다. 서버를 deploy할 때 이러한 구분을 잘 해두면 쉽게 개발 환경과 배포 환경을 구분해서 사용할 수 있다. 기존의 방법 기존에는 애플리케이션 실행할 때 인자로 환경변수를 주면서 실행하게 되면 process.env.환경변수 를 이용해서 문자열로 불러와서 사용할 수 있었다. 이를 확장해서 dotenv 환경을 사용했다. dotenv를 사용하게 되면 .env 파일 안에 다양한 환경변수를 입력하여 프로그램 실행 시에 인자로 넣을 수 있다. Nest..