AWS S3 버킷을 이용하여 파일 업로드 로직을 구현하는 방법에 대해 설명한 글입니다.
📍 참고사항
1. 해당 글에서는 S3 버킷을 만들고 액세스 키를 발급받는 방법이 생략되어 있습니다.
2. 해당 글에서는 Express 프로젝트를 생성하고, DB를 연결하는 등의 방법이 생략되어 있습니다.
3. 개발 언어로는 JS를 사용하며, ORM 라이브러리는 typeorm을 사용한 프로젝트입니다. (ORM 라이브러리는 상관 X)
버킷이 아직 없다면 아래 글을 참고해 주세요!
https://hulrud.tistory.com/105
환경 변수 설정
AWS_ACCESS_KEY_ID=액세스 키 아이디
AWS_SECRET_ACCESS_KEY=비밀 액세스 키
AWS_REGION=버킷 리전 (아시아-서울인 경우: ap-northeast-2)
S3_BUCKET_NAME=버킷 이름
먼저 .env 파일에 버킷과 액세스 키 관련 정보를 작성합니다.
라이브러리 설치
npm install @aws-sdk/client-s3 multer-s3
AWS SDK와 multer-s3를 설치합니다.
설정 파일 작성
src/config 에 s3client.js 파일을 만들어 아래와 같이 작성합니다.
const { S3Client } = require('@aws-sdk/client-s3');
const s3 = new S3Client({
region: process.env.AWS_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
module.exports = s3;
src/config 에 multerConfig.js 파일을 만들어 아래와 같이 작성합니다.
const multer = require('multer');
const multerS3 = require('multer-s3');
const path = require('path');
const s3 = require('./s3Client'); // S3 클라이언트 불러오기
const upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.S3_BUCKET_NAME,
key: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
// profiles/ 디렉토리 밑으로 저장
// 루트에 저장하거나, 다른 디렉토리에 저장해야 할 경우에는 적절히 코드를 수정하세요.
cb(null, `profiles/${uniqueSuffix}${path.extname(file.originalname)}`); // S3에 저장될 파일 경로와 이름
},
contentType: multerS3.AUTO_CONTENT_TYPE,
}),
});
module.exports = upload;
라우터 파일에 다음과 같이 작성합니다.
제 토이프로젝트에 적용한 코드라 몇 부분은 생략하였습니다. 핵심 코드를 보시고 여러분의 상황에 맞게 적절히 적용해 주세요!
const express = require('express');
const upload = require('../config/multerConfig'); // Multer 설정 불러오기
const router = express.Router();
router.post('/', upload.single('profile_img'), async (req, res) => {
try {
const newData = {
name: req.body.name,
email: req.body.email,
profile_img: req.file ? req.file.location : null, // S3 URL을 저장
};
// 데이터 베이스 저장 로직은 여러분의 프로젝트 상황에 맞추어 작성하세요!
const createdData = await create(createdData);
res.status(201).json(createdTeacher); // 201 Created 상태 코드 반환
} catch (error) {
res.status(500).json({ error: 'Internal Server Error' });
}
});
module.exports = router;
포스트맨으로 테스트했을 때 성공적으로 업로드 됩니다.
저는 profiles/ 에 파일을 저장했는데, 다른 디렉토리에 저장하실 분들은 multerConfig.js 파일을 적절히 수정하시길 바랍니다.
'Framework > Node.js' 카테고리의 다른 글
[Node.js] dotenv로 환경변수 관리하기 (0) | 2024.01.04 |
---|---|
[Node.js] 몽구스 사용해보기 (0) | 2023.12.26 |
[Node.js] 미들웨어에 대해 알아보자 (1) | 2023.12.20 |
[Node.js] 시퀄라이저와 ORM, 프로젝트 템플릿 (0) | 2023.12.17 |
[Node.js] Node.js 설치하고 자바스크립트 파일 실행하기 (0) | 2023.07.27 |