애플리케이션 끼리 연결해주는 매개체이자 약속
@api 를 작성한다는 것은?
프론트 엔드에서 원하는 기능을 수행하는 URL 과 인터페이스를 제공한다는 의미이다
=> 원하는 데이터를 받아 데이터베이스에 저장하고( + 가공, 등 ), 저장되어 있는 데이터를 읽어서 프론트엔드에 데이터를 제공하는 행위를 컨트롤한다
(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 를 삭제한
만들 소프트웨어가 관리하는 모든것을 자원으로 표현할 수 있다
-> 상품에 대한 정보( Goods ) , 장바구니 ( Carts )
해당 자원을 어떻게 표현할지에 관한 설명이다
=> 보통 JSON, XML 같은 형식을 사
HTTP 에서는 Content-Type 이라는 헤더를 통해 표현 방법을 서술한다
예시 )
router.get('/books', (req, res) => {
res.json({ success: true, data: getAllBooks() });
});
router.get("/goods", (req, res) => {
res.status(200).json({ goods });
});
/goods url 에서 get 메소드를 호출하면 goods : goods 즉 key 값이 goods 이고 value 가 goods(변수인 goods) 값을 response 해주고 성공할 경우 200을 상태로 한다
=> 다른 말이 없기 때문에 모든 상품을 한꺼번에 조회하게 된다
%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 를 사용한 방법이다
클라이언트가 서버에게 전달하려는 정보나 메세지가 담긴 객체
서버에서 클라이언트로 응답 메세지를 전송시켜주는 객체
@쿼리
웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청 에 의한 처리이다
-> 쉽게 말하면 데이터베이스에 정보를 요청하는
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 로 바꿔줄 수 있다