방로그
BACKEND
11 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
kafka가 뭐야?

1. 카프카(kafka)란? kafka는 모델의 입니다. 분산 환경에 특화되어 있는 특징을 가지고 있습니다. 1-1. 아키텍쳐 카프카 클러스터를 중심으로 Producer와 Consumer가 데이터를 Push하고 Pull하는 구조입니다. Producer, Consumer는 각기 다른 프로세스에서 비동기로 동작하고 있습니다. 아키텍처를 좀 더 자세히 표현하면 아래와 같습니다. 2. 구성요소 2-1. Event 는, kafka에서 Producer와 Consumer가 데이터를 주고받는 단위입니다. 이 글에서는 이벤트 또는 메시지로 표기하겠습니다. 2-2. Producer 는 kafka에 메시지를 게시(post) 하는 클라이언트 애플리케이션을 의미합니다. 2-3. Kafka Cluster Kafka Server로 이루어진 클러스터를 말합니다. Kafka Cluster를 이루는 각 요소는 다음과 같습니다. Broker 카프카 서버를 말합니다. Zookeeper 주키퍼(Zookeep…

May 13, 2023
BACKEND
MongoDB(ReplicaSet)

MongoDB ReplicaSet? MongoDB의 레플리카 셋 구성 기능은 데이터베이스의 고가용성 환경을 위해 필요한 기술입니다. DB 노드의 장애가 발생하거나, DB에 문제가 발생하는 경우에도 빠르게 장애에 대응하여 복구() 하는 시간을 줄일 수 있는 장점을 갖게 합니다. MongoDB는 자체적인 기능으로 복제 기능을 지원합니다. 레플리카 셋의 가장 큰 목적은 서비스 중인 MongoDB 인스턴스에 문제가 생겼을 때, 레플리카 셋의 구성원 중의 하나인 복제 노드가 장애 노드를 즉시 대체하는 것입니다. 어떠한 상황에서도 클라이언트와 DB와의 통신은 지속적으로 동작할 수 있도록 구성하는 가장 기본적인 물리적인 DB 설계 방식입니다. MongoDB의 복제를 수행하기 위해서는 여러 mongodb 인스턴스가 모인 레플리카 셋이 필요합니다. 레플리카 셋의 구성원이 되면 서로의 정보를 동기화합니다. 구성 Primary: 클라이언트에서 DB로 읽기 및 쓰기 작업을 합니다. Secondary: …

March 18, 2023
BACKEND
MongoDB(BulkWrite)

BulkWrite란? BulkWrite는 MongoDB 데이터 쓰기 명령( , , )을 모아서 한 번에 실행할 수 있는 명령입니다. BulkWrite 명령은 다음과 같은 명령을 한 번에 모아서 실행할 수 있는데, 반드시 하나의 컬렉션에 대해서만 데이터를 변경할 수 있습니다. BulkWrite 실행 가능한 명령어 insertOne updateOne updateMany replaceOne deleteOne deleteMany BulkWrite 실행 BulkWrite 명령의 결과는 와 그리고 등의 명령 단위로 정리해서 적용된 건수를 보여줍니다. 처리 결과 insertedIds 서브 도큐먼트에서는 INSERT된INSERT 된 도큐먼트들의 _id값을 반환하며, upsertedIds 서브 도큐먼트에서는 UPDATE 명령의 upsert 플래그가 true일 때 INSERT 된 도큐먼트들의 _id값을 반환합니다. BulkWrite 명령에 입력하는 각 하위 명령은 각자의 도큐먼트 포맷을 가지는…

March 11, 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
MySQL에서 emoji 문자 저장 문제 해결하기

MySQL에서 Emoji 문자 저장 문제 해결하기 문제 개요 기존 MySQL에서 한글 및 다른 언어가 깨지는 문제를 해결하려면 character set을 utf8로 설정해야 했습니다. 하지만 emoji 같은 특수 문자는 어떻게 처리해야 할까요? character set이 utf8로 설정된 게시판에 emoji로 된 글을 남겨 보았습니다. 결과는 글자가 깨져 보였습니다. 문제 발생 이유 UTF-8은 1~4 Byte까지 다양한 길이의 문자를 표현할 수 있는 가변 바이트 인코딩 방식입니다. 1 Byte는 ASCII 문자, 2-4 Byte는 다양한 국제 문자를 포함합니다. 그러나 MySQL에서 사용되는 utf8 character set은 최대 3 Byte까지의 문자만 지원합니다. 이 때문에 4 Byte로 인코딩된 emoji와 같은 문자를 저장하려고 하면 MySQL의 utf8 character set은 이를 표현할 수 없어서 데이터 손실이 발생하고, 결국 글자가 깨져 보이게 되는 것입니다. …

January 20, 2020
BACKEND