728x90

로컬 서버에 파일을 저장하는 방식은 서버를 확장하거나 컨테이너화할 때 문제가 발생합니다. 따라서 안정적인 서비스를 위해서는 AWS S3와 같은 클라우드 저장소를 사용하는 것이 필수적입니다. NestJS에서는 multer의 저장소 엔진을 S3로 변경해주는 **multer-s3**를 사용합니다.
728x90
1. 🛠️ 사전 준비 (의존성 및 환경 변수)
- 필수 라이브러리 설치:
npm install @aws-sdk/client-s3 multer-s3 npm install -D @types/multer-s3 - 환경 변수 (.env) 설정: ConfigService가 S3 인증 정보를 안전하게 로드할 수 있도록 .env 파일에 다음 정보가 정의되어야 합니다.
AWS_S3_REGION=ap-northeast-2 AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY AWS_S3_BUCKET_NAME=your-nest-s3-bucket-name
2. 📝 MulterModule을 S3 저장소로 설정
MulterModule을 동적으로 등록하는 **registerAsync**를 사용하여 ConfigService를 주입받아 S3 Client를 초기화하고, multer-s3를 저장소로 설정합니다.
이 설정은 파일이 NestJS 서버를 거쳐 바로 S3 버킷으로 업로드되도록 합니다.
728x90
3. 🔗 컨트롤러에 적용 및 결과
위 설정을 완료하면, 컨트롤러에서 파일을 받는 방식은 로컬 저장소 방식과 완전히 동일합니다. FileInterceptor가 요청을 가로채고, multer-s3 설정에 따라 파일이 자동으로 S3로 업로드됩니다.
// src/users/users.controller.ts (예시)
import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('users')
export class UsersController {
@Post('avatar')
// 'avatar' 필드 이름으로 단일 파일 인터셉트
@UseInterceptors(FileInterceptor('avatar'))
uploadAvatar(@UploadedFile() file: Express.MulterS3.File) {
// 💡 파일이 성공적으로 S3에 업로드되었으며, file 객체에 정보가 담겨 있습니다.
// file.location: S3에 업로드된 파일의 공개 URL (public-read 설정 시)
// file.key: S3 버킷 내의 파일 경로
return {
url: file.location,
key: file.key,
};
}
}
728x90
'Nest.js를 배워보자 > 9. NestJS에서 파일 업로드 & 관리 — S3, 로컬 저장소' 카테고리의 다른 글
| 대용량 파일 처리 전략 (0) | 2025.12.02 |
|---|---|
| NestJS 파일 유효성 검사 (Validation Pipe) (0) | 2025.12.02 |
| NestJS 파일 업로드: MulterModule 설정 (0) | 2025.12.02 |