-
엔트리포인트 & 서버 부팅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함
- 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 안에서 매핑도 시켜주자.
- tsx - - env-file=.env.local이 환경변수를 .env.local에서 로딩
- env.ts 와 index.ts가 구조화
- 코드에서 config를 사용해 환경변수 할당.
- .env.local에 변수에 값을 할당하고, (APP_NAME=my-app, APP_VERSION=1)
- server.js가 엔트리 포인트, 서버 실행 스크립트 역할을 하는 것을 기억하자.
'Node.js 백엔드' 카테고리의 다른 글
MongoDB Atlas와 도커 컨테이너 연결하기 (feat. mongod, mongosh) (0) 2025.12.01 Middleware 공부해보기 - 1편. (0) 2025.11.17