전체 글 1250

RabbitMQ, Kafka 연동 (이벤트 기반 통신)

TCP 기반 통신은 요청-응답(Request-Response) 패턴에 적합하지만, 복잡한 분산 환경에서는 비동기적이며 이벤트 기반(Event-Based)인 통신 방식이 필요합니다. NestJS는 RabbitMQ나 Kafka와 같은 메시지 브로커를 활용하여 이를 쉽게 구현할 수 있습니다.1. 이벤트 기반 통신의 장점2. NestJS RabbitMQ 연동 설정RabbitMQ는 AMQP(Advanced Message Queuing Protocol) 기반의 인기 있는 메시지 브로커입니다.A. RabbitMQ 서버 (Provider) 설정RabbitMQ 연결 정보를 설정하고, 메시지를 수신하는 서버 역할을 합니다.// src/main.tsimport { NestFactory } from '@nestjs/core'..

TCP 기반 마이크로서비스 (Microservice)

NestJS는 마이크로서비스 아키텍처(MSA)를 구현하기 위해 다양한 트랜스포트 레이어(Transport Layer)를 지원하며, 그중 TCP(Transmission Control Protocol)는 가장 기본적이고 사용하기 쉬운 방식입니다.TCP 기반 마이크로서비스는 클라이언트(Client) 역할을 하는 NestJS 서비스(또는 API Gateway)와 서버(Server) 역할을 하는 NestJS 마이크로서비스가 TCP 소켓을 통해 통신하는 구조입니다.1. 마이크로서비스 서버 (Provider) 설정TCP 연결을 수신하고 메시지를 처리하는 실제 마이크로서비스입니다.A. 앱 모듈 설정AppModule에서 기본 HTTP 서버 대신 마이크로서비스 서버를 실행하도록 설정합니다.// src/app.module...

인증된 WebSocket 연결 (심화)

HTTP 기반의 REST API와 달리, WebSocket은 초기 핸드셰이크(Handshake) 시에만 인증 정보를 확인하며, 이후에는 이 연결 상태를 지속적으로 유지해야 합니다. NestJS에서는 Guard와 Pipe를 사용하여 HTTP와 유사하게 인증을 처리할 수 있습니다.1. 클라이언트 측에서 토큰 전달클라이언트는 연결을 시도할 때 JWT 토큰을 Socket.io의 auth 옵션을 통해 서버로 전달합니다.// 클라이언트 (예: Vue, React, Plain JS)const token = 'YOUR_VALID_JWT_TOKEN';const socket = io('http://localhost:8080/chat', { auth: { token: token, // 서버의 Gateway로 전달됨 ..

실시간 채팅 예제와 인증된 WebSocket 연결

💬 1. 실시간 채팅 예제 구현 (Full Code)앞서 설정한 ChatGateway 클래스를 확장하여 기본적인 실시간 채팅 기능을 완성해 보겠습니다. 이 예제에서는 클라이언트가 메시지를 전송하면, 서버가 이를 수신하여 발신자를 제외한 모든 연결된 클라이언트에게 메시지를 브로드캐스팅합니다.// src/chat/chat.gateway.tsimport { WebSocketGateway, SubscribeMessage, MessageBody, ConnectedSocket, WsResponse, OnGatewayConnection, OnGatewayDisconnect,} from '@nestjs/websockets';import { Server, Socket } from 'socket.io';im..

NestJS WebSocket Gateway 기본 설정

NestJS에서 실시간 시스템을 구축하는 핵심은 @WebSocketGateway() 데코레이터가 적용된 Gateway 클래스입니다. 이 클래스는 WebSocket 서버의 동작을 정의하고, 클라이언트의 연결 및 메시지 이벤트를 처리합니다.1. Gateway 클래스 기본 설정NestJS CLI를 사용해 게이트웨이를 생성하거나 직접 파일을 만듭니다.# NestJS CLI로 생성nest g gateway chat기본적인 Gateway 클래스 설정은 다음과 같습니다.// src/chat/chat.gateway.tsimport { WebSocketGateway, SubscribeMessage, MessageBody, ConnectedSocket, WsResponse, OnGatewayInit, OnGa..

NestJS Swagger로 완벽한 API 문서를 만드는 5가지 베스트 프랙티스

NestJS는 엔터프라이즈급 백엔드 애플리케이션 구축에 최적화된 프레임워크입니다. 여기에 Swagger를 결합하면 자동화되고 일관된 API 문서를 손쉽게 만들 수 있죠. 단순히 문서가 "작동"하는 것을 넘어, "유지보수가 쉽고 명확한" API 문서를 만드는 5가지 핵심 베스트 프랙티스를 소개합니다.1. DTO와 함께 @ApiProperty()를 의무화하세요API 문서화의 핵심은 데이터 모델의 명세입니다. 요청(Request) 및 응답(Response)에 사용되는 DTO (Data Transfer Object) 클래스에 @ApiProperty() 데코레이터를 사용하여 필드의 상세 정보를 명시하는 것을 원칙으로 삼아야 합니다.속성역할베스트 프랙티스description필드의 용도 설명필수! 명확하고 간결하게 ..

NestJS Interceptors 기반 Response Wrapping 베스트 프랙티스

1. Interceptor의 역할 이해Interceptors는 Aspect-Oriented Programming (AOP) 개념을 구현하며, 메서드 실행 전후에 추가적인 로직을 삽입하는 데 사용됩니다. Response Wrapping에서는 주로 응답이 클라이언트로 전송되기 직전에 응답 데이터를 가로채서(intercept) 표준화된 형식으로 포장하는 역할을 합니다.2. 베스트 프랙티스 추천1) 응답 구조 표준화 (Standardized Response Format)성공적인 REST API 응답은 항상 예측 가능한 일관된 구조를 가져야 합니다. 이를 위해 모든 성공 응답을 감싸는 표준 DTO (Data Transfer Object)를 정의합니다.목표: 클라이언트가 200/201 상태 코드에 대해 항상 동일한..

NestJS REST API 에러 핸들링 베스트 프랙티스

NestJS에서 REST API의 에러 핸들링은 일관적이고 예측 가능한 방식으로 클라이언트에게 오류 정보를 제공하는 데 초점을 맞춥니다.1. 전역 예외 필터 (Global Exception Filter) 활용NestJS의 Exception Filter를 사용하여 모든 애플리케이션 레벨의 예외를 중앙 집중식으로 처리하는 것이 가장 중요합니다.목표: 모든 예외 응답의 형식을 통일하고, 에러 로깅 등의 공통 작업을 한 곳에서 처리합니다.구현: main.ts 또는 app.module.ts에서 전역으로 등록하여 Controller 계층 밖에서 발생하는 모든 예외를 잡아 처리합니다. // main.ts 또는 app.module.ts// 모든 예외를 처리할 AllExceptionsFilter를 전역으로 등록app.u..

NestJS REST API 폴더 구조 추천

NestJS 프로젝트의 폴더 구조는 애플리케이션의 규모와 복잡성에 따라 달라질 수 있지만, 일반적으로는 모듈 기반(Feature-based) 구조를 채택하는 것이 가장 유지보수와 확장성 면에서 좋은 베스트 프랙티스로 권장됩니다.1. 모듈 기반 폴더 구조 (Feature-based)애플리케이션의 각 도메인이나 기능(Feature)을 하나의 모듈로 묶는 방식입니다. 이 구조는 규모가 커질수록 명확한 관심사 분리(Separation of Concerns)를 제공합니다.src/├── app.module.ts // Root Module├── main.ts // Entry point│├── common/ // 공통/전역(Global)에서 사용되는 요소│ ├─..

대용량 파일 처리 전략

1. ⚠️ 대용량 파일 처리의 문제점기본 multer 설정은 파일 전체를 메모리에 로드한 후(버퍼링), 저장소(로컬 디스크 또는 S3)에 기록하는 방식으로 작동합니다.메모리 오버로드: 수백 MB의 파일을 동시에 여러 사용자가 업로드하면 서버 메모리가 빠르게 소진되어 Out of Memory (OOM) 오류가 발생하고 서버가 다운될 수 있습니다.타임아웃: 네트워크 속도가 느릴 경우, 파일 전체가 서버에 도착할 때까지 시간이 너무 오래 걸려 요청 타임아웃이 발생할 수 있습니다.2. 💡 전략 1: 파일 스트리밍 (Streaming)파일을 메모리에 한 번에 올리지 않고, 스트림(Stream) 형태로 데이터를 조금씩 읽고 동시에 저장소에 쓰는 방식입니다.2.1. 구현 원리multer의 디스크 저장소(diskSt..