Node 강의/주특기 플러스

2-2 중앙집중식 환경변수 관리

kagan-draca 2024. 10. 21. 16:42

1. 중앙 집중식 관리

  • 모든 환경 변수와 상수는 한 곳에서 관리, 다른 파일에서 동일한 값을 사용하여도 일관성을 유지
  • 변경이 필요할 때 한 곳에서만 수정하면 된다.
  • 환경 변수, 상수의 직접 사용이 아니기 때문에 코드가 명확해지는 효과
  • 필요한 경우 개발, 테스트, 프로덕션 환경 별로 다른 설정 사용이 가능하다.

 

src 폴더에 constans폴더를 생성하고 env.js 파일을 만들어줍니다. 그리고, .env 파일을 만들어 줍니다.

 

.env 파일 안에는

PORT = 3000

HOST = 127.0.0.1

CLIENT_VERSION = 1.0.0

위와 같이 서버의 주소(HOST), 포트 번호(PORT), CLIENT_VERSION 이 들어갑니다.

 

env.js 파일은 .env 파일에 있는 정보들을 process로 부터 가져와 사용 합니다.

// 중앙 집중 식 관리

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.js 파일에서 가져오기만 하면 됩니다.

 

그런데, 패킷 해더와 관련된 상수를 추가하기 위해 contants/header.js 파일을 추가해보겠습니다.

header.js에는

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

위와 같이 

 

message의 전체 길이를 나타내는 4 Byte 길이와

패킷 타입을 나타내는 1 Byte 정보를 저장해줍니다.

 

하지만, 위와 같이 작성할 경우 env.js에는 서버와 관련된 상수가 작성 돼 있고,

header.js 파일에는 패킷과 관련된 해더 정보가 작성 돼 있게 돼

중앙 집중화가 이뤄지지 않게 됩니다. 그래서,

 

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 = {
  server: {
    port: PORT,
    host: HOST,
  },
  client: {
    version: CLIENT_VERSION,
  },
  packet: {
    totalLength: TOTAL_LENGTH,
    typeLength: PACKET_TYPE_LENGTH,
  },
};

 

서버와 관련된 상수와 패킷과 관련된 상수를 객체로 만들어 중앙 집중화 해줍니다.

그 결과, 우리는 config.js의 config 객체에서 config.server로 서버의 상수 정보를 가져올 수 있고,

config.client로 클라이언트와 관련된 정보를 가져올 수 있으며,

config.packet으로 패킷과 관련된 정보를 가져올 수 있습니다.

또한, env.js와 header.js 처럼 향후 다른 상수 정보를 기록한 .js 파일이 생기면

import 받아 server, client, packet 처럼 사용할 수 있습니다.

 

이제, config.js에 작성한 server의 정보로 코드를 수정해보겠습니다.

server.js의 기존 아래의 코드에서

const PORT = 5555;
initServer()
  .then(() => {
    server.listen(PORT, () => {
      console.log(`Echo server listening on port ${PORT}`);
      console.log(server.address());
    });
  })
  .catch((error) => {
    console.error(e);
    process.exit(1);
  });

const PORT = 5555를 지우고, 

 

config.server.port, config.server.host를 추가해줍니다.

import { config } from './config/config.js';
initServer()
  .then(() => {
    server.listen(config.server.port, config.server.host, () => {
      console.log(`서버가 ${config.server.host}:${config.server.port}에서 실행 중 입니다.`);
      console.log(server.address());
    });
  })
  .catch((error) => {
    console.error(e);
    process.exit(1);
  });

왼쪽 수정 전 코드, 오른쪽 config(중앙 집중화 상수)를 사용

코드를 수정 후, 서버를 실행시켜보면

 

기존 서버의 주소가 안 나타나고 IPv6로 출력되던 결과가,

서버가 배포될 확실한 주소 127.0.0.1의 주소로 IPv4로

고정 된 것을 확인할 수 있습니다.