[Toy Project] 서버 가동 설정 수정

[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);
        }
    })
);
호쌤(이광호)'s Picture

About 호쌤(이광호)

메가스터디IT아카데미에서 Java, Spring, Python, Frontend 등을 강의하는 IT 전문 강사이자 프리렌서 개발자 입니다.
https://www.youtube.com/@hossam-codingclub

Seoul, Korea http://www.hossam.kr