그럼에도 불구하고

👨‍💻

[Node.js] 모듈 시스템 사용 본문

Node.js/Node.js basics

[Node.js] 모듈 시스템 사용

zenghyun 2023. 1. 31. 20:25

모듈 시스템을 사용하는 법에 대해 알아보자

 

 

기존 소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const http = require('http');
const fs = require('fs');
 
const server = http.createServer((req, res) => {
  const url = req.url;
  const method = req.method;
  if (url === '/') {
    res.write('<html>');
    res.write('<head><title>Enter Message</title><head>');
    res.write(
      '<body><form action="/message" method="POST"><input type="text" name="message"><button type="submit">Send</button></form></body>'
    );
    res.write('</html>');
    return res.end();
  }
  if (url === '/message' && method === 'POST') {
    const body = [];
    req.on('data', chunk => {
      console.log(chunk);
      body.push(chunk);
    });
    return req.on('end', () => {
      const parsedBody = Buffer.concat(body).toString();
      const message = parsedBody.split('=')[1];
      fs.writeFile('message.txt', message, err => {
        res.statusCode = 302;
        res.setHeader('Location''/');
        return res.end();
      });
    });
  }
  res.setHeader('Content-Type''text/html');
  res.write('<html>');
  res.write('<head><title>My First Page</title><head>');
  res.write('<body><h1>Hello from my Node.js Server!</h1></body>');
  res.write('</html>');
  res.end();
});
 
server.listen(3000);
 
cs

 

저번에 작성한 코드를 보면 하나의 파일만 해도 많은 코드가 존재한다. 

보통 이렇게 여러 파일을 작업하게 되는데 url 확인 등의 작업을 하는 라우팅 로직을 포함한 새 파일을 나누어 코드를 분산시킬 수 있다. 

 

 

[ routes.js ]

routes.js라는 파일을 만들어 uf문과 기본 응답 코드를 분리해서 넣어주자 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const fs = require('fs');
 
const requestHandler = (req,res) => {
  const url = req.url;
  const method = req.method;
  if (url === '/') {
    res.write('<html>');
    res.write('<head><title>Enter Message</title><head>');
    res.write(
      '<body><form action="/message" method="POST"><input type="text" name="message"><button type="submit">Send</button></form></body>'
    );
    res.write('</html>');
    return res.end();
  }
  if (url === '/message' && method === 'POST') {
    const body = [];
    req.on('data', chunk => {
      console.log(chunk);
      body.push(chunk);
    });
    return req.on('end', () => {
      const parsedBody = Buffer.concat(body).toString();
      const message = parsedBody.split('=')[1];
      fs.writeFile('message.txt', message, err => {
        res.statusCode = 302;
        res.setHeader('Location''/');
        return res.end();
      });
    });
  }
  res.setHeader('Content-Type''text/html');
  res.write('<html>');
  res.write('<head><title>My First Page</title><head>');
  res.write('<body><h1>Hello from my Node.js Server!</h1></body>');
  res.write('</html>');
  res.end();
};
 
// 앞의 module는 생략해도 됨
// module.exports = requestHandler;
 
// module.exports = {
//   handler : requestHandler,
//   someText: 'Some hard coded text'
// };
 
module.exports.handler = requestHandler;
module.exports.someText = 'Some hard coded text';
cs

 

 

const fs = require('fs');을 먼저 추가해주고 기존 소스파일에서는 지워준다. 

기존 소스파일과 routes.js를 연결하기 위해 requestHandler 함수를 생성해 req와 res를 인수로 갖게 만들어주고 아래에 있는 기존 소스파일의 http.createServer 함수의 모든 코드를 함수로 옮겨준다. 

 

이떄 코드가 요청 및 응답 객체를 사용하기 때문에 인수가 같은 이름을 사용하도록 만들면 로컬 변수로 사용이 가능하게 되는 것이다. 

 

그리고 url과 method도 사용하기 위해 req.url과 req.method의 데이터를 다시 상수로 추가해 준다.

 

routes.js로 분리한 핸들러를 기존 소스파일과 연결하는 작업을 해야 하는데, 불러올 때는 require 구문을 사용했지만, 내보낼 때는 exports를 사용한다.

 

exports 하는 방법에는 크게 2가지가 있다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// routes.js 
 
// 앞의 module는 생략해도 됨
module.exports = requestHandler;
 
 
// 기존 소스 코드 
 
 
const http = require('http'); // require 파일을 불러오는 방법 
 
const routes = require('./routes'); // routes.js와 연결
 
const server = http.createServer(routes); // 서버를 생성할 때 꼭 필요한 메서드 
 
server.listen(3000);
 
 
cs

 

첫 번째 방법은 routes.js 가장 아래에 module.exports를 추가하는 것이다. 

Node.js 전역에 의해 전역으로 노출된 키워드 혹은 객체로 내보내기 속성이 있어서 requestHandler 등의 값을 지정하면 다음과 같은 함수를 가진 requestHandler 상수가 module.exports에 저장된다. 

 

노출된 전역 객체이기 때문에 Node.js가 처리할 수 있으며, require로 routes.js 파일을 불러오면 Node.js가 module.exports를 찾는다.

 

기존의 소스 코드에 원하는 대로 상수 이름 routes를 입력하고 require을 통해 불러오면 된다. 

이는 글로벌 모듈이 아니기 때문에 routes만 입력하지 않고 ./로 로컬 경로를 추가하는데 대신 끝에. js는 생략해도 된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// routes.js 
 
// 앞의 module는 생략해도 됨
module.exports = { 
    handler : requestHandler,
    someText : 'Some hard coded test'
};
 
 
// 기존 소스 코드 
 
 
const http = require('http'); // require 파일을 불러오는 방법 
 
const routes = require('./routes'); // routes.js와 연결
 
const server = http.createServer(routes.handler); // 서버를 생성할 때 꼭 필요한 메서드 
 
server.listen(3000);
 
 
cs

 

두 번째 방법은 여러 내용을 한꺼번에 내보내기 하는 경우 module.exports를 객체로 handler 키워드를 입력하면 requestHandler 함수와 같고, someText를 입력하고 "Some hard coded text"라고 입력하면 두 가지를 내보낼 때 둘을 그룹화하거나 분리하면서도 하나의 내보내기만 관리할 수 있게 된다. 그러면 기존 소스코드에서 routes는 함수가 아닌 객체가 된다.

 

여기서 handler 속성에 접근해야 하는데 이 속성은 사용하고자 하는 함수를 참조하고 있다.

또는 console.log로 routes.someText를 출력할 수도 있다.

 

이렇게 하면 하나의 파일에서 여러 내보내기를 할 수 있고 기능은 예전과 같다.

Comments