3. 온라인 코딩 테스트 Storage 시스템 만들기
스토리지 시스템은 제출된 코드를 저장하고 bind된 컨테이너에 데이터를 제공하는 역할을 한다. 아직 구축되지 않은 DB도 사용할 예정이지만 기본적으로 코드 관리는 File로 관리하고 테스트와 실행을 위한 Code 데이터를 제공하는 역할을 한다. 장기적으로는 본 프로젝트에서 타이핑 기록이나 문제 제공 기능으로 확장 되지 않을까 예상 해본다.
기능과 기본 구조
storage 서버의 핵심은 파일 데이터의 저장이다. 그래서 express.js 와 같은 가볍고 쉽게 서버 작성이 가능한 라이브러리를 사용하였고 작성된 코드 역시 최소화 되어 있다.
/** server.js **/
const express = require('express')
const multer = require('multer')
const fs = require('fs')
const path = require('path')
const app = express()
const port = 3100
const customFileFilter = (req, file, cb) => {
cb(true)
}
// 파일 업로드를 위한 Multer 설정
const upload = multer({
// 파일 저장 방식 설정
storage: multer.diskStorage({
// 파일 저장된 목적지
destination: (req, file, cb) => {
// exam/ 디렉토리에 파일을 저장한다.
// exam/ 폴더는 컨테이너 생성시 'vol-onCoTe-storage' 볼륨으로 마운트 되어 언어 실행 컨테이너와 함께 공유폴더로 사용된다
cb(null, 'exam/')
},
// 파일이 저장될 이름 설정
filename: (req, file, cb) => {
cb(null, `loginId-${Date.now()}${path.extname(file.originalname)}`)
},
}),
// fileFilter: customFileFilter,
limits: { fileSize: 5 * 1024 * 1024 }
})
// curl -F "file=@file" localhost:3000/upload
app.post('/upload', upload.any(), (req, res) => {
res.json({
id: 'loginId',
fileName: req.files[0].filename,
ext: path.extname(req.files[0].filename).replace('.', ''),
})
})
app.get('/', (req, res) => {
res.send('simple express server')
})
app.listen(port, () => {
console.log(`Start server http://localhost:${port}`)
})개선 방향
공유 스토리지 디렉토리를 관리하는 서버 역할로서 개선 방향은 코딩의 목적인 해결해야 하는 문제, 퀴즈 관련 데이터를 저장하고 관리하는 방향으로 계선이 가능하다. 여기서 중요한 부분은 대규모의 파일의 복사, 생성, 삭제 작업은 서버의 작업 효율에 큰 영향을 미쳐 함께 다른 서비스에 제공되는 기능의 정상작동 또는 성능에 이슈가 발생 할 수 있다. 해당 부분에 대한 해결 방법이 필요하다.