ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • http 개체와 서버구축 (bare code)
    개발 2020. 5. 20. 21:13

     

     

    Node.js는 "http" 개체라는 것에서 "http.Server" 개체를 만들어 서버를 구축합니다.

    또한 요청과 응답을 다루는 "request" , "response" 개체에서 송수신을 수행합니다. 이런 개체의 사용법에 대해서 설명하겠습니다.

     

     

     

     

    1. http 개체 로드 하기

     

    const http = require('http');

    Node.js로 서버를 구축할 때 최초로 해야하는 것은 필요한 라이브러리들을 로드하는 것입니다.

    require() 함수를 사용하여 인수에 가져올 개체 이름을 지정하여 해당 개체가 로드되어 반환됩니다.

    위의 코드에서는 http라는 개체를 로드하여 변수 http 에 할당한 것입니다.

     

     

     

     

    2. Server 개체 생성하기

     

    const server = http.createServer((request, response) => {
    
      // 여기서부터 필요한 처리를 작성합니다.
      
    });

    http 의 createServer() 메서드를 호출하여 http.Server 개체를 만듭니다. 

    바로 이 것이 Node.js의 "서버" 가 되는 부분입니다.

     

    첫 번째 인자는 'request' 객체가 전달됩니다. request는 http.IncomingMessage 라는 객체에서 클라이언트의 요청에 대한 기능을 정리하고 있습니다.

    두 번째 인자는 'response' 객체가 전달됩니다. response는 http.serverResponse 라는 객체에서 서버에서 클라이언트로 리턴되는 응답에 대한 기능을 정리하고 있습니다.

     

     

     

     

     

     

     

    3. Server.on 메서드 ( 요청 처리 설정 )

     

    let body = '';
    
    Server.on('data', chunk => {
       body += chunk;
    });

     

    on 메서드는 지정된 이벤트를 통합 처리합니다. 첫 번째 인자에 이벤트 이름을 넣고, 두 번째 인자에 통합 처리할 함수를 넣습니다.

    위 코드에서는 data라는 이벤트를 사용한 것입니다.

    body라는 변수의 초기 값은 빈 문자열이고 data 이벤트가 발생하면서 body에 chunk를 더해서 할당하고 있습니다.

     

    좀더 자세히 설명하자면 client에서 fetch API로 POST 요청을 보내면서 body 부분에 서버로 보낼 데이터를 담아 JSON string으로 전송하고 있습니다.

    이 데이터는 2진수로 변환되고( compile ), 2진수 조각들이 물리적인 랜선을 타고 서버의 라우팅에 순차적으로 도착합니다.

    여기서 2진수 조각 단위가 chunk 이고 chunk들은 순차적으로 Buffer라는 곳에 쌓입니다. 

    이 조각조각으로 쪼개진 chunk를 다시 합치는 과정에서는 항상 string형태여야만 합니다. 위의 예제에서는 body의 초기 값이 빈 문자열로 string 이기 때문에 더해서 할당하기만 하면 되지만 만약 배열이라면 chunk를 push 한 후에 마지막으로 join() 메서드를 사용하여 string으로 만들어주어야 합니다.

     

    이러한 이벤트 말고도 "request", "end" 등등 여러 메서드가 있습니다.

     

     

     

     

     

    4. server.listen 메서드 ( 대기 시작 )

     

    server.listen(5000);

     

    http.Server 개체의 준비가 되면, 'listen' 메서드를 실행합니다. 그러면 서버는 대기 상태가 되고 클라이언트에서 요청이 있으면 그 요청들을 받아서 처리할 수 있습니다. 인수로는 포트 번호를 지정하고 두 번째 인수로는 호스트 이름을 지정할 수 있고 그밖에 세 번째, 네 번째 인수도 지정할 수 있지만 여기에서는 첫 번째 인수에 포트 번호를 넣는다는 것만 알아보겠습니다.

     

     

     

     

     

    5. response.writeHead메서드 ( 헤더 정보 내보내기 )

     

    response.writeHead(200, {'Content-Type': 'text/plain'});

     

    writeHead 는 response 객체의 메서드에서 헤더 정보를 응답에 작성해서 내보내는 것입니다.

    첫 번째 인자는 상태 코드를 지정하고 두 번째 인수는 헤더 정보를 담은 것입니다. 위의 코드에서는  'Content-Type'이라는 헤더 정보에 'text/plain' 의 값을 설정하고 있는 것입니다. 이 것은 응답으로 반송하는 콘텐츠의 종류를 나타내는 헤더 정보입니다.

     

     

     

     

     

    6. response.end메서드 ( 컨텐츠 출력 완료 ( 응답 종료 ) )

     

    response.end();

    내보내기가 완료되면 마지막으로 response의 "end"를 호출하여 콘텐츠 출력을 완료합니다.

    위의 코드에서는 단지 end를 호출만 하고 있지만 인수로 내보낼 내용의 값을 지정할 수 있습니다. 그러면 인수의 값을 쓴 후에 내용을 완료하게 됩니다. end로 인해 응답 처리는 종료되고 요청의 처리가 완료되는 것입니다. 

     

     

     

     

     

     

    정리하기

     

    • 서버는 클라이언트의 요청에 무조건 응답을 해야합니다. 올바른 요청에 대한 response, 혹은 잘못된 요청이 오더라도 status code 등으로 잘못 되었음을 응답해주어야 합니다.

    • response.end() 메서드는 서버를 구성하는 함수의 끝이 아니기 때문에 요청을 처리에 맞게 잘 분기하여 대응해주어야 합니다.reponse.end()메서드를 통해서 함수를 끝내기 위해서는 break, return, throw 등등을 활용할 수 있습니다.

    • 클라이언트와 서버 사이의 통신을 라우팅이라고 하고, JSON string 형태로 이루어져야 합니다. 따라서 요청을 보낼 때에도 JSON.stringify()를 활용해야 하고, server 에서 수신 완료 된 데이터를 가공하거나 추가 작업을 진행할 경우에는 파싱하여 js 객체 형태로 코드를 작성하여야 합니다. 반대로 클라이언트에 응답을 보내야 할 때는 다시 JSON.stringify()를 활용하여 라우팅 해야 합니다.

     

     

Designed by Tistory.