반응형
Request와 Response의 개념
- Request: 클라이언트(예: 웹 브라우저, 애플리케이션)가 서버에 요청을 보내는 행위
URL: 서버의 특정 리소스를 지정
HTTP Method: 행동을 정의 (Ex. GET, POST)
Headers: 요청에 대한 메타데이터를 포함
Query Parameters: URL에 추가된 선택적 데이터
Body Data: POST 및 PUT 요청과 같은 일부 요청에 포함된 데이터 - Response: 서버가 클라이언트의 요청에 응답하는 것
Status Code: 요청이 성공적이었는지, 문제가 있었는지를 나타냄 (Ex. 200, 404).
Response Data: 클라이언트에게 전달되는 데이터
Response Headers: 응답의 메타데이터
서버 모듈
- HTTP 모듈: Node.js의 기본 모듈로, HTTP 서버 및 클라이언트 기능을 제공
해당 모듈을 사용하여 HTTP 서버를 구축할 수 있으나, 보다 복잡한 기능을 위해 Express.js와 같은 프레임워크를 선호 - Express.js: HTTP 모듈을 확장하여 보다 풍부한 기능과 간결한 코드 구조를 제공하는 인기 있는 웹 프레임워크
Express.js는 HTTP 모듈의 기능을 포함하며, 추가적인 미들웨어, 라우팅, 템플릿 엔진 등을 제공
Express.js의 통신 흐름
- 클라이언트 요청: 클라이언트는 특정 URL과 데이터를 포함한 요청을 서버로 보냄
- 서버 처리: 서버는 요청을 받고 필요한 비즈니스 로직을 수행
- 서버 응답: 처리된 결과를 클라이언트에게 응답으로 보냄
API 구현 과정
- 라우터 설정: Express.js의 라우터를 사용하여 특정 HTTP 메소드와 URL에 따라 요청을 처리할 함수를 정의
- 데이터 처리: 서버는 요청에 포함된 데이터를 처리하고, 필요한 경우 데이터베이스와 상호작용
- 응답 반환: 처리된 결과를 클라이언트에게 JSON 형식 등으로 반환
Express.js의 req 객체
- req.app: 현재 실행중인 Express 애플리케이션의 인스턴스를 참조
- req.baseUrl: 라우터 인스턴스에서의 마운트 경로를 반환
- req.body: 클라이언트로부터 받은 본문 데이터
express.json() 미들웨어를 사용하여 파싱 - req.cookies: 쿠키 데이터를 담고 있음
cookie-parser 미들웨어 필요 - req.hostname: 요청의 호스트 이름을 반환
- req.ip: 요청을 보낸 클라이언트의 IP 주소를 반환
- req.method: HTTP 요청 메서드 (예: GET, POST)를 반환
- req.originalUrl: 요청의 원본 URL을 반환
- req.params: 라우트 경로의 매개변수를 담은 객체
Ex. router.get('/user/:id', ...)에서 :id의 값을 담고 있음 - req.path: 요청 URL의 경로 부분을 반환
- req.protocol: 요청의 프로토콜을 반환
Ex. http, https - req.query: URL의 쿼리 스트링 매개변수를 객체 형태로 담고 있음
Ex. /search?q=taco에서 req.query.q는 'taco' - req.route: 현재 라우트에 대한 정보를 담고 있음
- req.secure: HTTPS를 통해 요청이 이루어졌는지 여부를 반환
- req.signedCookies: 서명된 쿠키의 내용을 담고 있음
cookie-parser 미들웨어 필요 - req.xhr: 요청이 Ajax 요청인지 여부를 Boolean 값으로 반환
Express.js의 res 객체
- res.app: 현재 실행 중인 Express 애플리케이션의 인스턴스를 참조
- res.append(field, [value]): HTTP 응답의 헤더 필드를 지정된 값으로 설정
- res.cookie(name, value, [options]): 쿠키를 설정
옵션으로 maxAge, path 등을 설정할 수 있음 - res.clearCookie(name, [options]): 지정된 이름의 쿠키를 제거
- res.download(path, [filename], [callback]): 파일을 다운로드할 수 있게 함
- res.end([data], [encoding]): 응답 프로세스를 종료
- res.format(object): 요청의 Accept HTTP 헤더에 따라 다른 컨텐츠를 보낼 수 있음
- res.get(field): 지정된 헤더 필드의 값을 반환
- res.json([body]): JSON 형식의 응답을 보냄
- res.jsonp([body]): JSONP 지원을 통해 응답을 보냄
- res.redirect([status,] path): 지정된 경로나 URL로 리다이렉트
- res.render(view, [locals], callback): 템플릿 엔진을 사용하여 뷰를 렌더링
- res.send([body]): 다양한 유형의 응답 본문을 보냄
- res.sendFile(path, [options], [callback]): 파일을 응답으로 전송
- res.sendStatus(statusCode): 상태 코드와 함께 응답을 보냄
- res.set(field, [value]): 응답의 HTTP 헤더를 설정
- res.status(code): 응답의 상태 코드를 설정
- res.type(type): Content-Type 헤더를 설정
예제 코드
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
// JSON 및 URL 인코딩된 본문 데이터와 쿠키를 파싱하기 위한 미들웨어 설정
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
// 예제 라우트: GET /user/:id
// 객체의 다양한 속성을 로깅하고, res.json을 사용하여 JSON 응답을 보냄
app.get('/user/:id', (req, res) => {
// req 객체 사용 예제
console.log('Express 앱 인스턴스:', req.app);
console.log('Base URL:', req.baseUrl);
console.log('받은 쿠키:', req.cookies);
console.log('요청 호스트명:', req.hostname);
console.log('클라이언트 IP:', req.ip);
console.log('HTTP 메서드:', req.method);
console.log('원본 URL:', req.originalUrl);
console.log('라우트 매개변수:', req.params); // { id: '...' }
console.log('요청 경로:', req.path);
console.log('요청 프로토콜:', req.protocol);
console.log('쿼리 스트링 매개변수:', req.query); // ?query=value
console.log('라우트 정보:', req.route);
console.log('HTTPS 연결 여부:', req.secure);
console.log('서명된 쿠키:', req.signedCookies);
console.log('Ajax 요청 여부:', req.xhr);
// res 객체 사용 예제
res.status(200).json({ id: req.params.id, query: req.query });
});
// 예제 라우트: POST /submit
// POST 요청의 본문을 받고, 그 내용을 JSON 형식으로 응답
app.post('/submit', (req, res) => {
// POST 요청의 본문 데이터
console.log('POST 본문:', req.body);
// JSON 응답 보내기
res.json({ received: true, data: req.body });
});
// 예제 라우트: GET /download
// 지정된 파일을 다운로드
app.get('/download', (req, res) => {
// 파일 다운로드
const file = 'path/to/file.txt'; // 실제 파일 경로로 변경
res.download(file, 'your-file-name.txt');
});
// 예제 라우트: GET /cookie
// 쿠키를 설정
app.get('/cookie', (req, res) => {
// 쿠키 설정
res.cookie('example', 'value', { maxAge: 900000, httpOnly: true });
res.send('Cookie is set');
});
// 예제 라우트: GET /clear-cookie
// 설정된 쿠키를 제거
app.get('/clear-cookie', (req, res) => {
// 쿠키 제거
res.clearCookie('example');
res.send('Cookie cleared');
});
// 서버 시작
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
반응형
'backend > Node.js' 카테고리의 다른 글
| [Node.JS 입문 리뉴얼] 데이터베이스와 MongoDB (0) | 2023.12.04 |
|---|---|
| [Node.JS 입문 리뉴얼] REST API 개발 (0) | 2023.12.04 |
| [Node.JS 입문 리뉴얼] API와 REST API의 개념 (0) | 2023.11.30 |
| [Node.JS 입문 리뉴얼] ES6 Module 시스템 (0) | 2023.11.30 |
| [Node.JS 입문 리뉴얼] Express.js 프레임워크 (1) | 2023.11.29 |
