본문 바로가기
프로젝트

24/10/27 - [실습] Node.js 플러스(2 - 3): 중앙 집중식 관리(상수, 환경변수 관리)

by Jini_Lamp 2024. 10. 27.

기본적인 서버 세팅을 끝냈다면, 이번에는 상수랑 환경변수를 중앙 집중식 관리라는 방법을 이용해 관리할 것이다.

그러기 위해, 먼저 중앙 집중식 관리가 무엇인지에 대해 살펴보자.

 

 

중앙 집중식 관리

SW 개발에서 코드나 설정 요소를 분상하지 않고, 한곳에 모아 관리하는 방식을 의미한다.

예를 들어, 특정 상수나 환경 변수가 여러 파일에서 사용된다면, 이를 각 파일에 개별적으로 설정하는 대신 하나의 파일이나 구성 관리 시스템에 모아 둔다.

이렇게 하면 추후 변경이 필요할 때 모든 파일을 수정하는 게 아니라, 중앙에서 한 번에 수정할 수 있어 유지보수 측면에서 효율이 좋고, 일관성도 유지할 수 있다.

또한 어디에서 어떤 설정 값을 사용하는지 쉽게 파악할 수 있으며, 무엇보다 환경 변수를 직접 코드에서 사용하지 않기 때문에 가독성이 좋아지고, 민감한 정보를 보호하고 환경별로 쉽게 설정을 변경할 수 있다.

 

만약 파일이 커지게 되어도 상수와 환경 변수를 논리적으로 분리하면 된다.
예를 들어, DB 관련 설정은 db.js에, 서버 설정은 config.js에 저장하면 된다.

 

이러한 중앙 집중식 관리를 위한 방법으로는 환경 변수는 설정 파일(.env)에서 관리하거나, 클라우드 환경에서는 AWS SSM Parameter Store, Google Secret Manager와 같은 환경 변수 관리 도구를 사용하는 것이 일반적이다.

 

 

환경 변수 세팅

따라서, 먼저 src 폴더 안에 다시 constants 폴더를 만들어, 그 안에 env.js 파일을 생성한 다음 같은 코드를 작성한다.

import dotenv from 'dotenv';

dotenv.config();

export const PORT = process.env.PORT || 3000;
export const HOST = process.env.HOST || 'localhost';
export const CLIENT_VERSION = process.env.CLIENT_VERSION || '1.0.0';

 

이후 최상위 경로에 .env 파일을 생성해, 다음과 같이 필요한 환경변수를 세팅한다.

PORT = 3000
HOST = 127.0.0.1
CLIENT_VERSION = 1.0.0

 

이로써 환경변수 세팅은 끝이 났다.

이후 헤더를 관리할 파일을 constants 폴더 안에 header.js라는 이름으로 생성해 다음과 같이 작성한다. 이는 이전 시간, 패킷 구조를 설정한 것을 바탕으로 작성된 것이다.

export const TOTAL_LENGTH = 4;
export const PACKET_TYPE_LENGTH = 1;

 

 

중앙 집중 관리

모든 상수, 환경 변수들은 config 객체를 통해서 사용할 것이다.

그러기 위해 다시 src 폴더 내에 config 폴더를 생성하고, 해당 폴더 안에 다시 config.js 파일을 생성해 다음과 같이 작성한다.

import { CLIENT_VERSION, HOST, PORT } from '../constants/env.js';
import { PACKET_TYPE_LENGTH, TOTAL_LENGTH } from '../constants/header.js';

export const config = {
    // 서버와 관련된 설정
    servser: {
        port: PORT,
        host: HOST,
    },
    // 클라이언트와 관련된 설정
    client: {
        version: CLIENT_VERSION,
    },
    // 패킷과 관련된 설정
    packet: {
        totalLength: TOTAL_LENGTH,
        typeLength: PACKET_TYPE_LENGTH,
    },
};

 

 

이렇게 상수와 환경 변수들을 config 객체 안에 넣었다면, 이번에는 사용할 차례이다.

다시 server.js 파일로 돌아와 다음과 같이 코드를 변경한다.

import net from 'net';
import initServer from './init/index.js';
import { config } from './config/config.js';

// 중략
initServer()
    .then(() => {
        server.listen(config.server.port, () => {
            console.log(`Echo server listening on port ${config.server.port}`);
            console.log(server.address());
        });
    })
    .catch((error) => {
        console.error(error);
        process.exit(1);
    });

결과

 

그런데 여기서 서버에 HOST까지 다음과 같이 추가하면, 결과 또한 바뀌게 된다.

initServer()
    .then(() => {
        server.listen(config.server.port, config.server.host, () => {
            console.log(`Echo server listening on port ${config.server.port}`);
            console.log(server.address());
        });
    })

결과

 

이렇게 HOST를 지정하면, 서버가 실행되는 위치를 정확하게 지정을 해준다.