ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엔트리포인트 & 서버 부팅
    Node.js 백엔드 2025. 11. 11. 21:35

    목차

    • 주요 파일 (Server.js, App.js, src/index.js)
    • 주요 패턴 (createServer, app.listen, import express from ‘express’, const app=express())
    • 주요 설정 (process.env.NODE_ENV)

    Server.js

    • Node.js 서버 애플리케이션 진입점 파일. 서버가 실행될 때 가장 먼저 실행되는 스크립트.
    • 기능
      • 앱의 주요 설정
      • 라우팅
      • 초기화 작업

    App.js

    • 서버를 설정하는 메인 파일 역할
    • 기능
      • 라우터
      • 미들웨어
      • 포트 설정

    src/index.js

    • 특정 디렉토리의 “대표 모듈”
    • 폴더/패키지의 기본 진입점
    • Q. Server.js와 App.js의 차이점은?
      • 미들웨어, 라우터, 에러 핸들러 등 웹 앱의 로직을 붙이는 곳
      • 여기서는 app.listen( ) 을 안하고, 그냥 app 객체만 export함
      Server.js는 실제 서버 실행 담당 (entry point)
      • app.js에서 만든 app을 열고
        • 포트를 열고(app.listen 또는 http.createServer)
        • 서버를 실제로 구동하는 파일
      • PM2, nodemon, Docker 에서 실행 진입점으로 지정되는 파일
    • A. app.js는 Express 앱을 만들고 설정하는 파일
    • Q. 둘을 분리하는 이유는 ?(반드시 app.js와 server.js를 분리해야 하는 것은 아님. 하나의 파일에 전부 적어도 문제 없음.)
    • A. app.js는 테스트하기 좋고 재사용하기 좋음. server.js는 실행 관련 코드만 있어서 깔끔함.

    패턴

    • CreateServer
    • app.listen
    • import express form ‘express’
    • const app = express( )

    CreateServer : http.Server의 인스턴스를 반환함.

    const http = require('node:http');
    
    const server = http.createServer((req,res) => {
    	res.writeHead(200, { 'Content-Type': 'application/json'});
    	res.end(JSON.stringify({
    		data: 'Hello WOrld!',
    	}));
    });
    
    server.listen(8000);
    
    const http = require('node:http');
    
    const server = http.createServer();
    
    server.on('request', (request, res) => {
    	res.writeHead(200, { 'Content-Type': 'application/json'});
    	res.end(JSON.stringify({
    		data: 'Hello World!',
    	}));
    });
    
    server.listen(8000);
    

    app.listen : http.Server.listen( ) 을 express 스럽게 감싼(wrapping) 함수

    const express = require('express')
    const app = express()
    const port = 3000
    
    app.get('/', (req, res) => {
    	res.send('Hello World!')
    })
    
    app.listen(port, () => {
      console.log('Example app listening on port ${port}')
    })
    

     

    아래는 GPT 왈)

    http.createServer(app).listen(PORT);
    app.listen(PORT);
    
    둘의 동작은 같다.
    

    import express from ‘express’ : express 모듈을 불러와 express 변수에 담아 쓰겠다.

    • CommonJS 방식 (옛날 방식) : require
    const express = require('express');
    
    • ES Module(ESM) (요즘 방식)
    import express form 'express';
    const app = express();
    

     

    💡

    node에서 import 문법을 사용하기 위해서는 “type”: “module”을 package.json에 넣거나 파일 확장자를 mjs로 사용해야 한다.

     

    const app = express() : Express 앱 인스턴스 할당

    • HTTP 요청을 처리하는 함수 (미들웨어 스택이 붙은 함수) + 여러 메서드들이 붙어 있는 객체
    • 함수
      • http.createServer(app)에 넘기면 콜백으로 동작
    • 객체
      • app.get(), app.post(), app.use() 등의 메서드를 가지고 있음.

    설정

    process.env.NODE_ENV : node 프로세스가 돌고 있는 환경 이름 ( production, development 등)

    • 회사에서는 process.env.APP_ENV를 바탕으로 설정함.

    핵심 질문

    서버가 어디서 시작되고, Express App이 어디서 만들어지는가?

    서버의 로직은 app.js에 쓰여 있고, 서버의 실행은 server.js에서 실행된다.

    app.js에서 const app = express(); 코드를 실행했을 때 생성된다.

    해당 app을 가지고 서버를 구동하는 것은 server.js에서 한다.

     

    환경변수는 어떻게 주입되는가?

    process.env에 있는 환경변수는 Node가 만들어내는 것이 아님.

    OS가 미리 넣어준 값을 Node Process가 그대로 받아쓰는 것임. (터미널/쉘에서 입력 → node server.js 프로세스를 띄울 때 복사해서 넘겨줌)

    package.json의 scripts로 주입할 수 있음.

    이 경우에, npm이 NODE_ENV를 먼저 세팅하고, node server.js를 실행함.

    여전히 Node는 부모 프로세스가 환경변수 세팅해서 넘겨줌.

    {
    	"scripts": {
    		"dev": "NODE_ENV=develoment node server.js", 
    		"start": "NODE_ENV=production node server.js"
    	}
    }
    

     

    dotenv 라이브러리는 무슨 역할을 할까?

    .env 파일은 자동 주입이 아님.

    dotenv라이브러리를 사용하면,

    OS/shell이 넘겨준 기본 process.env에 .env에서 읽어온 내용을 머지해서 환경변수 설정을 함.


    mini 과제 : 서버 부팅 로그에 앱 이름/ 버전 출력해보기

    • 솔루션package.json을 보면, tsx가 환경변수를 넣어주는 것을 확인할 수 있다. ( .env.local을 읽어서 ) infrastructure/config에서
      • env.ts에서 env 객체 안에 추가 정보를 넣어주자.
      • index.ts에서 config 안에서 매핑도 시켜주자.
      dev에서의 동작 순서는
      1. tsx - - env-file=.env.local이 환경변수를 .env.local에서 로딩
      2. env.ts 와 index.ts가 구조화
      3. 코드에서 config를 사용해 환경변수 할당.
    • .env.local에 변수에 값을 할당하고, (APP_NAME=my-app, APP_VERSION=1)
    • server.js가 엔트리 포인트, 서버 실행 스크립트 역할을 하는 것을 기억하자.
Designed by Tistory.