서버는 클라이언트가 있기에 동작한다.
클라이언트에서 서버로 요청(request)을 보내고, 서버에서는 요청의 내용을 읽고 처리한 뒤 클라이언트에 응답(response)을 보낸다.
따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다.
요청과 응답은 이벤트 방식이라고 생각하면 된다.
클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해둬야 한다.
아래는 이벤트 리스너를 가진 노드 서버이다.
const http = require('http');
http.createServer((req,res) => {
//여기에 어떻게 응답할지 적어줍니다.
})
http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있으므로 http 모듈을 사용했다.
http 모듈에는 createServer 메서드가 있다. 인수로 요청에 대한 콜백 함수를 넣을 수 있으며, 요청이 들어올 때마다 매번 콜백 함수가 실행된다.
따라서 이 콜백 함수에 응답을 적으면 된다.
보통 콜백의 매개변수로 req,res으로 표현하지만, 매개변수의 이름은 마음대로 바꿔도 상관이 없다.
req객체는 요청에 관한 정보들을, res 객체는 응답에 관한 정보들을 담고 있다.
아래는 응답을 보내는 부분과 서버 연결 부분을 추가한 코드이다.
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 메서드 뒤에 listen 메서드를 붙이고 createServer().listen()
클라이언트에 공개할 포트 번호와 포트연결 완료 후 실행될 콜백함수를 넣는다
이제 이 파일을 실행하면 서버는 8080번 포트에서 요청이 오기를 기다린다.
res.writeHead (응답에 대한 정보를 기록하는 메서드) :
- 첫 번째 인수로 성공적인 요청임을 의미하는 200을,
- 두 번째 인수로 응답에 대한 정보를 보내는데, 콘텐츠의 형식이 html임을 알리고 있다. 또한, 한글 표시를 위해 charset을 utf-8로 지정했다. 이 정보가 기록되는 부분을 헤더(header)라고 한다.
res.write : 첫 번째 인수는 클라이언트로 보낼 데이터이다. 지금은 html 모양의 문자열을 보냈지만 버퍼를 보낼 수도 있다. 또한, 여러번 호출해서 데이터를 여러 개 보내도 된다. 데이터가 기록되는 부분을 본문(body) 이라고 한다.
res.end (응답을 종료하는 메서드) : 만약 인수가 있다면 그 데이터도 클라이언트로 보내고 응답을 종료한다. 따라서 위의 예제는 res.write에서 <h1>Hello Node!</h1> 문자열을, res.end에서 <p>Hello Server</\p> 문자열을 클라이언트로 보낸 후 응답이 종료된 것이다. 브라우저는 응답 내용을 받아서 렌더링한다.
터미널에서 node 파일명을 실행하면 콘솔로그가 찍힌다.
그리고나서 브라우저에서 http://localhost:8080 에 접속하면 응답한 화면이 나온다.
listen 메서드에 콜백 함수를 넣는 대신, 아래와 같이 서버에 listening 이벤트 리스너를 붙여도 된다. 추가로 error 이벤트 리스너도 있다.
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>');
})
server.listen(8080);
server.on('listening', () => {
console.log('8080번 포트에서 서버 대기 중입니다.');
});
server.on('error', (error) => {
console.log(error);
})
res.write와 res.end 에 일일이 html을 적는 것은 비효율적이므로 fs 모듈로 html파일을 읽어서 전송할 수 있다.
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Node.js 웹 서버</title>
</head>
<body>
<h1>Node.js 웹 서버</h1>
<p>레츠꼬</p>
</body>
</html>
const http = require('http');
const fs = require('fs').promises;
http.createServer(async(req,res) => {
try{
const data = await fs.readFile('./server2.html');
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
res.end(data);
}catch(err){
console.error(err);
res.writeHead(500, {'Content-Type':'text/plain; charset=utp-8'});
res.end(err.message);
}
})
.listen(8081, () => {
console.log('8081번 포트에서 서버 대기 중입니다.')
})
'NodeJS' 카테고리의 다른 글
[NodeJS] 익스프레스 자주 사용하는 미들웨어 (0) | 2023.07.01 |
---|---|
[NodeJS] 익스프레스 웹 서버 만들기 (0) | 2023.07.01 |
[NodeJS] 자주 발생하는 에러들 (0) | 2023.06.29 |
[NodeJS] 예외 처리하기 (0) | 2023.06.29 |
[NodeJS] 모듈 만들기 (0) | 2023.06.25 |