1) Request, Response란 뭘까?
-
Request란 클라이언트가 서버에게 전달하려는 정보나 메시지를 담는 객체를 의미합니다. Request의 세부 사항에는 URL, Http method, 헤더(header), 쿼리 파라미터(query parameter), 바디 데이터(body data) 등이 포함됩니다.
-
Response란 서버에서 클라이언트로 응답 메시지를 전송시켜주는 객체입니다. Response의 세부 사항에는 상태 코드(status code), 응답 데이터(response data), 응답 헤더(response header) 등이 포함됩니다.
-
2) 서버 모듈
- Node.js의 서버 모듈에는 대표적으로 http 모듈과 Express.js가 존재합니다. → 여기서, http 모듈은 Node.js에서 기본 제공하는 Http 서버 모듈입니다.
- Express.js 는 http 모듈을 확장하여 제공합니다.
- Express.js 는 기존 http 모듈의 메서드도 사용할 수 있지만, Express.js가 추가 제공하는 메서드나 속성들을 사용할 수 있습니다.
- 최근에는 Express.js의 메서드가 더욱 편리하기에 기존 http 모듈의 메서드는 잘 사용되고 있지 않습니다.
-
3) Express.js의 흐름 파악하기
💪 **Express.js 통신 흐름**
1. **클라이언트**는 **특정 URL**과 **데이터**를 담은 **요청(Request)**을 **서버**에 전송합니다.
2. **서버**는 받은 데이터에 따라 필요한 **비즈니스 로직을 수행**합니다.
3. **서버**는 처리된 결과를 **클라이언트**에게 **응답(Response)**으로 보내줍니다.
Express.js의 req, res 객체
1) Express.js의 req, res 객체 살펴보기
req 객체
-
req.app : req 객체를 통해 Express.js의 app 객체에 접근할 수 있습니다.
-
req.ip: 요청한 Client의 ip 주소가 담겨 있습니다.
-
req.body: Request를 호출할 때 body로 전달된 정보가 담긴 객체입니다.
express.json() Middleware를 이용하여야 해당 객체를 사용할 수 있습니다.
-
req.params: 라우터 매개 변수(Path Params)에 대한 정보가 담긴 객체입니다.
-
req.query: Request를 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체입니다.
-
req.cookies: Request를 호출할 때 Cookie 정보가 담긴 객체입니다.
cookie-parser Middleware를 이용하여야 해당 객체를 사용할 수 있습니다.
-
req.get(Header): 헤더에 저장된 값을 가져오고 싶을 때 사용합니다.
res 객체
- res.app : res 객체를 통해 Express.js의
app 객체에 접근할 수 있습니다.
- res.status(코드) : Response에 HTTP 상태 코드를 지정합니다. → Http 상태 코드에 대해 자세히 알고싶다면 여기를 클릭해주세요!
- res.send(데이터) : 데이터를 포함하여 Response를 전달합니다.
- ex)
res.send('Hello, World');
- res.json(JSON) : JSON 형식으로 Response를 전달합니다.
- ex)
res.json({ message: 'Hello, World' });
- res.end() : 데이터 없이 Response를 전달합니다.
- res.redirect(주소) : 리다이렉트할 주소와 함께 Response를 전달합니다.
- ex)
res.redirect('https://naver.com');
- res.cookie(Key, Value, Option) : 쿠키를 설정할 때 사용합니다.
- res.clearCookie(Key, Value, Option) : 쿠키를 제거할 때 사용합니다.
- 2) Express.js의 Response 파헤쳐보기
👉 서버에서 클라이언트에게 보내는 메시지를 응답(Response)이라고 부릅니다.
status는 서버가 클라이언트에게 응답(Response)를 보낼 때 Http 상태 코드를 전송하는것을 나타내며, send, json은 서버가 클라이언트에게 응답(Response) 데이터를 전송하는 방법을 나열한 것입니다.
res.status(상태 코드)
app.post('/', (req, res) => {
return res.status(201).json({key: 'Value'});
});
- 서버가 클라이언트에게 응답(Response)을 보냈을 때, 상태 코드를 전달할 때 사용됩니다.
- Http 상태 코드는 HTTP 요청이 어떠한 상태로 처리 되었고, 완료되었는지를 나타냅니다.
- ex)
200은 요청이 성공적, 404는 요청한 리소스가 서버에 존재하지 않음
- Express에서 상태 코드를 명시하지 않으면, 상태 코드는 200으로 자동 전달됩니다.
res.json(JSON), res.send(데이터)
app.post('/', (req, res) => {
return res.status(201).json({key: 'Value'});
});
- 서버가 클라이언트에게 응답(Response)을 보냈을 때, 데이터를 전달할 때 사용됩니다.
res.json() 메서드는 JSON 형식의 데이터만 보낼 수 있습니다. Response Header의 Content-Type이 ‘application/json’으로 설정됩니다.
res.send() 메서드는 다양한 유형의 데이터를 보낼 수 있습니다.Response Header의 Content-Type을 데이터 유형에 따라 다르게 설정할 수 있습니다. → Content-Type은 서버가 클라이언트에게 전달하는 데이터의 타입을 지정할 때 사용됩니다.
- 3) Express.js의 Request 파헤쳐보기
👉 클라이언트에서 서버로 보내는 메시지를 **요청(Reuqest)**이라고 부릅니다. `body`, `params`, `query`는 클라이언트가 서버에 **요청(Request)**을 보낼 때 데이터를 어떤 방식으로 전송하는지에 대한 여러가지 방법들을 나열한 것 입니다.
**req.body: (Body)**
```jsx
app.post('/', (req, res) => {
// Request에서 body 데이터를 ReqBody 변수에 할당한다.
const ReqBody = req.body;
return res.status(201).json({});
});
```
- 클라이언트가 **요청(Request)**을 보냈을 때, Body에 데이터를 삽입하였을 때 사용됩니다.
- `**req.body`를 사용하기 위해서는 `express.json()` 미들웨어를 사용해야 합니다.**
- `Key-Value`의 데이터 형식을 가지고 있으며, 대표적으로 **JSON** 형태를 띄고 있습니다.
- **Body**는 `Query String`, `Path Variable(params)`과 다르게, URL만을 가지고 어떤 데이터를 전달하였는지 확인할 수 없는 특징을 가지고 있습니다.
- 데이터를 생성하거나 수정이 필요한 데이터의 전달을 위해 사용됩니다.
ex) 사용자의 ID, 사용자의 Password, 게시글 제목 등
- `POST`, `PUT`과 같은 Http method에서 사용됩니다.
**req.query: (Query String)**
```jsx
app.get('/', (req, res) => {
// Request에서 Query String 데이터를 ReqQuery 변수에 할당한다.
const ReqQuery = req.query;
return res.status(200).json({});
});
```
- 클라이언트가 **요청(Request)**을 보냈을 때, URL에 원하는 `Key-Value`를 삽입하여 데이터를 전달합니다.
- URL의 마지막에 `?`기호를 이용해 Query String을 사용할 수 있습니다.
ex) `https://sparta.com**?name=이용우&age=29**`
- 특정 콘텐츠의 위치를 표시하거나 웹 페이지에 특정한 옵션을 설정할 때 사용합니다.
ex) 게시글의 정렬, 특정 날짜의 게시글만 출력하는 옵션 설정 등
- 주로 서버의 리소스를 필터링하거나 정렬하는 데 사용됩니다.
ex) `https://sparta.com/posts?sort=desc&page=3&limit=20`
- `limit=20`: 1 페이지당 **20개의 게시글**을 조회한다.
- `page=3`: **3 페이지**를 조회한다.
- `sort=desc`: 게시글을 **내림차순**으로 정렬한다.
- `GET`과 같은 Http method에서 사용됩니다.
**req.params: (Path Variable)**
```jsx
app.get('/:name', (req, res) => {
// Request에서 Path Params 데이터의 name Key를 가진 Value를 name 변수에 할당한다.
const { name } = req.params;
return res.status(200).json({});
});
```
- 클라이언트가 **요청(Request)**을 보냈을 때, URL에 원하는 데이터를 삽입하여 전달합니다.
- URL 특정 경로를 **매개 변수**로써 사용합니다.
- 특정 게시글을 선택하거나 명확한 리소스를 지정해야할 때 사용합니다.
ex) 게시글의 상세 정보 조회, 사용자의 상세 정보 조회