node JS - API & req,res

Jaa-van·2023년 4월 24일
0
post-thumbnail

API

애플리케이션 끼리 연결해주는 매개체이자 약속

@api 를 작성한다는 것은?
프론트 엔드에서 원하는 기능을 수행하는 URL 과 인터페이스를 제공한다는 의미이다

=> 원하는 데이터를 받아 데이터베이스에 저장하고( + 가공, 등 ), 저장되어 있는 데이터를 읽어서 프론트엔드에 데이터를 제공하는 행위를 컨트롤한다

REST API

(Representational State Transfer)

www 와 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다

URL, Header, Method 등 네트워크 표현수단을 사람이 봐도 이해하기 쉬운 표현으로 정의하는 것 ( REST architecture 는 "자원" 을 정의하고 그 "자원"을 중심으로 표현 )

=> rest architecture 라는 규칙을 따르는 api

ex)
get /movies => movie 의 리스트를 가져온다

get / movies/:id => id 에 맞는 movie 를 가져온다

post / movies => 새로운 movie 를 생성한다

put /movies => 이미 존재하는 movie 를 업데이트 한다

delete /movies => 이미 존재하는 movie 를 삭제한

  1. 자원

만들 소프트웨어가 관리하는 모든것을 자원으로 표현할 수 있다
-> 상품에 대한 정보( Goods ) , 장바구니 ( Carts )

  1. 행위 - HTTP method
  • GET - 해당 자원을 조회
  • POST - 해당 자원을 생성
  • Create - 생성(POST)
  • Read - 조회(GET)
  • Update - 수정(Put) , (PATCH)
  • Delete - 삭제 (DELETE)
  1. 표현

해당 자원을 어떻게 표현할지에 관한 설명이다
=> 보통 JSON, XML 같은 형식을 사

HTTP 에서는 Content-Type 이라는 헤더를 통해 표현 방법을 서술한다

예시 )
router.get('/books', (req, res) => {
res.json({ success: true, data: getAllBooks() });
});

  • books 라는 자원을 GET( 조회 ) 라는 방법을 통해서 가져올거다
  • books 라는 URL 을 통해 구분하고 다른 표현이 없으니 전체 리스트를 불러오게 된다
    -> Read 를 담당하는 GET 메소드를 사용한 REST API 라고 볼 수 있

REST API 개발하기

  1. 상품 목록 조회 API 에서는 모든 상품이 한번에 다 나올 수 있어야 한다
    ex) get 메소드를 통해 /goods 라는 주소로 들어가면 모든 상품 목록이 response 로 응답해서 json 형식으로 목록이 보이게 한다
router.get("/goods", (req, res) => {
  res.status(200).json({ goods });
});

/goods url 에서 get 메소드를 호출하면 goods : goods 즉 key 값이 goods 이고 value 가 goods(변수인 goods) 값을 response 해주고 성공할 경우 200을 상태로 한다
=> 다른 말이 없기 때문에 모든 상품을 한꺼번에 조회하게 된다

  1. 특정 상품을 상세조회하기 위해서는 기존의 상품 목록 주소 이후에 URL Parameters 로 상품 id로 특정 상품 상세 조회를 한다

%URL Parameters 란?
router 주소에 쓰이는 특수한 패턴이다

예를 들어 상품 목록 조회 API 주소가 /goods 라면 그 뒤에 /:goodsId 라는 값을 추가해 요청시 id값을 받아올 수 있다
-> 이 값은 API 에서 req.params 객체 안에 들어있다

router.get("/goods/:goodsId", (req, res) => {
  const { goodsId } = req.params;
  console.log("params", params);

  res.status(200).json({});
});

이 코드를 통해서
localhost:3000/api/goods/2 를 호출하면
// params { goodsId: 2 }
가 나온다

즉 req.params 는 객체의 모양으로 생겼고 key 값이 goodsId 이다

따라서 구조 분해 할당을 통해서
const { goodsId } = req.params 를 찍으면
숫자 2가 goodsId 에 할당되게 된다

router.get("/goods/:goodsId", (req, res) => {
  const { goodsId } = req.params;

  let result = null;
  for (const good of goods) {
    if (Number(goodsId) === good.goodsId) {
      result = good;
    }
  }

  res.status(200).json({ detail: result });
});

그렇게 전체 상품 리스트인 goods 에서 for of 문을 이용해 goodsId 가 같을 경우에 result 에 할당한다 라는 반복문을 쓴다
그 이후에 res에 json 형태로 detail 이라는 key 값과 value 로 result 를 넣어 반환하게 되면 goodsId 가 맞는 상품 하나에 대한 값을
detail : goods 의 형태로 반환해준

const [result] = goods.filter((good) => good.goodsId === Number(goodsId))

for 문 대신 filter 를 사용한 방법이다

@Request

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

  • req.body => body 로 전달된 정보가 담긴 객체
    ( body-parser Middleware 를 사용해야 객체를 사용할 수 있다 )
  • req.params => 라우터 매개변수에 대한 정보가 담긴 객체
  • req.query => req 를 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체
    ( url 뒤에다가 ? 를 써서 전달하는 것이 쿼리 스트링 )

@Response

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

  • res.status => Response 에 HTTP 상태 코드를 지정한다
    ( 응답하는 것에다가 HTTP status 코드가 전송된다 )
    ex> error => 400
  • res.send => 데이터를 포함하여 Response 를 전달한다
    (데이터)
  • res.json => json 형식으로 Response 를 전달한다
    (가장 많이 사용한다) (json) - 객체와 비슷한 형

@쿼리
웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청 에 의한 처리이다
-> 쉽게 말하면 데이터베이스에 정보를 요청하는

query string 의 경우 url 뒤에 ? 가 붙고 그 뒤에 key: value 의 형식으로 들어간다

app.get("/", (req, res) => {
  console.log(req.query);

  res.send("정상적으로 반환되었습니다");
});

thunder client 로 가서
query parameters 에 입력을 하면 되는데 이 또한 key:value 의 형식으로 관리되기 때문에 key : value 값을 입력해준다
그러면 url 뒤에 ? 와 key=value 가 입력되는데 key와 value 값을 쿼리 스트링으로 전달할 것이다 라는 뜻이다

req.query 는 이 쿼리 스트링을 나타내는 것이고 console.log를 찍을 경우
{ key : value } 가 출력된다


url 뒤에 오는 부분을 :id 에 전달해줄 것이다

app.get("/:id", (req, res) => {
  console.log(req.params);

  res.send("id URI에 정상적으로 반환되었습니다.");
});

thunder client 로 가서 URI 뒤에 입력한 값이 자동으로 id 라는 key 값과 입력한 값을 value 로 가진 객체가 반환된다

결론적으로 라우터에 매개변수가 id 라는 것을 통해서 params 에 할당이 되게 된다


app.use(express.json());

=> body 데이터를 가져오기 위해서 body-parser middleware 를 등록한 것이다

app.post("/", (req, res) => {
  console.log(req.body);

  res.send("기본 URI에 POST 메소드가 정상적으로 실행되었습니다");
});

body 는 실제로 POST 메소드를 활용하기 위해서 많이 활용된다

thunder client 로 가면
body 탭 안에 json 형식으로 key:value 를 작성해주면
req.body 에 객체의 형식으로 전달되게 된다


app.get("/", (req, res) => {
  console.log(req.query);

  const obj = {
    KeyKey: "value 입니다.",
    이름입니다: "이름일까요?",
  };
  // res.send("정상적으로 반환되었습니다");
  res.status(400).json(obj);
});

기본적인 url 에서 get 메서드를 호출하면
res.json 의 형태로 반환된다

그 json 에 객체의 형태로 넣으면 json 의 형식으로 반환되고
status 를 이용해서 기본적으로 성공인 상태인 200 이 아닌
400 bad request 로 바꿔줄 수 있다

0개의 댓글

관련 채용 정보