-
노드 http 서버 만들기노드 2023. 4. 13. 11:07
서버와 클라이언트
서버와 클라이언트의 관계는 다음과 같다
- 클라이언트가 서버로 요청(request)을 보냄
- 서버는 요청을 처리
- 처리 후 클라이언트로 응답(response)을 보냄
간단히 클라이언트와 서버를 설명을 하자면 사람이 웹 브라우저에 naver.com을 입력했다고 하자.
그러면 웹 브라우저가 클라이언트라고 생각하면 되고 naver 서버 즉, 하나의 naver 컴퓨터라고 생각하면 된다.
클라이언트 : 웹 브라우저
서버 : naver 컴퓨터
사람이 naver.com이라는 요청을 클라이언트에서 했으니 이제 naver 컴퓨터에서 그 요청에 대한 응답으로 naver.com이라는 사이트를 가져 와야 한다.
*naver 사이트는 요청을 한 사람의 컴퓨터에 저장된 것이 아니라 naver 컴퓨터(서버)에 저장되어 있는 것이다.
naver 컴퓨터에서 요청을 받은 naver.com을 다시 클라이언트 즉, 웹 브라우저로 보내준다.
요청을 보낼때 영어만 할 줄 아는 서버에 한국말로 요청을 보내면 어떻게 될까?
당연히 그 서버는 한국말을 모르기 때문에 요청에 대한 처리를 할 수 없다.
그래서 통일된 하나의 규칙, 규약이 필요한 것인데 그것이 바로 http다.
노드로 http 서버 만들기
노드는 http라는 모듈을 제공하고 있어서 간단히 서버를 만들 수 있다.
//createServer.js const http = require('http'); http.createServer((req, res) => { // 여기에 어떻게 응답할 지 적어줍니다. });
좀 더 발전시켜보면 다음과 같다
//server1.js const http = require('http'); http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.write('<h1>Hello Node!</h1>'); res.end('<p>Hello Server!</p>'); }) .listen(8080, () => { // 서버 연결 console.log('8080번 포트에서 서버 대기 중입니다!'); });
createServer를 통해 일단 서버를 만들었다. 클라이언트가 어떤 것이 될지 모르지만 요청이 오면 createServer가 실행되고 이 함수에서 어떻게 응답을 할지 정할 수 있다.
요청이 오면 응답을 Hello Node! , Hello Server! 이렇게 하게 된다.
서버도 프로그램이기 때문에 프로세스를 할당해야 한다.
노드가 서버를 실행하는 순간 해당 프로세스가 실행되야 하기 때문에 listen 을 통해서 할당을 해준다.
*보통 프로세스 하나는 포트 하나를 차지한다.
listen(8080, () =>) {
}
색깔 칠한 부분은 listen에 대한 콜백 함수이다. 즉 8080 포트와 연결이 됐다면 console.log 부분이 실행된다.
실행을 해보면
원래는 한번 작업을 실행하면 작업이 실행되고 다음 명령을 기다렸다.
서버를 실행하는 경우에는 그렇지 않고 서버 연결을 종료할 때까지 다른 명령을 받지 않는다.
즉, 서버 하나를 실행하면 터미널 하나를 차지한다는 말이 된다.
서버를 실행했으니 웹 브라우저(클라이언트)에서 방금 만든 서버로 요청을 보내보자.
원래는 주소가 있어야 되는데 도메인을 만들지 않았으니 로컬 호스트에서 요청을 보내면 된다.
웹 브라우저에서 localhost:8080 이라고 입력을 해 보자.
방금 서버를 8080포트로 만들었고 여기에 대한 요청을 웹 크라우저를 통해 로컬 호스트에서 한 것이다.
클라이언트에서 받은 응답은 다음과 같다
localhost 와 포트
localhost는 컴퓨터 내부 주소이다.
- 외부에서는 접근 불가능하다.
포트는 서버 내에서 프로세스를 구분하는 번호이다.
- 기본적으로 http 서버는 80번 포트를 사용한다. (생략가능, https는 443)
- 다른 포트로 데이터베이스나 다른 서버 동시에 연결 가능하다.
서버와 클라이언트에 대해서 알아봤는데 마지막으로 서버를 만들었다고 하면 거의 다 비동기 코드일 것이다.
비동기로 코드를 작성하면 반드시 에러 처리를 해야 한다고 했다. 따라서 위에서 했던 서버 코드에 에러 처리를 하면...
//server1.js const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.write('<h1>Hello Node!</h1>'); res.end('<p>Hello Server!</p>'); }) .listen(8080); server.on('listening', () => { console.log('8080번 포트에서 서버 대기 중입니다.'); }); server.on('error', (error) => { console.error(error); });
*서버를 한번 수정했으면 터미널에서 실행중이던 서버를 한번 끄고 다시 켜야 수정한 내용이 반영된다.
'노드' 카테고리의 다른 글
노드 REST API 서버 만들기 (1) 2023.04.13 노드 fs로 HTML 읽어 제공하기 (0) 2023.04.13 노드 에러 처리하기 (0) 2023.04.12 노드 스레드풀과 커스텀 이벤트 (0) 2023.04.12 노드 pipe와 스트림 메모리 효율 확인 (0) 2023.04.12