BACKEND
7 posts
NestJs(Fastify) + MongoDB 템플릿 만들기

저는 웹 API를 구축할 때 NestJS를 주로 사용합니다. 프로젝트를 새로 시작할 때 이전에 다른 프로젝트의 Repo를 복사하여 필요 없는 부분을 지우고 사용합니다. 그러던 중 공통으로 사용될만한 코드들을 모아서 보일러 플레이트를 만들어두면 편할 것 같다는 생각을 하게 되었습니다. 따라서 주로 사용되는 NestJs + Fastify + MongoDB 가 연동된 보일러 플레이트를 제작하는 과정을 공유하고자 합니다. MongoDB는 이미 세팅되어 있는 것을 전제로 하고 있습니다. Require NodeJs 16.20.x Install 우선 를 설치해줍니다. 그 후 project를 생성해보겠습니다. 위의 명령어를 실행하면 아래와 같은 입력창이 뜰 것입니다. 원하는 를 선택해줍니다. 설치가 완료된다면 아래와 같은 폴더 구조가 생성되어 있을 것입니다. src: 소스 코드 폴더 test: 테스트 코드 폴더 서버를 띄워보겠습니다. 포트번호는 기본 번입니다. Swagger 우선 API 문…

November 17, 2023
BACKEND
대용량 엑셀 다운로드 이슈

하루는 개발팀에게 CS가 들어왔습니다. 고객이 엑셀 다운로드하려고 하는데 브라우저가 죽는다는 CS였습니다. 확인 결과 DB에서 데이터를 읽어온 후 클라이언트 단에서 엑셀 파일을 생성하고 있는 것이였습니다. 기존에는 이하의 데이터를 만들고 있었고, 이슈가 된 데이터 수를 확인하니 로 확인되었습니다. 엑셀 파일을 만들다가 브라우저가 죽다니? XLSX 파일의 형식은 OOXML(Open Office XML) 입니다. OOXML 이름 그대로 XML을 기반으로 데이터를 저장하고 표현합니다. XLSX 파일은 여러 XML 파일을 포함하는 폴더를 압축한 형태입니다. (확장자를 .zip으로 변경 후 압축을 해제하면 아래와 같은 파일을 볼 수 있습니다.) row의 정보는 파일에 저장되는데 이 파일에는 필요한 정보 외에 XML 오버헤드도 굉장히 많기 때문에 몇 만의 row 정보를 한 번에 메모리에 올리면 이 발생할 가능성이 큽니다. 따라서 stream처리가 되어야 합니다. 기존 구조는 아래와 같았…

August 05, 2023
BACKEND
kafka를 설치 및 연동해보자 (with NestJs)

카프카(kafka)란? 설치 방법 STEP 1. DOWNLOAD KAFKA STEP 2. zookeeper 구동 백그라운드로 구동시키고 싶을 경우 -daemon 명령어를 추가합니다. zookeeper? 분산 애플리케이션을 구축하다보면, 분산 애플리케이션 관리를 위한 안정적인 코디네이션 애플리케이션이 추가로 필요하게 됩니다. 따라서 안정적인 코디네이션 서비스로 검증된 주키퍼를 많이 사용하게 됩니다. 주키퍼는 분산 애플리케이션이 안정적인 서비스를 할 수 있도록 분산되어 있는 각 애플리케이션의 정보를 중앙에 집중하고 구성 관리, 그룹 관리 네이밍, 동기화 등의 서비스를 제공합니다. 서버 여러 대를 클러스터로 구성하고, 분산 애플리케이션들이 각각 클라이언트가 되어 주키퍼 서버들과 커넥션을 맺은 후 상태 정보 등을 주고 받습니다. 위의 그림에서 Server는 주키퍼, Client는 카프카가 됩니다. STEP 3. Kafka 구동 서비스가 제대로 띄워졌는지 확인해보려면 포트가 정상적으…

May 20, 2023
BACKEND
NestJS 로깅 도입하기 (winston)

웹 API 서버를 운영할 때 중요한 것 중 하나가 바로 로그를 쌓는 것입니다. NestJS에 NodeJs의 대표적인 로그 모듈 중 하나인 winston을 도입해 로그를 남기는 방법을 알려드리고자 합니다. Middleware 미들웨어는 라우터 핸들러(컨트롤러) 전에 호출되는 함수입니다. Request - Response 사이클 중에 reqeust, response 객체에 접근할 수 있고, next 미들웨어 기능에 접근할 수 있습니다. NestJs의 Middleware는 기본적으로 express 의 Middleware와 동일합니다. 어떠한 코드도 실행할 수 있음. Request, Response 객체를 변경할 수 있음 Request - Response 주기를 종료시킬 수 있음 next 미들웨어 함수를 호출할 수 있음 현재 미들웨어 함수가 Request - Response 주기를 종료시키지 않는다면, 반드시 next 미들웨어 함수를 실행해야 합니다. 그렇지 않는다면 Request는 계…

January 14, 2023
BACKEND
NestJS 예외 처리 (Error Exception)

NestJs에는 애플리케이션 전체의 모든 예외 처리를 하는 Exceptions Layer가 내장되어 있습니다. 애플리케이션 코드에서 예외 처리를 하지 않으면 이 레이어에서 예외를 처리합니다. 커스텀으로 예외 레이어를 만들지 않는다면 아래와 같이 기본 JSON 응답을 합니다. Exception Filters 기본 예외 필터가 자동으로 많은 경우의 예외 처리를 해주지만 custom으로 제어를 하고 싶은 경우가 있습니다. 예를 들어 다른 형태의 JSON 스키마로 반환하고 싶은 경우입니다. Usage 이제 위에서 만든 Exception Filter를 적용해보겠습니다. Exception Filter를 적용하고 싶다면 @UseFilters() 를 import해야 합니다. (이름이 아주 직관적이죠?🤣) User 컨트롤러의 라우팅 핸들러 전체에 Exception Filter를 적용하고 싶다면 @Controller() 에 위와 같이 적용하시면 됩니다. 그리고 특정 라우팅 핸들러에만 적용하고 싶다…

January 07, 2023
BACKEND
Redis-Stat 레디스 모니터링

레디스를 쓰다 보면 각 서버가 CPU, MEM 등 서버 자원을 얼마나 쓰고 있는지 모니터링할 필요가 있습니다. 그럴 때 간단하게 쓸 오픈 소스 라이브러리를 소가해드리겠습니다. Redis-Stat Redis-stat로 띄운 대시보드입니다. 포트별로 정보를 나눠서 볼 수도 있습니다. 맘에 드신다면 아래 설치를 따라가주세요. Install redis-stat은 ruby로 만들어져 있습니다. 따라서 관련 라이브러리들을 먼저 설치하셔야 합니다. 그런 뒤 gem을 이용하여 redis-stat을 설치합니다 Usage 아래는 웹 서버를 띄우는 명령어 입니다. 위의 로컬 주소와 포트는 여러분의 것에 맞게 설정하시면 됩니다. 주의 위의 명렁어를 실행하면 아래와 같은 경고 로그가 찍힐 것입니다. 하지만 걱정하지 마세요. https://stackoverflow.com/questions/41463999/warning-constant-fixnum-is-deprecated-when-generating…

December 10, 2022
BACKEND
배치 작업 어디까지 해봤니?

배치(Batch) 작업 어디까지 해봤니? 서비스를 구축하다 보면 많은 양의 데이터를 일괄적으로 변경하거나 삭제 등의 처리를 해야 할 순간이 옵니다. 이런 작업을 트래픽이 몰리는 시간 때에 하게 되면 서비스에 치명적일 수도 있고 잘못된다면 서비스 전체가 셧다운 되는 악몽을 꾸게 될 수도 있습니다. 이때 해야 하는 것이 배치(Batch) 작업입니다. 배치 작업은 데이터를 실시간으로 처리하는 게 아니라, 일괄적으로 모아서 한 번에 처리하는 작업을 의미합니다. 가령, 은행의 정산 작업의 경우 배치 작업을 통해 일괄처리를 수행하게 되며 사용자에게 빠른 응답이 필요하지 않은 서비스에 적용할 수 있습니다. 이번 글에선 MongoDB + NodeJs를 활용한 배치 작업 테스트 결과를 공유하고자 합니다. 테스트 환경 DB Spec Tencent Cloud CVM 2core / 2GB mongodb WT 4.2.19 DB Schema TestA name: string TestB name: strin…

November 26, 2022
BACKEND