[Toy Project] 서버 가동 설정 수정
납품했던 웹 사이트에 대해 몇 가지 수정사항이 발생하였다. 이를 처리하는 과정에서 진행중인 토이프로젝트의 설정도 수정해야 할 부분이 발견되었다.
#01. HTTPS 가동 환경 구성
HTTPS를 웹 호스팅 환경에서 항상 사용할 수 있는 것은 아니다. 가비아 웹 호스팅을 사용하면 HTTP 포트가 8080에 포워드된다. HTTPS를 위한 포트포워딩을 문의하니 HTTP를 죽이고 8080으로 포워딩 하라고 하더라. 근데 실제로 해 보니 연결이 잘 안되었다. 마침 DNS 설정 이슈도 있고 해서 HTTPS 가동은 안하기로 했다.
하지만 기껏 만들어 놓은 코드를 버리기에는 아까워서 HTTPS 가동 여부를 설정파일을 통해 제어할 수 있게 했다.
1. 환경설정 파일 수정
.env.development
, .env.production
아래와 같이 HTTPS에 대한 포트 번호를 설정했다.
# 작동 포트 번호
HTTP_PORT = 80
HTTPS_PORT = 443
# HTTPS 서버 사용 여부
USE_HTTPS = true
2. Express 가동 부분 수정
/backend/app.js
서버 가동 부분을 아래와 같이 수정하였다.
// HTTP 서버 구동
app.listen(process.env.HTTP_PORT, function () {
console.log(`HTTP server listening on port ${process.env.HTTP_PORT}`);
});
// HTTPS 서버 구동
if (process.env.USE_HTTPS === "true") {
const keyFile = fs.readFileSync(process.env.SSL_KEY_PATH);
const certFile = fs.readFileSync(process.env.SSL_CERT_PATH);
const options = {
key: keyFile,
cert: certFile
};
const httpsServer = https.createServer(options, app);
httpsServer.listen(process.env.HTTPS_PORT, function () {
console.log(`HTTPS server listening on port ${process.env.HTTPS_PORT}`);
});
}
#02. 예외처리 클래스 정의
/backend/helpers
디렉토리 안에 ExceptionHelper.js
클래스를 다음과 같이 정의하였다.
/**
* @FileName : ExceptionHelper.js
* @Description : 예외처리 클래스
* @Author : Lee Kwang-Ho (leekh4232@gmail.com)
*/
class Exception extends Error {
#code;
#name;
constructor(code, message) {
super(message);
this.#name = this.constructor.name;
this.#code = code;
}
get code() {
return this.#code;
}
get name() {
return this.#name;
}
}
class BadRequestException extends Exception {
constructor(msg = "잘못된 요청 입니다.") {
super(400, msg);
}
}
class UnauthorizedException extends Exception {
constructor(msg = "접근 권한이 없습니다.") {
super(401, msg);
}
}
class ForbiddenException extends Exception {
constructor(msg = "잘못된 접근 입니다.") {
super(403, msg);
}
}
class PageNotFoundException extends Exception {
constructor(msg = "페이지를 찾을 수 없습니다.") {
super(404, msg);
}
}
class RuntimeException extends Exception {
constructor(msg = "요청을 처리하는데 실패했습니다.") {
super(500, msg);
}
}
class FileUploadException extends Exception {
constructor(msg = "파일을 업로드 하는데 실패했습니다.") {
super(500, msg);
}
}
module.exports = { BadRequestException, UnauthorizedException, ForbiddenException, PageNotFoundException, RuntimeException, FileUploadException };
#03. 업로드 설정 수정
업로드 부분에서 최대 파일 용량 제한 부분에 문제가 발견되어서 아래와 같이 수정하였다.
app.use(
fileUpload({
limits: { fileSize: eval(process.env.UPLOAD_FILE_SIZE_LIMIT) },
useTempFiles: true,
tempFileDir: process.env.UPLOAD_TEMP_DIR,
createParentPath: true,
debug: process.env.UPLOAD_DEBUG,
abortOnLimit: true,
uploadTimeout: 0,
limitHandler: function (req, res, next) {
const err = new FileUploadException(`파일 크기가 너무 큽니다. (최대 ${eval(process.env.UPLOAD_FILE_SIZE_LIMIT)}MB)`);
next(err);
}
})
);