체인의정석

Restful API에 맞게 수정하기 본문

개발/backend

Restful API에 맞게 수정하기

체인의정석 2021. 8. 5. 17:14
728x90
반응형
update 하는 API 는 Post 가 아니라 Put 메소드로 정의합니다.
그리고 RESTful API 의 설계 원칙에 따라 URL 도 정의했으면 좋겠습니다.
alliances/ivms101 로 정의하지 말고 alliances/:allianceId(\d+) 로 정의하고 request body 에 있는 allianceId 는 삭제하세요.

다음과 같은 피드백을 받았다.

 

restfulAPI에 대한 내용은 잘 알지 못했는데 이번 기회에 코드를 수정해 보았다.

아래의 글이 잘되있는 것 같았다.

 

https://sanghaklee.tistory.com/57

 

RESTful API 설계 가이드

1. RESTful API 설계 가이드 본 문서는 REST API를 좀 더 RESTful 하게 설계하도록 가이드할 목적으로 만들어졌다. 따라서, 기본적인 REST API 개념 설명은 아래의 링크로 대신한다. REST API 제대로 알고 사용

sanghaklee.tistory.com

 

먼저 내가 작성한 코드에서 맞지 않는 내용을 보자면 ,

GET/POST/DELETE/PUT을 바꾸고 api는 그대로 써야하는데 이번에 작성한 코드에서는 임의로 imvs101이라는 API로 따로 작성하였다.

따라서

업데이트 시에는 POST가 아닌 PUT을 사용한다.

 

만들던 API에는 GET이나 POST도 있었다. 라우팅 경로를 똑같이 해주면서 앞의 API종류만 바꿔준다.

 

해당 데이터를 받아 올때는 아래과 같이 req.body에서 정보를 받아오는 것이 아니라 parameter에서 원래 받아오던 정보는 parameter에서 받아와서 따로 req외의 입력갑으로 받아줄 수 있다.

  async 함수명(
    @HeaderParam() ,,,,,,
    @JsonBodyParam() req: UpdateAllianceRequest,
    @PathParam("allianceId", "Alliance ID") allianceId: bigint,
  ): Promise<AllianceUpdatedResponse> {
  
    try {
      const alliance = await 호출하는함수명({ ...req, allianceId });
  async 호출하는함수명(req: UpdateAllianceRequest & { allianceId: bigint }): Promise<any> {

아래에 조금 더 자세한 코멘트를 받을 수 있었다.

... 는 리소스를 나타내므로 request body 가 아니라 URL 에 들어가는게 맞습니다.

restful API 원칙에 따르면 리소스를 나타내는 부분은 req.body가 아니라 url에 들어가야 한다고 한다. 리소스를 나타내는 아이디 같은 값들은 url에 넣고 거기에 부가적으로 들어가는 요소들은 body에 넣는 식으로 API를 디자인 하도록 해야겠다.

 

 

또한 Desciption을 쓸 때 다른 기능이 추가될 가능성이 있는 경우 더 넓은 의미를 포함하는 "update 함수" 이런식으로 써주는 것이 좋다.

 

API를 쓸때 추가하는 작업을 해서 복붙을 햇었는데 이때 exception부분은 체크를 하지 못했다. 이부분도 체크하고 해당되는 내용만 남겨주어야 한다. create에서 이미 존재하지 않는지 체크하고 존재하면 생성되지 않는 로직이 있었는데 update에서는 어차피 이미 존재하는것을 가정하기 때문에 굳이 존재하지 않는다는 에러를 리턴할 필요가 없다.에러를 catch하는 부분에는 발생가능한 에러를 잡는 부분이므로, 정상적인 상황이라면 create에서 이미 잡는 부분을 update에서 또 잡아줄 필요는 없어 삭제한다. 이 부분은 업데이트 할때도 이중체크를 하면 좋다고 생각했지만 이러한 필요없는 체크는 과감히 버려주자.

 

또한 2개의 백엔드 시스템이 통신을 하는 경우 response의 규격이 확인이 안될때는 다른쪽 소스를 보고 수정해야 한다.

 

또한 수정사항으로 Type을 불러와서 업데이트 하는 경우 원래는 해당 타입에 대한 내용을 모두 새로 가져와서 일일히 썼었는데 그렇게 안하고 해당 객체를 DB에서 불러와서 만든 이후에는 해당 객체의 바뀌는 요소만 바꿔서 최종적으로 모두 바뀐 내용만 리턴해주면 된다. 아래에 코드로 예시를 써놨다.

 

바뀌기 전

     const 객체: 객체타입 = {
        객체.요소: req.업데이트할 내용,
        updatedAt: new Date(),
      };

바뀐 후 

객체.객체요소 = req.객체요소 업데이트값;
객체.updatedAt = new Date();
      
await update(객체)
728x90
반응형
Comments