회원 정보 관리 API를 만들어보자.
- 회원 목록 조회
- 회원 조회
- 회원 등록
- 회원 수정
- 회원 삭제
무작정 URI에 기능을 표현하는 방법은 좋은 설계가 아니다.
중요한 것은 리소스 식별이다.
여기서 리소스는 무엇일까?
'회원'이라는 개념 자체가 리소스이다.
나머지는 단지 기능일 뿐이다.
그러므로, '회원'이라는 리소스만 식별하면 된다. => 회원 리소스를 URI에 매핑한다.
- 회원 목록 조회: /members/{id}
- 회원 조회: /members/{id}
- 회원 등록: /members/{id}
- 회원 수정: /members/{id}
- 회원 삭제: /members/{id}
URI는 리소스만 식별한다.
리소스를 대상으로 하는 행위를 분리하면 각 기능별로 구분할 수 있다.
여기서는 '조회', '등록', '삭제', '변경'이 행위이다.
행위(메서드)는 GET, POST로 구분할 수 있다.
<주요 HTTP 메서드 종류>
- GET: 조회
- POST: 요청 데이터 처리, 주로 등록
- PUT: 리소스 대체, 없으면 생성(덮어쓰기)
- PATCH: 리소스 부분 변경
- DELETE: 리소스 삭제
<클라이언트에서 서버로 데이터 전송>
1. 전달 방식
*쿼리 파라미터(GET)
*메시지 바디(POST, PUT, PATCH)
2. 상황
*정적 데이터 조회
*이미지, 정적 텍스트 문서
*일반적으로 쿼리 파라미터 없이 리소스 경로로 단순히 조회 가능
*동적 데이터 조회
*주로 검색, 정렬 필터
*GET은 쿼리 파라미터 사용해 데이터 전달
*HTML Form
*회원 가입, 상품 주문, 데이터 변경(POST 전송)
*조회용 GET 전송도 가능
*GET, POST만 가능
*HTTP API
*회원 가입, 상품 주문, 데이터 변경
*서버to서버, 앱 클라이언트, 웹 클라이언트(Ajax)
*Content-Type: application/json을 주로 사용(사실상 표준)
이제 회원 관리 시스템에 API 설계를 적용해보자.
- 회원 목록 조회: /members => GET
- 회원 조회: /members/ => POST
- 회원 등록: /members/{id} => GET
- 회원 수정: /members/{id} => PUT
- 회원 삭제: /members/{id} => DELETE
POST를 사용하면 클라이언트는 등록된 리소스의 URI를 모르고, 서버가 새로 등록된 리소스 URI를 생성해준다.
*회원 등록 /members => Location: /members/100 생성
*서버가 리소스의 URI를 생성하고 관리하는 디렉토리를 컬렉션이라고 한다.(여기서는 /members)
반면에, PUT은 클라이언트가 리소스 URI를 알고 있어야 한다.
*파일 등록 /files/{filename} => PUT /files/star.jpg
*클라이언트가 리소스의 URI를 알고 관리하는 저장소를 스토어라고 한다.(여기서는 /files)
회원 등록, 수정시 폼을 사용해 데이터를 받을 필요가 있다.
하지만 HTML FORM은 GET, POST만 지원하므로 제약이 있다.
- 회원 목록 조회: /members => GET
- 회원 조회: /members/ => POST
- 회원 등록: /members/{id} => GET
- 회원 등록 폼: /members/new => GET
- 회원 수정: /members/{id}/edit => POST
- 회원 수정 폼: /members/{id}/edit => POST
- 회원 삭제: /members/{id}/delete => POST
이러한 제약사항으로 인해 컨트롤 URI가 필요하다.
컨트롤 URI란, 동사로 된 리소스 경로를 사용하는 것이다.
POST의 /new, /edit, /delete가 컨트롤 URI이다.
'공부 > Spring' 카테고리의 다른 글
[Spring MVC](2) MVC 패턴 (1) | 2024.01.19 |
---|---|
[Spring MVC](1) HttpServletRequest & HttpServletResponse (0) | 2024.01.19 |
[HTTP](2) URI, HTTP (0) | 2024.01.18 |
[HTTP](1) 웹 기본 지식 (0) | 2024.01.18 |
[스프링 핵심](9) 웹 스코프 (0) | 2024.01.18 |