Nest.js를 배워보자/9. NestJS에서 파일 업로드 & 관리 — S3, 로컬 저장소

AWS S3 업로드: 클라우드 파일 관리

_Blue_Sky_ 2025. 12. 2. 22:30
728x90

 


로컬 서버에 파일을 저장하는 방식은 서버를 확장하거나 컨테이너화할 때 문제가 발생합니다. 따라서 안정적인 서비스를 위해서는 AWS S3와 같은 클라우드 저장소를 사용하는 것이 필수적입니다. NestJS에서는 multer의 저장소 엔진을 S3로 변경해주는 **multer-s3**를 사용합니다.

728x90

1. 🛠️ 사전 준비 (의존성 및 환경 변수)

  1. 필수 라이브러리 설치:
    npm install @aws-sdk/client-s3 multer-s3
    npm install -D @types/multer-s3
    
  2. 환경 변수 (.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