이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.
HTTP API를 어떤 식으로 이 URI를 설계하는지 설계 예시를 살펴보자!!
회원 관리 시스템을 설계해야 한다고 가정해보자!!
제일 중요한 것은 URI는 리소스를 식별한다는 것이다.
리소스 : 회원 => members => /members
이걸 "컬렉션"이라고 함
회원 목록 조회 => GET
회원 등록 => POST
/members
라는 컬렉션에다가 뭔가 데이터를 넣으면, 회원이 새로 등록 되게 할 꺼야. 이렇게 약속을 했다고 하자!!/members
에다가 회원 데이터를 하나 넣어주면, 회원이 추가로 등록 되도록 만든다.회원 조회 => GET
/members
라는 컬렉션 아래에다가 조회하고 싶은 id를 넣어주면 되겠다.회원 삭제 => DELETE
회원 수정 => PATCH, PUT, POST
Location
에다가 리소스의 위치를 넘겨준다."id":100
이런 식으로 위치를 넘겨준다.쉽게 말해서, 구글 클라우드에 내 파일들을 짚어넣고 관리하는 상황이다.
파일 목록 조회 => GET
/files
에 있는 목록들이 다 나온다.파일 조회 (단일 조회) => GET
/files/{파일명}
을 받아서 조회할 수있다.파일 등록 => PUT
{filename}
을 받는다.파일 삭제 => DELETE
{파일명}
을 주면, 그 파일이 삭제파일 대량 등록 => /files
=> POST
- POST도 데이터를 등록하는데 쓸 수 있고, PUT도 새로운 데이터를 저장하는데 쓸 수 있다.
- 하지만, 이 2개를 활용할 때, 다른 특징이 있다. 이것을 아는 것이 굉장히 중요하다!!
PUT을 사용할 때 POST와 다른 점은 클라이언트가 직접 리소스의 URI를 지정해준다.
즉, 클라이언트가 생성된 리소스의 URI를 다 알고, 본인이 관리한다는 의미이다.
반면에, POST로 등록할 때는 /members
만 넘기고 끝났다. 그리고 리소스의 URI는 서버가 알아서 만들어서 클라이언트 쪽으로 내려준다.
정리하면,
POST로 신규 데이터를 등록한다는 것은 클라이언트가 서버에 요청한다는 의미이다.
PUT 기반의 등록은 PUT 자체가 리소스 URI를 다 알고 등록해야 한다. star.jpg의 위치를 클라이언트가 다 알고, 서버에 그 위치까지 찍어서 보내준다.
이런 스타일의 관리를 스토어(Store)라고 한다!!
대부분 POST 기반의 신규 자원 등록방식을 쓴다. 즉, 컬렉션을 거의 다 쓴다.
PUT은 "파일 업로드" 같은 몇몇 케이스 빼고는 거의 사용하지 않는다.
실무에서는 대부분 POST 기반의 방식을 보게 된다.
HTML FORM 이니까 기본적으로 HTML이 그려진다고 생각하자!!
회원 목록 => GET
회원 등록 폼 => GET
회원 등록 => POST
/members/new
vs /members
=> POSTGET/members/new
, POST/members/new
POST/members/new
라 해서 서버에 던졌는데, 서버에서 뭔가 문제가 있어서 다시 그 POST의 최종 결과를 회원 등록 폼 (GET/members/new
)에 다시 보내야 하는 경우가 있다. 이렇게 GET과 POST 경로를 맞춰놓으면, 되게 깔끔하게 해결된다.회원 조회 => GET
회원 수정 폼 => GET
members/{id}/edit
에서 해당 회원 id를 받는다.회원 수정 => POST
POST/members/{id}
, POST/members/{id}/edit
GET/members/{id}/edit
, POST/members/{id}/edit
회원 삭제 => POST
delete
라는 컨트롤 URI를 사용해야 한다.POST/members/{id}/delete
HTML FORM은 GET, POST만 지원하기 때문에 제약이 있다. 그래서 컨트롤 URI를 쓸 수밖에 없다.
실무에서는 컨트롤 URI 많이 쓴다.
단, 컨트롤 URI를 남발하면 안 된다. 최대한 리소스라는 개념을 가지고 URI를 설계하고 그 상황에 정말 안 될 때, 컨트롤 URI로 대체한다.
그리고 HTTP API(1번)도 깔끔하게 HTTP 메서드들만으로 다 구현이 안 된다.
그래서, 막상 해보면 컨트롤 URI를 써야 하는 경우가 많다.
자료 출처 : REST Resource Naming Guide
여러 사람들이 API를 설계하다보니까, 좋은 practice들이 보인다. 그게 모이고 모이고 모여서, 결국 사람들이 정리해내고 체계화 시킨 것들이 위의 4가지 개념들이다. 물론, 정답은 아니고 좋은 practice라고 이해하자!!
위 practice들에 대한 자세한 설명은 자료 출처 링크에서 확인하자!!
문서는 {id}
이런 가변적인 파라미터가 없는 딱 하나의 파일을 말한다.
스토어는 파일같은 형식이나 게시판 같은 형식을 쓸 때 사용한다. 그러나, 대부분 경우 컬렉션을 압도적으로 많이 사용한다.
컨트롤러(controller)
=== 컨트롤 URI
=> CRUD만으로는 모든 문제가 절대 해결이 안된다.
=> 그럴 때, 추가적인 프로세스를 위해 어쩔 수없이 사용한다.
ex) 회원의 주문의 상태를 다음 상태로 진행해...
=> CRUD만으로 굉장히 애매함!!