목표
- 파일디렉토리 구조 설정
- web 및 p2p server 구축
다음과 같은 4개의 파일을 만들자. 해당 파일의 역할은 다음과 같다.

main.js
httpServer.js
p2pServer.js
block.js
기존에 server를 구축할때 const express = require('express') 와 같은 코드를 사용했다. 이는 CommonJs 모듈을 사용하는 방식으로서 전체 모듈을 다 불러오게 되는데, 불필요한 모듈이 로드되기도 하고 모듈 내에서 어떤 부분을 사용했는지도 확인할 수 없다. 때문에 ES6부터는 import / export 라는 방식으로 모듈을 불러오고 내보낸다. 보다 자세한 내용은 아래 문서를 참고하자.
Node.js에서 ES 모듈(import/export) 사용하기
Node.js 에서 import/export 사용하기
npm으로 필요한 모듈 설치후 server를 실행시키면 다음과 같은 에러를 볼 수 있다. import/export 사용시 나오는 error로 package.json 에 "type": "module"을 다음과 같이 추가해 주면 정상 작동하는것을 확인 할 수 있다.


이후 작성할 main.js에서 불러야 하기때문에 initHttpServer 함수를 export 해주었다. 아래는 코드.
// import의 경우 딱 필요한 애만 불러옴
import express from 'express';
import bodyParser from 'body-parser';
// common js에서 통쨰로 다 불러옴 그래서 위 import가 더 빠름
//const express = require('express')
// 초기화 함수
const initHttpServer = (myHttpPort) => {
const app = express();
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.send('Hello BlockChain!')
})
//매개변수 2개 / 함수포트 , 화살표함수
app.listen(myHttpPort, () => {
console.log('listening httpServer Port : ', myHttpPort);
})
}
// main에서 import를 하려면 export를 먼저하자
export { initHttpServer };
websocket server는 다른 노드와 통신을 위해 사용된다. 현재 작동하지는 않지만 server연결된 것을 확인해보도록 하자. 추가로 import 사용시 { }가 들어간 것과 들어가지 않는것의 차이가 궁금했는데, 받아오는 모듈에서 보내주는 export 방식의 차이라고 한다. 자세한 내용은 아래 링크를 참고하자.
import { WebSocketServer } from 'ws'
// 아래 매개변수 ws가 계속 늘어나기 때문에 저장해줄 자료구조를 만들어보자
// 지금 sockets가 가르키는건 빈 배열이 담긴 주소값. 따라서 안에 data에 push로 추가되고 바뀌는건 크게 상관이 없다
const sockets = [];
const initP2PServer = (p2pPort) => {
const server = new WebSocketServer({port:p2pPort});
// websocke 내에서 일어나는 event는 정의되어 있다. 그 이벤트가 발생했을때 우리는 어떤 함수를 실행(호출)할 것인지 정해주면 된다.
server.on('connection', (ws) => {
initConnection(ws) // 만들어야할 함수
})
console.log('listening P2PServer Port : ', p2pPort);
}
const initConnection = (ws) => {
sockets.push(ws)
}
export { initP2PServer }
위 각각의 파일에서 export해준 함수를 호출했다. 환경변수 설정도 해주도록하자. 실행확인.

import { initHttpServer } from "./httpServer.js";
import { initP2PServer } from "./p2pServer.js";
// 설정되어있으면 환경변수 아니면 3001 / 6001을 쓴다
// int형으로 변환해서 써주자 (env파일에선 다 string형태로 들어간다? 정확하진않지만 암튼 뭘로 들어가든 int로 바꾸자)
const httpPort = parseInt(process.env.HTTP_PORT) || 3001;
const p2pPort = parseInt(process.env.P2P_PORT) || 6001;
initHttpServer(httpPort);
initP2PServer(p2pPort);