[AWS] Node.js Multer๋กœ S3์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ณ  Mysql์— ์ €์žฅํ•˜๊ธฐ

2020. 11. 28. 15:43ใ†๐ŸŒฑ Develop/Server

๐Ÿ›  1. ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ S3 ์ •๋ณด์ž…๋ ฅ

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ multer,multer-s3๊ณผ aws-sdk๋ฅผ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.

npm install multer
npm install multer-s3

npm install aws-sdk  ๐Ÿ‘‰ s3,ec2 ๋“ฑ ๊ฐ์ฒด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

์„ค์น˜ํ–ˆ๋‹ค๋ฉด ๐Ÿ“ config ํด๋”์— js ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”!

 

 

s3 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•  ๋•Œ csv๋กœ ์ €์žฅํ–ˆ๋˜ ํŒŒ์ผ์—์„œ KeyID์™€ SecretKey, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์ „์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋ฆฌ์ „์€ ์„œ์šธ๋กœ ๋งŒ๋“ค์–ด์„œ, ap-northeast-2๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ํ‚ค๋“ค์„ ๊ทธ๋Œ€๋กœ github์— ์˜ฌ๋ ธ ์„ ์‹œ์—๋Š” ํ•ดํ‚น์œผ๋กœ ๊ณผ๊ธˆ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋“œ์‹œ .gitignore ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  .env๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์„ธ์š”!

 

const multer = require('multer');
const multerS3 = require('multer-s3');
const aws = require('aws-sdk');
require('dotenv').config();

const s3 = new aws.S3({
  accessKeyId: process.env.S3_KEYID,  ๐Ÿ‘‰ keyID ์ž…๋ ฅ 
  secretAccessKey: process.env.S3_PRIVATE_KEY, ๐Ÿ‘‰ ์‹œํฌ๋ฆฟ ํ‚ค ์ž…๋ ฅ
  region: process.env.REGION, ๐Ÿ‘‰ ๋ฒ„ํ‚ท ์ƒ์„ฑ ๋ฆฌ์ „ ์ž…๋ ฅ
});

 

multer์—์„œ ๊ฐ key์— ๋Œ€ํ•œ ์†์„ฑ ๊ฐ’์„ ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์กฐ๊ฑด๋„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, ๐Ÿ“š npm ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

let upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: process.env.BUCKET_NAME,
    contentType: multerS3.AUTO_CONTENT_TYPE,
    acl: 'public-read',
    key: (req, file, cb) => {
      cb(null, `${Date.now()}_${file.originalname}`);
    },
  }),
});

exports.upload = multer(upload);



๐Ÿ“ฉ 2. multer๋กœ s3์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ

 

๐Ÿ“ router / s3.js
multer์€ ๋ฏธ๋“ค์›จ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— router ๋”ด์—์„œ ์ถ”๊ฐ€๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.
์ €๋Š” Controller-Service-Model ๊ตฌ์กฐ๋กœ ํด๋”๋ง์„ ํ•ด์„œ, Controller์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ช…์‹œํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๊นŒ config/s3.js์—์„œ ์„ค์ •ํ–ˆ๋˜ upload๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๋ฅผ req์—์„œ ๋ฐ›์•„์˜ฌ ๋•Œ๋Š” req.file๋กœ ๋ฐ›์•„์˜ค๋Š”๋ฐ, ์ด๋Š” controller์—์„œ ์„ค๋ช…ํ• ๊ฒŒ์š”ใ€ฐ๏ธ

var express = require('express');
var router = express.Router();
const ticketController = require('../controller/ticket');
const { upload } = require('../config/s3');

router.post('/upload', upload.single('ticketImg' ๐Ÿ‘‰ ํŒŒ์ผ๋ช…), ticketController.registerTicket);

module.exports = router;

๋” ๋งŽ์€ ์ด๋ฏธ์ง€๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

upload.array('ํŒŒ์ผ๋ช…', ์ตœ๋Œ€ ํŒŒ์ผ ๊ฐœ์ˆ˜) -> req.files
upload.field('[{ name : 'ํŒŒ์ผ๋ช…' }, { name : 'ํŒŒ์ผ๋ช…' }, { name : 'ํŒŒ์ผ๋ช…' } .....]')

 

๐Ÿ“ Controller / register.js

์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” req.file๋กœ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๋ฐ›์•„๋ด…๋‹ˆ๋‹ค.
.location์„ ํ•˜๋ฉด s3 ๊ฒฝ๋กœ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด ๊ฒฝ๋กœ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‚ฌ์ง„ ์ •๋ณด๋ฅผ ์ฃผ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

exports.register = async (req, res, next) => {
  const Img = req.file;
  console.log('s3 ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ :',Img.location);
};

๐Ÿƒ‍โ™€๏ธ postman์—์„œ file์„ ์ „์†กํ•˜๋ ค๋ฉด body์˜ form-data๋ฅผ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์•„๊นŒ ์ง€์ •ํ–ˆ๋˜ ๐Ÿ‘‰ํŒŒ์ผ๋ช…์ธ 'ticketImg'๋ฅผ key๋กœ ๋„ฃ๊ณ , ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€ value์— ๋„ฃ์€ ๋’ค send๋ฅผ ๋ˆ„๋ฅด๋ฉดใ€ฐ๏ธใ€ฐ๏ธ
s3 ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ € ๋งํฌ๋ฅผ ๋”ฐ๋ผ์„œ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์–ด๋””์„œ๋‚˜ ์‚ฌ์ง„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ S3 ํด๋” ๋ณ„๋กœ ์—…๋กœ๋“œํ•˜๋Š” ๋ฒ•โ“

s3์—์„œ 'ํด๋” ๋งŒ๋“ค๊ธฐ'๋กœ ํด๋” ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ €๋Š” ticket์ด๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค์–ด๋†“์•˜์Šต๋‹ˆ๋‹ค.

 

 

์•ž์—์„œ ๐Ÿ“ config/ s3.js ์ฝ”๋“œ์— ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!
${Date.now()}_${file.originalname} ์—์„œ ์•ž์— ํด๋” ์ด๋ฆ„/ ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

๊ทธ๋Ÿฌ๋ฉด s3 ํด๋” ์•ˆ์— ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.