졸업작품을 하면서 설계한 API 에 대해서 고민을 하던 중, RESTful
에 대해 잘 모르는 것 같아서 제대로 공부 및 정리를 해보기로 하였다.
우리 팀에서는 유저의 지역 인증 로직을 다음과 같이 put
메서드로 구현을 해두었다.
@**PutMapping**("/region")
public ResponseEntity<RegionUpdateResponse> updateRegion(@Login Long memberId, @Valid @RequestBody RegionUpdateRequest regionUpdateRequest) {
Region updateRegion = memberService.updateRegion(regionUpdateRequest, memberId);
return ResponseEntity.ok()
.body(new RegionUpdateResponse(updateRegion.getValue()));
}
이후 유저의 Alias
와 Region
을 둘다 바꿔야 하는 상황이면 어떤 HTTP Method
를 사용해야하지? 라는 의문과 함께 put
과 patch
에 대해서 혼동이 있는 상황을 인지를 했다. 그래서 코드살롱 분들에게 다음과 같이 질문을 올렸다.
사실상 혼자 자문 자답해버림,, 근데 애매하게 아는건 모르는거지 뭐…
이후 Restful 에 대해서 공부 및 정리 해보고, 공부한 내용을 반영해 답을 내리라는 조언을 얻었고 바로 공부하기로 했다.
Client Side
를 고려하지 않고, Client에서 바로 객체 치환 가능한 형태의 데이터 통신을 지향하게 되면서 Server 와 Client의 역할을 분리
하게 되었고, 서버에서 RESTful API 형식의 통신
을 하면 각 클라이언트에서는 이를 각각 처리 가능 하게 됨.REST API 는 세가지의 구성으로 이루어져있다.
하나씩 뜯어보자.
ID
가 존재하고 이 자원은 Server에 존재한다./board/1
GET
, POST
, PUT
, DELETE
, PATCH
등이 있다.GET
- 리소스의 표시를 요청POST
- 특정 리소스의 생성DELETE
- 특정 리소스의 삭제PATCH
- 리소스의 부분을 변경정리하자면 REST API 는 HTTP URI 를 통해 자원
을 명시하고, HTTP Method
( Post, Get, Put, Delete) 를 통해서 해당 자원에 대한 CRUD 작업
을 적용한다.
REST
는 무상태성을 갖는다. 즉 상태정보를 저장하고 관리를 하지 않는다. 이는 HTTP 프로토콜의 특성을 이용하기 때문.REST API
메세지만으로 해당 요청이 어떤 행위를 하는지 알 수 있다.GET /api/board
→ 1번 게시글 조회Uniform Interface
는 Http
표준을 따르면 모든 플랫폼에서 활용가능하다. 이때 URI
로 지정한 리소스에 대한 조작을 가능하게 한 아키텍처 스타일을 말한다.URI
로 지정한 자원에 대해 조작을 통일되고 한정적인 인터페이스로 수행결론적으로 RESTful 한가?
라는 질문은 다른 말로 REST API에 맞게 데이터를 주고 받는가? 라는 질문으로 바뀔 수 있다.
즉 어떠한 자원을 보내거나, 요청 할때 REST API 에 맞게 데이터를 주고 받으면, 다양한 브라우저 어플리케이션에 종속되지 않는 서비스를 만들 수 있다.
또한 HTTP 프로토콜을 따르기 때문에 최대한의 인프라를 활용 할 수 있다는 장점도 있다.
무엇보다 협업
의 측면에서 Clinent
와 Backend
혹은 개발자들 사이에서 URL
만 보고도 해당 요청이 어떤 자원
을 어떤 행위
로 처리를 해야하는지 알 수 있다.
이 질문에 대한 나의 답은
모두 리소스(유저)의 일부분만 변경하기 때문에 patch를 써야하고, 이를 RESTful 하게 처리하기 위해서는
patch /member/alias/{userId}
patch member/region/{userId}
등의 형태로 처리를 해야겠다고 생각한다.