전체 글 1249

Custom Pipe 만들기

1. 💡 Custom Pipe의 필요성NestJS는 기본적으로 ValidationPipe나 ParseIntPipe와 같은 내장 파이프를 제공하지만, 애플리케이션의 특정 요구사항에 맞춰 사용자 지정(Custom) 변환 또는 검증 로직이 필요할 때가 있습니다.변환: 특정 포맷의 문자열(예: YYYY-MM-DD 형식)을 특정 객체(예: CustomDateObject)로 변환해야 할 때.검증: 값이 특정 범위 내에 있거나, 데이터베이스에 존재해야 하는 등 복잡한 비즈니스 규칙을 충족하는지 검증해야 할 때.2. 📝 Custom Pipe 구현 구조모든 커스텀 파이프는 NestJS의 PipeTransform 인터페이스를 구현하고 @Injectable() 데코레이터를 사용해야 합니다.2.1. PipeTransfor..

Interceptor (인터셉터): 로깅, 응답 변형, 캐싱

1. 🎭 Interceptor란 무엇인가요?인터셉터(Interceptor)는 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍) 개념을 구현한 NestJS의 컴포넌트입니다. 요청이 컨트롤러 핸들러로 가기 직전과, 컨트롤러가 응답을 반환한 후 양방향으로 실행 흐름을 가로채서(Intercept) 추가적인 로직을 실행할 수 있습니다.이는 컨트롤러 메서드 실행 전후에 공통적인 부가 기능(Cross-cutting Concerns)을 삽입하여, 컨트롤러의 핵심 비즈니스 로직을 깨끗하게 유지하는 데 도움을 줍니다.Interceptor의 주요 역할응답 변형 (Response Mapping): 컨트롤러가 반환하는 결과에 공통적인 형식(예: statusCode, data, message)을..

Guard (가드): 인증/인가 처리

1. ⚔️ Guard란 무엇이며 왜 필요한가요?가드(Guard)는 특정 라우트(Route)에 접근하는 클라이언트에게 권한이 있는지 확인하여 요청 처리를 허용하거나 거부하는 역할을 합니다. NestJS 파이프라인에서 미들웨어 다음으로 실행되며, Guard가 통과(모두 true 반환)되어야만 요청이 컨트롤러 핸들러로 전달됩니다.Guard의 주요 역할인증 (Authentication): 요청을 보낸 사용자가 시스템에 로그인된 유효한 사용자인지 확인합니다 (예: JWT 토큰 검증).인가 (Authorization): 로그인된 사용자가 해당 리소스에 접근하거나 특정 작업을 수행할 권한(Role)이 있는지 확인합니다 (예: "관리자만 사용자 삭제 가능").2. 🏗️ Guard 구현 방법Guard는 CanActiv..

Middleware (미들웨어): 요청 가공 및 전처리

1. 💡 Middleware의 개념 및 역할미들웨어(Middleware)는 HTTP 요청이 라우트 핸들러(컨트롤러 메서드)에 도달하기 직전에, 그리고 응답이 클라이언트에 도달하기 직전에 실행되는 함수 또는 클래스입니다. NestJS는 내부적으로 Express.js의 미들웨어 개념을 그대로 사용합니다.주요 역할미들웨어는 모든 요청에 대한 공통적인 전처리 및 후처리 작업을 수행합니다.로깅: 요청 시간, IP 주소, 요청 경로 등을 기록합니다.인증/토큰 추출: 헤더에서 JWT나 API 키를 추출하여 요청 객체에 첨부하거나, 기본적인 유효성 검사를 수행합니다. (복잡한 인증/인가 로직은 Guard가 담당)데이터 조작: 요청 본문(Body)이나 쿼리(Query) 데이터를 가공하거나 정규화합니다.CORS (Cro..

NestJS + Prisma: 대용량 처리 시 주의점

엑셀 파일 임포트는 소규모 데이터에서는 문제가 없지만, 수천, 수만 건 이상의 대용량 파일을 처리할 때는 서버의 안정성과 성능을 위해 반드시 추가적인 전략을 고려해야 합니다.1. 📉 메모리 및 성능 관리1.1. 메모리 오버플로우 방지 (청크 처리)문제점: 수만 개의 행을 가진 엑셀 파일을 한 번에 메모리(RAM)에 로드하고 이를 기반으로 대량의 DTO 객체를 생성하는 것은 Node.js의 메모리 제한(기본 약 1.5GB)을 쉽게 초과하여 메모리 오버플로우(OOM)를 일으킬 수 있습니다.해결책 (청크 분할): xlsx 라이브러리에서 데이터를 파싱할 때 전체 데이터를 한 번에 JSON으로 변환하지 않고, 데이터를 작은 덩어리(Chunk)로 나누어 순차적으로 처리하고 DB에 삽입해야 합니다. 예를 들어, 5..

엑셀 데이터 읽기: 특정 시트 및 특정 행부터 파싱

NestJS에서 xlsx 라이브러리를 사용하여 엑셀 파일의 데이터를 읽을 때, 원하는 특정 시트에서 특정 행부터 데이터를 추출하는 것이 실무에서 매우 중요합니다. 이는 엑셀 파일의 상단에 제목, 설명, 헤더 정보 등 불필요한 행들이 포함되어 있기 때문입니다.1. 📖 특정 시트(Worksheet) 선택엑셀 파일 내에는 여러 시트가 있을 수 있습니다. XLSX.read로 워크북 객체를 생성한 후, 원하는 시트의 이름을 키(Key)로 사용하여 해당 시트 객체를 가져옵니다.// buffer: 파일 업로드로 받은 엑셀 파일의 데이터 Bufferconst workbook = XLSX.read(buffer, { type: 'buffer' });// 💡 1. 원하는 시트 이름 지정const sheetName = '..

NestJS + MySQL 실전 예제: Excel Import

1. 📤 엑셀 파일 업로드 환경 설정 (Multer)NestJS에서 파일 업로드를 처리하려면 @nestjs/platform-express에서 제공하는 MulterModule을 사용합니다. Multer는 HTTP 요청의 multipart/form-data를 파싱하여 파일을 처리하는 미들웨어입니다.1.1. MulterModule 설정파일 업로드를 처리할 모듈(예: UploadModule)에 Multer를 설정합니다. 여기서는 파일을 메모리(Buffer)에 저장하여 바로 읽는 방식을 사용합니다.// upload.module.tsimport { Module } from '@nestjs/common';import { MulterModule } from '@nestjs/platform-express';import..

NestJS + Prisma: 트랜잭션과 관계(Relation)

1. 🤝 트랜잭션 (Transactions)트랜잭션은 여러 데이터베이스 작업(쿼리)을 하나의 논리적인 작업 단위로 묶어 처리하는 기능입니다. 트랜잭션 내의 모든 작업은 성공하거나(Commit), 하나라도 실패하면 전체 작업이 취소(Rollback)되어 데이터의 일관성을 보장합니다.Prisma는 두 가지 방법으로 트랜잭션을 지원합니다.1.1. 상호작용적 트랜잭션 (Interactive Transactions)복잡하고 상호 의존적인 작업 흐름을 처리할 때 사용합니다. 이는 트랜잭션 블록 내에서 비동기 작업을 포함한 복잡한 로직을 순서대로 실행할 수 있게 해줍니다.// posts/posts.service.tsasync createPostAndLog(createPostDto: CreatePostDto, use..

NestJS + Prisma: CRUD 예제 (Service 구현)

이 예제에서는 이전에 설정한 PrismaService를 주입받아, 실제 비즈니스 로직을 담당하는 PostsService를 구현하고 기본적인 CRUD (Create, Read, Update, Delete) 작업을 수행해 보겠습니다.가정: schema.prisma에 Post 모델이 정의되어 있으며, id, title, content 필드가 있다고 가정합니다.1. 📝 Post DTO 정의 (입력/출력)CRUD 작업을 위해 DTO를 먼저 정의합니다.// posts/dto/create-post.dto.tsimport { IsString, IsNotEmpty } from 'class-validator';export class CreatePostDto { @IsNotEmpty() @IsString() titl..

Prisma Client 생성

1. 💡 Prisma Client란 무엇인가요?Prisma Client는 NestJS를 비롯한 TypeScript/Node.js 애플리케이션에서 데이터베이스와 상호작용하기 위해 사용하는 자동 생성된(auto-generated) 타입 안전한 쿼리 빌더입니다.이 클라이언트는 이전에 설계한 schema.prisma 파일의 모델 구조(예: User, Post)를 기반으로 생성됩니다.Prisma Client의 주요 특징타입 안전성: Prisma Client의 모든 메서드와 반환 타입은 schema.prisma에 정의된 모델을 기반으로 생성됩니다. 따라서 쿼리를 작성할 때 오타나 잘못된 필드 사용을 컴파일 시점에 잡아낼 수 있어 TypeScript 환경에서 최고의 개발 경험을 제공합니다.직관적인 API: 데이터베..