IT/Server

[Node.js] 3. Request, Response

wakelight23 2024. 11. 20. 21:13

Request

클라이언트서버에게 전달하려는 정보나 메세지를 담는 객체

  - URL, HTTP method, 헤더(header), 쿼리 파라미터(query parameter), 바디 데이터(body data) 

Response

서버에서 클라이언트로 응답 메시지를 전송시켜주는 객체

  - 상태 코드(status code), 응답 데이터(response data), 응답 헤더(response header)

 

Express.js 흐름

예시 코드로 설명해보면 아래의 코드는 'app.js'라는 메인 node에 작성

주제 : 뉴스 목록 불러오기

 

● Express.js 흐름 분석

1. 서버 시작 - Express.js는 지정된 포트 번호(Port)를 사용하여 서버를 시작

// 1. Express.js의 서버를 엽니다.
app.listen(PORT, () => {
  console.log(PORT, '포트로 서버가 열렸어요!');
});

 

2. 라우터 등록 : 연결하려는 모든 라우터들을 /api 주소에 연결

import goodsRouter from './routes/goods.js';
import newsRouter from './routes/news.js';

// 2. 라우터를 등록 합니다.
app.use('/api', [goodsRouter, newsRouter]);

 

3. API 정의 : 등록된 각 아루터를 순서대로 검토하여, HTTP Method와 URL이 일치하는
                     API를 찾아 해당 API를 수행

** 뉴스 목록 조회 API **/
// 3. HTTP Method와 URL을 지정한 API를 정의
// 만약, localhost:3000/api/news 라는 URL로 GET 요청이 들어온다면 해당 코드를 실행
router.get('/news', (req, res) => {
   ...
});

 

4. 결과 반환 : API에서 모든 비즈니스 로직 처리가 완료된 후, 클라이언트에게 결과를 전달

router.get('/news', (req, res) => {
  // 4. 사용자의 요청에 맞는 데이터를 반환
  return res // Express.js의 res 객체를 반환
    .status(200) // API의 상태 코드를 200번으로 전달
    .send('뉴스 목록 조회 API 입니다.'); // API의 결과값을 '뉴스 목록 조회 API 입니다.'로 전달
});

 

API 분석 - 세부 조회

- 예시 API : 뉴스 세부 조회 API는 클라이언트가 GET /api/new/:newsId 에 요청할 때 실행하는 것

/** 뉴스 세부 조회 API **/
// 3. HTTP Method와 URL을 지정한 API를 정의
// 만약, localhost:3000/api/news/:newsId 라는 URL로 GET 요청이 들어온다면 해당 코드를 실행
router.get('/news/:newsId', (req, res) => {
  // 클라이언트가 전달한 Path Params 데이터를 받음
  const params = req.params;

  // Path Params 데이터 중 newsId를 추출
  const newsId = params.newsId;

  // 서버 콘솔에 클라이언트가 전달한 newsId를 출력
  console.log('클라이언트로 부터 전달받은 뉴스 ID:', newsId);

  // 4. 사용자의 요청에 맞는 데이터를 json 형태로 반환
  return res.status(200).json({
    data: '뉴스 세부 조회 API 입니다.',
  });
});

 

- :newsId에 해당하는 경로 변수(Path.Params)가 중요 → const newsId = params.newsId

더 자세한 Express.js의 req, res 객체

● 주요 req 객체

 - req.body : - Request를 호출할 때 body로 전달된 정보가 담긴 객체

                    - express.json() Middleware를 사용해야 해당 객체 사용 가능

- req.params : 라우터 매개 변수(Path Params)에 대한 저옵가 담긴 객체

- req query : Request 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체

- req.get(Header) : 헤더에 저장된 값을 가져오고 싶을 때 사용

 

● 주요 res 객체

 - res.app : res 객체를 통해 Express.js의 app 객체에 접근 가능

 - res.status(코드) : Response에 HTTP 상태 코드를 지정 

 - res.json(JSON) : JSON 형식으로 Response 전달

 

Response에 대해 더 자세하게

1. res.status(상태 코드)

app.post('/', (req, res) => {
  return res.status(201).json({key: 'Value'});
});

 - 서버가 클라이언트에게 응답(Response)을 보냈을 때 상태 코드 전달할 때 사용

 - Http 상태 코드는 HTTP 요청이 어떠한 상태로 처리 되었고, 완료되었는지 체크

   ex) 200에 대한 요청은 성공, 404s는 요청 리소스가 서버에 존재하지 않을 때

 - Express에서는 상태 코드를 명시하지 않으면, default = 200

 

2. res.json(JSON), res.send(데이터)

app.post('/', (req, res) => {
  return res.status(201).json({key: 'Value'});
});

 - res.json() 메서드는 JSON 형식의 데이터만 가능

 - res.send() 메서드는 다양한 유형의 데이터를 보내기 가능

 

Request에 대해 더 자세하게

1. req.body:(Body)

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, 사용자의 PW, 게시글 제목 등
 - POST, PUT과 같은 Http method에서 사용 됨

 

2. req.query:(Query String)

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://domain.com?name=김철수&age=30

  - 특정 콘텐츠의 위치를 표시하거나 웹 페이지에 특정한 옵션을 설정할 때 사용

    ex) 게시글 정렬, 특정 날짜의 게시글만 출력하는 옵션 설정 등

 - 주로 서버의 리소스를 필터링 하거나 정렬하는데 사용

    ex) https://domain.com/posts?sort=desc&page=3&limit=20

          # limit = 20 : 1 페이지당 20개의 게시글 조회

          # page = 3 : 3 페이지 조회

          # sort = desc : 게시글 내림차순 정렬

 - GET 같은 Http method에서 사용

 

3. req.params(Path Variable)

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) 게시글 상세 정보 조회, 사용자 상세 정보 조회