들어가며
express 에서 서버 시작하는 방법 2가지와
Jest 테스트 코드에선 직접 서버를 실행하고 닫아야 하나? 에 대한 포스팅을 하고자 한다...!
포스팅을 하게 된 이유에는 WebSocket 서버와 express 서버를 합치는 와중에 서버를 실행하는 방법이 방법 1 -> 방법 2로 바뀌었기 때문이다.
서버를 실행하는 방법이 여러개가 있다는 사실 + 그 중 서버끼리 합치기 위해서 어떤 방법을 써야 되는지에 대한 기록을 남기고 널리 전파하기 위해 이 포스팅을 작성하게 되었다...!
또한 어제 친구랑 한 Jest 테스트 코드에 대한 코드 리뷰가 있었는데, 그때 테스트 코드 서버를 직접 끄고 켜야 되냐에 대한 논란이 있었다. 왜냐면 나는 직접 끄고 켰기 때문이다. 하지만 친구는 그냥 했는데 돼었다는 말을 듣고 이 테스트 코드에 대한 서버 실행 방법도 같이 포스팅할 예정이다...! (답을 미리 스포하자면, Jest 는 supertest를 import 하고 각 테스트마다 request(app)을 하였다면, 직접할 필요가 없다)
방법 1. app.listen(port)
import express from "express";
const app = express();
app.listen(3000);
express의 객체로 만들어진 app 을 listen 하여, 3000번 포트로 서버를 실행해주었다.
이게 흔히 쓰이는 방식이고, 여기에서 서버가 실행되었다는 것을 표시하기 위해서는 뒤에 콜백함수로 console.log("3000번 서버가 켜졌어요!")를 넣어주면된다.
방법 2. http.serverCreate(app).listen(port)
import http from "http";
import express from "express";
cosnt app = express();
const server = http.createServer(app);
server.listen(3000)
기본적으로 Node.js의 http 내장 메서드를 활용하면 직접적으로 server에 접근할 수 있다.
http.createServer() 메소드를 통해, 직접 다룰 수 있는 server를 만들고, 이 server를 server.listen(3000) 해서 3000번 서버를 켤 수가 있게 된다.
이 포스팅을 하게 된 이유는 방법 2 때문인데, 왜 편리한 방법 1을 놔두고, 직접적으로 server를 따로 빼서 다루는 이유가 궁금했었다. 그 이유는 바로바로...! webSocket 서버와 express 서버를 합치는 과정에서 이 방법 2가 필요함을 알게 되었다.
아래는 webSocket 서버와 express 서버를 같이 합치는 코드이다.
아래와 같이 server를 직접 접근가능하게 함으로써, webSocket의 requestListener에 server를 넣어줄 수 있었다.
다시 정리하면,
A) http.createServer() 의 requestListener 에 express 서버를 넣어주고
B) WebSocket.Server() 의 requestListner 자리에 port와 express를 매핑해준, server를 넣어줌으로써,
결론) http 프로토콜과 websocket 프로토콜이 하나의 포트(3000)를 공유할 수 있게 되었다...!
import express from "express";
import http from "http";
import WebSocket from "ws";
const server = http.createServer(app); // A) express와 port 매핑해서 server 만듦
const wss = new WebSocket.Server({ server }; // B) server(express+port)와 WebSocket 매핑
server.listen(3000, handleListen);
더 나아가) Jest 에서는 서버 실행이 필요할까?
처음에 작성했던 내 Jest 테스트 코드에는 다음과 같이 서버 시작과 종료에 대한 코드가 있어,
서버를 실행하고 종료하는 코드를 넣어놨었다. 아래와 같다
// Jest에서는 이 코드 다 필요없다...!!!!
let server;
// 서버 시작
beforeAll(() => {
server = app.startServer(app.PORT);
});
// 서버 종료
afterAll((done) => {
app.closeServer(server, done);
});
하지만 서버 실행에 대한 공부를 하던 도중,
Jest 에는 내부적으로 express 애플리케이션을 생성하고 그것을 서버로 사용하여 요청을 처리함을 알게 되었다.
즉, 'jest' 테스트 코드에서, 'supertest' 를 사용하여 'app' 객체에 대한 HTTP 요청을 실행하는 것만으로 충분하다는 것이다.
각각의 테스트 함수 내에서 request(app) 호출을 통해 직접 요청을 보내고 응답을 검증할 수 있고, 이 과정에서 서버를 별도로 구동하거나 종료할 필요가 없다.-----> 얼마나 편리한가...! Jest 만세ㅔㅔㅔ

이러한 방식 덕분에 Node.js 및 Express.js 개발자들은 API 엔드포인트를 효율적으로 테스트 할 수 있으며, 테스트의 신뢰성과 유지 관리성을 향상시킬 수 있다는 GPT의 답변도 들었다...! 이런 편리함이 있었구만!
이번 포스팅을 통해서도 많은걸 알아갑니다!!!
'TIL' 카테고리의 다른 글
| 배열 만들기 (0) | 2024.05.03 |
|---|---|
| 왜 Express 프레임워크를 쓰셨나요?(Why) (0) | 2024.04.16 |
| dependencies를 devdependencies로 이동시키기 (0) | 2024.04.12 |
| 프로젝트 별로 다른 node 버전 (node 버전 낮추기) (0) | 2024.04.12 |