๋ชฉ์ฐจ
ํ์ผ ์ ๋ก๋
์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ๋ ฅํ๋ฉด ์๋ฒ๋ storage์ ๊ทธ ํ์ผ์ ์ ๋ฆฌํ๋ค.
๋๊ฐ AWS๋ผ๋ฉด S3 ์๋น์ค, Naver์ object storage, Azure์ bucket ์๋น์ค, ์๋๋ฉด ์๋ฒ ๋์คํฌ์ ๋ฐ๋ก ์ ์ฅํ๋ ๊ฒฝ์ฐ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ์ผ์ ์ ์ฅํ๋ค. ํ์ผ์ ์ ์ฅํ ํ์, file.filename ์ ํตํด db์ ํ์ผ ๋ช ์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๋ค.
์ฌ์ฉ์๊ฐ ํ์ผ์ ์ญ์ ํ๊ฑฐ๋ ์์ ํ ๊ฒฝ์ฐ db์ ํ์ผ ๋ช ์ ์๋ก์ด ํ์ผ ์ด๋ฆ์ผ๋ก ์ ๋ฐ์ดํธ ๋๊ณ , storage์๋ ๋์ผํ๊ฒ ํ์ผ์ด ์ฌ๋ผ๊ฐ๋ค.
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด ํํ๋ก์ด ์๋ฒ ๋๋ผ์ด์ง๋ง, ๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ญ์ ํ ํ์ผ์ ์ฌ์ ํ storage์ ์ ์ฅ๋์ด ์๋ค. ๋ฐ๋ก storage์ delete์์ฒญ์ ๋ณด๋ด์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฏธ ํ์ผ์ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ
์ด๋ด ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. ์ฌ์ฉ์๊ฐ ํ์ผ์ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ๋๋ง๋ค storage์ ์ญ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ์๋ฒ ์ค์ผ์ค๋ง์ ์์ฑํด ํน์ ์๊ฐ์ ์ฌ์ฉํ์ง ์๋ ํ์ผ๋ค์ ํ๊บผ๋ฒ์ ์ญ์ ํ๋ค.
๊ฒ์ ์๋ฒ ๊ฐ์ด ์๋ฒ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ฒ ์ ํ๊ฒ ๊ด๋ฆฌํด์ผํ ๊ฒฝ์ฐ 1 ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ํนํ ๊ฒ์์ ํ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๊ณ์ ์ ์ฌ์ฉํ๋ฉฐ, ์์ดํ , ๊ธธ๋ ๋ฑ ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ค์ด ์ฐ๊ด๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒ๋ค๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฉํฐ ์๋ฒ๋ฅผ ์ด์ํ๋ ๋ฑ ์๋ฒ ๋น์ฉ์ด ์๋์ ์ผ๋ก ๋ค๋ฅธ ์๋น์ค์ ๋นํด ๋งค์ฐ ํฌ๋ค. ๋ฐ๋ก ๋ฐ๋ก ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๋๋ฏธ ๋ฐ์ดํฐ๊ฐ ๊ฒ์ก์ ์ ์๊ฒ ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ฐ๋ก ์ ๋ฆฌํด์ค๋ค๊ณ ํ๋ค.
์ปค๋ฎค๋ํฐ ๋ฑ ์ผ๋ฐ์ ์ธ ์น ์๋น์ค๋ค์ ๊ด๋ก์ ์ผ๋ก(?) ์ ์ฐํ๊ฒ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ค๊ณ ํ๋ค. 2๋ฒ ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ, ์ฃผ๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋๋ ค์ฃผ๋ ์๋ฒ ์ค์ผ์ค๋ง ๊ธฐ๋ฅ์ ํตํด ๊ด๋ฆฌํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์์ผ ์๋ฒฝ3์์ฏค ๋๋ฆฌ๋ ๊ฒ์ ์ข์ํ๋ค๊ณ ํ๋ค. ์ ์ผ ์ ๋งคํ ์๊ฐ๋... ใ ใ ใ ใ ์ ๋งคํ ์๊ฐ๋์ ๋ถํ๊ฐ ํฐ(?), ๋งค์ผ ๋๋ฆด ํ์์๋ ์ฝ๋๋ฅผ ๋๋ ค ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฏ ํ๋ค.
1๋ฒ ๋ฐฉ์์ ๋ฌธ์ ์
1๋ฒ ๋ฐฉ์ '์์ฒญ์ ๋ฐ๋ผ ๊ทธ๋ ๊ทธ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ค.'
์ด ๋ฐฉ์์ ๊ตฌํํ๋ ค๊ณ ์๊ฐํ๋ฉด ์๊ฐ๋ณด๋ค ๋ง์ ๋จ๊ณ์ ์๋๋ฆฌ์ค๊ฐ ์์๋๋ค.
A) ์ฌ์ฉ์๊ฐ ํ์ผ์ ์์ ํ๋ค.
→ ์์ ์ ํ์ผ๋ช ๊ฐ์ ธ์ค๊ธฐ, ์ญ์
B) ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ญ์ ํ๋ค.
→ ์ญ์ ํ๋ ํ์ผ๋ช ๊ฐ์ ธ์ค๊ธฐ, ์ญ์
C) ์ํ ์ ๋ณด๋ฅผ ์๊ตฌ ์ญ์ ํ๋ค
→ ์ํ ์ ๋ณด์ ์ฐ๊ฒฐ๋ ํ์ผ๋ช ๊ฐ์ ธ์ค๊ธฐ, ์ญ์
ํ์ผ์ ์์ ํ๋ , ์ฐ๊ฒฐ๋ ํ์ผ๋ง ์ญ์ ํ๋ ์ด์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ ๋ฐ์ดํธ ํด์ผํ๊ธฐ๋๋ฌธ์ ์ด์ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค. ๋ํ ์ง๊ธ ํ์ผ์ ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ๊ฐ ํ๋์ผ ๋๋ง ๊ฐ์ ํ ๊ฒ์ธ๋ฐ, ๊ด๋ จํ์ฌ ์ธ๋ค์ผ, ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ ์์๋๋ ๋์ค๊ฐ n๋ฐฐ๊ฐ ๋๋ค. ๋๋ฌธ์ ๋๋ 2๋ฒ ๋ฐฉ์์ ํํ๋ค. (์๋ฒ ์ค์ผ์ค๋ง์ ํ๋ฒ ๋์ ํ๊ณ ์ถ๊ธฐ๋ ํ๊ณ !)
2๋ฒ ๋ฐฉ์์ ๋ฌธ์ ์
2๋ฒ ๋ฐฉ์, '์๋ฒ ์ค์ผ์ค๋ง์ ์์ฑํด ํน์ ์๊ฐ์ ์ฌ์ฉํ์ง ์๋ ํ์ผ๋ค์ ํ๊บผ๋ฒ์ ์ญ์ ํ๋ค.'
์ด ๋ฐฉ์์ ์ค์ผ์ค๋ง ์ฝ๋๋ฅผ ๋ฐ๋ก ์์ฑํด์ผ ํ๋ค๋ ๋ฒ๊ฑฐ๋ก์๊ณผ, ์๋ฒ์ ์ ์ฅ๋ ํ์ผ์ด ๋ง์์๋ก ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์๋ค. ์ด์ธ์ ๋จ์ ์ ์ฐจ์ฐจ ์์๋ณด๋ ๊ฑธ๋ก ใ ใ
์ฌ์ฉํ์ง ์๋ ํ์ผ ๋ฆฌ์คํธ ๋ฝ๊ธฐ (์ฐจ์งํฉ)
2๋ฒ ๋ฐฉ์์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐ์ (A)db์ ์ ์ฅ๋ ํ์ฌ ์ฌ์ฉ์ค์ธ ํ์ผ๋ช ์ ๋ฐฐ์ด๋ก ๊ฐ์ ธ์จ๋ค. (B) ๊ทธํ ์ค์ ์๋ฒ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๋ชจ๋ ํ์ผ๋ช ์ ๋ฐฐ์ด๋ก ๊ฐ์ ธ์จ๋ค. ๊ทธํ B์์ A๋ฅผ ์ ์ธํ ๋ถ๋ถ๋ง ์ญ์ ํ๋ฉด๋๋ค. ์ ํํ ๋ฐ์ง๋ฉด ์๋ ๊ทธ๋ฆผ ๊ฐ์ ๋ชจ์์ด ๋๊ฒ ์ง๋ง, ๊ฐ๋ฐ ๊ณผ์ ์์ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ ์ ์๋ค. (๋ด ๊ฒฝ์ฐ ๊ฐ๋ฐ ํ ์คํธ๋ aws s3์์ ํ๋ค๊ฐ, ๋์คํฌ ์คํ ๋ฆฌ์ง๋ก ๋์ด์จ ์ผ์ด์ค๋ผ...)
์, ์๋ฌดํผ ํ๋ฒ ์ฐจ์งํฉ์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
const {Artwork} = require('./models');
const sequelize = require('sequelize');
const fs = require('fs');
const Op = require('sequelize').Op;
// usingArtworkFiles ํ์ฌ ์ฌ์ฉ์ค์ธ ๋ชจ๋ ์ํ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
const getUsingArtworkFiles = async() => {
try {
let resources = await Artwork.findAll({
attributes: ['ARTWORK_RESOURCE'],
where: {
ARTWORK_RESOURCE: {
[Op.not]: null
}
}
})
// sequlize๋ object ํ์์ผ๋ก ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๋ก ๋ค์ ๋ฃ์ด์ค
let result = []
resources.forEach( resource => {
result.push(resource.ARTWORK_RESOURCE)
})
console.log('----> usingArtworkFiles ', result)
return result
} catch (error) {
console.error(error)
return []
}
}
const getDiskArtowkFiles = async() => {
let filelist = fs.readdirSync('uploads/artwork')
console.log('----> diskArtworkFiles', filelist);
return filelist
}
const startCleanUp = async() => {
// diskArtworkFiles ํ์ผ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐ
let usingArtworkFiles = await getUsingArtworkFiles();
let diskArtworkFiles = await getDiskArtowkFiles();
// ์ฐจ์งํฉ ๊ตฌํ๊ธฐ ์ฐจ์งํฉ์ ๋ ํ์ผ disk์์ ์ญ์ ํ๊ธฐ
let difference = diskArtworkFiles.filter(filename => !usingArtworkFiles.includes(filename));
difference.forEach(filename => {
fs.unlink(`uploads/artwork/${filename}`, (err) => {
if (err === undefined || err == null) {
console.log(`delete >>>>> uploads/artwork/${filename}`);
} else {
console.log(err);
}
})
})
}
startCleanUp()
// getDiskArtowkFiles()
// getUsingArtworkFiles()
* ์ฃผ์
๊ผญ ๋น๋๊ธฐ๋ก ๋์คํฌ์ ์๋ ํ์ผ ๋ฆฌ์คํธ๋ฅผ ์ฝ์ด์์ผํ๋ค. ์๊ทธ๋ฌ๋ฉด ํ์ผ ๋ฆฌ์คํธ๋ฅผ ์ฝ์ด์ค๋๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋น ๋ฐฐ์ด์ด ๋ฆฌํด๋๋ค. fs.readdirSync('uploads/artwork') ๊ผญ ๋น๋๊ธฐ๋ก ์ฝ์ด์ค๊ธฐ!
๊ฐ๋ฐ์ฉ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
์๋ฌดํผ ์ฐจ์งํฉ์ ๊ตฌํด ์ฌ์ฉํ์ง ์๋ ํ์ผ๋ค์ ์ง์ฐ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์ ๋ฐ๋ก ์๋ฒ ์ค์ผ์ค๋ง ์ฝ๋๋ก ๋์ด๊ฐ ์ ์์ง๋ง, ๊ฐ๋ฐ์ฉ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ๋ณด์. ์ ํด์ง ์๊ฐ์ ํ์ผ์ด ์ ๋ฆฌ๊ฐ ๋์๋์ง, ์ด๋ค ํ์ผ๋ค์ด ์ง์์ก๋์ง ํน์๋ ์ฒ๋ฆฌ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํด ์๋ฒ๊ฐ ์ฃฝ์ ์ ์์ผ๋ ๋ก๊ทธ๋ฅผ ๊ผญ ๊ผญ ๋จ๊ฒจ๋ณด์.
์๋ฒ ์ค์ผ์ค๋ง ์ฝ๋ ์์ฑ (node-schedule)
const schedule = require('node-schedule');
// ์ด ๋ถ ์ ์ผ ์ ์ฃผ
// 42์ด๊ฐ ๋ ๋๋ง๋ค ์คํ
const job = schedule.scheduleJob('42 * * * * *', function(){
console.log('42์ด๊ฐ ๋์์ต๋๋ค.');
});
42์ด๊ฐ ๋ ๋๋ง๋ค ์ฝ์์ ์ฐ๋๋ก ํด์ฃผ์๋ค. 42์ด๋๋ง๋ค ์ ์ฐํ๋๊ฒ ํ์ธ ์๋ฃ!
์ด๋ฅผ ํ์ฉํ์ฌ ์ ์ ๋ง๋ค์ด๋ cleanUpResource.js๋ฅผ ์คํ์ํค๋ฉด ๋~~
์๊ฐ๋ณด๋ค ์ค์ผ์ค๋ง์ด ์ด๋ ต์ง ์์์ ๋๋๋ค. ์๋ฒ ์ด์ฉ์ด๋ผ๊ณ ํ๋ฉด ๋ ์ด๋ ต๊ฒ๋ง ๋๊ปด์ก๋๋ฐ, ์ญ์ ํ๋ฉด ๋๋ค!
์ง๊ธ ์ํ๋ node ์๋ฒ๊ฐ ๋์๊ฐ์ผ๋ง ์ค์ผ์ค๋ง ์ฝ๋๊ฐ ๋์๊ฐ๋ค.
๋ค์์ ํ๋ฒ os์์ ๋์๊ฐ๋ cron์ ๋์ ํด๋ด์ผ์ง!
๐ ์ฐธ๊ณ ๋ธ๋ก๊ทธ ๊ธ
- ๋ก๊ทธ ํ์ผ ๋จ๊ธฐ๊ธฐ
- ์๋ฒ ์ค์ผ์ค๋ง ์ฝ๋ ์์ฑ
https://medium.com/nodejs-server/node-schedule-pm2-8f7831ed231e
https://coding8.tistory.com/34
'๐์ฝ๋ฉ ๊ณต๋ถ > ์ฝ๋ฉ๊ณต๋ถ ์ด๋ชจ์ ๋ชจ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CS ) ssh, sh, bash ๋ ๋ญ๊น? (0) | 2021.09.25 |
---|---|
CS) ์๋ฒ OS ์์๋ณด๊ธฐ, CentOS, Linux, Ubuntu, Window (0) | 2021.09.05 |
CDN ) CDN ๊ฒฐ๊ณผ ๋น๊ตํ๊ธฐ, ๊ทผ๋ฐ ๊ฑฐ๊ธฐ์ Request header ๋ถ์์ ๊ณ๋ค์ธ... (0) | 2021.09.04 |
Node.js ) ํ์ด์ง ์ฒ๋ฆฌ 1 - offset, limit ๋ฐฉ์ (0) | 2021.07.24 |
React Router ) Link ๊ธฐ๋ฅ์ ํจ์๋ก ๋นผ๊ธฐ, history์ location (0) | 2021.07.11 |