본문 바로가기

프로그래밍/Node.js

[Do it Node.js 프로그래밍] 4일차

1. 공부한 범위


[05] 웹 서버 만들기 (05-2 익스프레스로 웹 서버를 만드는 부분까지)


2. 공부한 내용 요약


[05] 웹 서버 만들기

05-1 간단한 웹 서버 만들기

- 노드가 기본적으로 제공하는 http 모듈을 이용하면 서버 객체를 만들 수 있다.

- listen() 메소드를 통해 지정된 포트로 서버가 시작된다. 서버를 종료하고 싶으면 콘솔창 왼편에 있는 네모난 이미지를 가진 버튼을 클릭하면 된다. (정지 버튼)

- 서버 객체에서 사용할 수 있는 대표적인 메소드

<font face="Arial">

listen(port, [hostname], [backlog], [callback]) : 서버를 실행시킨 후 대기한다.

</font>

<font face="Arial">

close([callback]) : 서버를 종료한다.

</font>

- 보통은 listen메소드를 호출할 때 ip가 자동으로 지정되지만, pc에 이더넷 카드가 여러개 있을 경우에는 여러 ip들 중 한 개를 특정해서 서버를 실행해야 한다.

- 웹 브라우저가 생성된 웹 서버에 접속 후 데이터를 요청하면 그때마다 이벤트가 발생하기 때문에 상황에 맞춰 콜백 함수를 각각 등록한다.

- 이벤트의 종류

connection : 클라이언트가 접속해 연결이 만들어지면 발생하는 이벤트

request : 클라이언트가 요청할 때 발생하는 이벤트

close : 서버가 종료할 때 발생하는 이벤트

- 이벤트는 더 많으나 이 중 위의 세가지 이벤트가 가장 자주 쓰인다.

* 서버 실행시 EADDRINUSE 오류가 발생하는 경우

이미 같은 포트에서 서버가 실행 중일 때 주로 발생하는 오류이기 때문에 이전에 실행했던 서버를 종료하면 해결된다.

- on() 메소드는 이벤트를 처리할 때 사용하는 가장 기본적인 메소드이다.

- response 객체를 이용해 응답을 보낼 때 사용하는 주 메소드

writeHead(statusCode[, statusMessage][, headers]) : 응답으로 보낼 헤더를 만든다.

write(chunk[, encoding][, callback]) : 응답으로 보낼 본문(body)데이터를 만든다. 이 메소드는 여러번 호출이 가능하다.

end([data][, encoding][, callback]) : 클라이언트로 응답을 전송한다. 파라미터에 데이터가 들어있다면 해당 데이터도 포함해 전송한다. 이 메소드는 최소한 한 번은 들어있어야 응답이 정상적으로 전송되며 callback함수가 등록되어 있다면 응답이 전송된 후 함수가 호출된다.

- 서버를 호출하는 createServer 메소드 안에 콜백 함수를 만듦으로서 request이벤트를 따로 처리하는 코드 없이 더 편하게 request처리가 가능해진다.

- fs 모듈에서의 Content-Type을 활용하면 이미지 파일 등 여러가지를 클라이언트에 전달 할 수 있게 된다.

- Content-Type에 설정할 수 있는 대표적인 MIME Type

text/plain : 일반 텍스트 문서

text/html : HTML 문서

text/css : CSS 문서

text/xml : XML 문서

image/jpeg, image/png : JPEG와 PNG 파일

video/mpeg, audio/mp3 : 각각 비디오와 오디오 파일을 의미한다.

application/zip : ZIP 압축 파일

- 클라이언트 요청에 따라 다른 웹 사이트를 접속해 데이터를 가져오려면 get방식과 post방식을 사용할 수 있다.

- 이외에도 PUT, DELETE 등이 있고 보안 등의 이슈나 요청 정보를 넣어 보내야 하는 경우에는 POST방식이 많이 쓰인다.

- 실무에서는 http보다는 express 모듈을 주로 사용하는 편이다.

 

05-2 익스프레스로  웹 서버 만들기

- http 모듈을 이용해 웹 서버를 구성할 때는 많은 부분을 직접 작성해야 한다. 이 문제를 해결하기 위해 만들어진 것이 Express 모듈이다.

- 익스프레스에서 제공하는 미들웨어 라우터를 사용한다면 기능들의 구현이 더욱 쉬워진다.

- 익스프레스 서버 객체가 가지고 있는 주요 메소드

set(name, value) : 서버 설정을 위한 속성을 지정한다. set() 메소드로 지정한 속성은 get() 메소드로 확인이 가능하다.

get(name) : 서버 설정을 위해 지정한 속성을 꺼내 확인한다.

use([path,] function[, function...]) : 미들웨어 함수를 사용한다.

get([path,] function) : 특정한 경로로 요청된 정보를 처리한다.

- set() 메소드를 통해 서버 설정을 할 때 미리 정해진 주요 속성의 이름

env : 서버 모드를 설정한다.

views : 뷰들이 들어있는 폴더나 해당 폴더 배열을 설정한다.

view engine : 디폴트로 사용할 뷰 엔진을 설정한다.

- use() 메소드를 사용하면 미들웨어를 설정할 수 있다.

- 미들웨어 : 익스프레스가 웹 요청과 응답에 대해 정보를 사용해 필요한 처리를 징행할 수 있도록 독립된 함수로 분리한 각각을 의미한다.

- 라우터 : 클라이언트의 요청 경로를 보고 해당 요청을 처리할 수 있는 곳으로 기능을 전달해주는 역할을 한다. 이를 흔히 라우팅으로 부르며 클라이언트의 요청 경로에 따라 각각을 담당하는 함수로 분리시키는 것이다.

- 익스프레스가 클라이언트의 요청을 받아오는 과정

 

- 여러 개의 미들웨어 함수를 사용하고자 한다면 직전 미들웨어의 마지막에는 next() 메소드를 꼭 사용해 서로간 이어져있다는 사실을 밝혀야 한다.

 

- 미들웨어간 동작 경로

 

- 익스프레스에서의 요청과 응답 객체는 기본적으로 http 객체들과 같으며. 거기에 몇 가지 더 추가로 메소드를 사용할 수 있다.

send([body]) : 클라이언트에 응답 데이터를 보낸다. 전달 가능한 데이터는 HTML 문자열, Buffer 객체, JSON객체와 배열이다.

status(code) : HTTP 상태 코드를 반환한다. 이 코드는 end() 또는 send()와 같은 전송 메소드를 추가로 호출해야만 정상적으로 전송이 가능해진다.

sendStatus(statusCode) : HTTP 상태 코드를 반환하며 상태 메시지와 함께 전송된다.

redirect([status,] path) : 웹 페이지 경로를 강제로 이동시킨다.

render(view [, locals][, callback]) : 뷰 엔진을 사용해 문서를 만든 후 전송한다.

- 요즘은 웹 문서를 새로 받아오는 방식보다 JSON 데이터만 받아와 게시물에서의 해당 데이터만 업데이트하는 방식을 더 많이 사용하고 있는 추세다.

- 익스프레스에서 요청 객체에 추가한 헤더와 파라미터들

query : 클라이언트에서 get방식으로 전송한 요청 파라미터를 확인한다.

ex) request.query.name

body : 클라이언트에서 port방식으로 전송한 요청 파라미터를 확인한다. 이를 위해서는 body-parser와 같은 외장 모듈을 사용해야 정상적으로 동작이 가능하다.

ex) request.body.name

header(name) : 헤더를 확인한다.

- 익스프레스를 사용하게 된다면 기존 웹 서버에서 요청 파라미터를 받아 처리할 때의 여러 줄이 한 줄의 코드로 줄어드는 효과를 볼 수 있으며 더 간편하게 요청 파라미터의 값들을 확인할 수 있게 된다.