일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 서블릿
- BeanValidation
- 의존관계
- 스프링 예외변환기
- 객체지향
- 언체크에러
- 백준4256
- BasicErrorController
- REST #REST API #HTTP 메서드
- HTTP 요청 메시지
- 김영한
- 스프링 타입컨버터
- 프로토타입 스코프
- 스프링 빈
- 스프링
- HTTP 응답 메시지
- 스프링 파일 업로드
- 깃허브 저장소 합치기
- 커밋로그
- DI
- 예외추상화
- BeanDefnition
- 스프링 컨테이너
- ExceptionResolver
- HTTP메시지
- 프로토콜 스택 4계층
- 체크에러
- 백준 2263
- http
- 웹 스코프
- Today
- Total
Enthusiasm! Enthusiasm!
HTTP 메서드 본문
이번 포스팅에서는 HTTP API를 설계하는 과정을 통해 HTTP 메서드가 어떻게 사용되는지 설명하겠다.
다음과 같이 회원정보 API를 만든다고 가정하자.
두 API중 어느게 더 좋은 API 일까?
API에서 URI를 설계할 때 가장 중요한것은 리소스 식별이다. 리소스란 회원을 등록하고 수정하고 조회하는 행위가 아니다. 회원이라는 개념 자체가 바로 리소스다. 즉 URI에서 기능은 모두 빼버리고 회원이라는 리소스만 식별할 수 있도록 설계하는게 더 좋은 API 설계라 할 수 있다. 그렇다면 리소스와 행위는 어떻게 구분할까?? 바로 HTTP 메서드를 이용하면 된다.
HTTP 메서드
HTTP 메서드의 종류
HTTP 메서드는 주로 사용하는 GET, POST, PUT, PATCH, DELETE등과 HEAD,OPTION과 같은 기타 메서드들이 있다.
- GET: 리소스 조회
- 클라이언트가 서버에 전달하고 싶은 데이터를 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달
- 서버에 GET 메서드를 사용한 HTTP요청 메시지를 전달하면 서버는 응답메시지를 클라이언트에게 보내줌
- 클라이언트가 GET메서드를 사용한 HTTP 메시지 전달 → 서버는 응답 데이터를 클라이언트에게 전달
- POST: 요청 데이터 처리, 주로 등록에 사용
- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행하며, 서버로 요청 데이터를 전달하면 서버는 요청 데이터를 처리한다.
- 새 리소스 생성(등록)
- 서버가 아직 식별하지 않은 새 리소스 생성
- 요청 데이터 처리
- 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
- ex) 주문에서 결제완료 -> 배달시작 -> 배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우 POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음
- ex) POST /orders/{orderId}/start-delivery (컨트롤 URI)
- 다른 메서드로 처리하기 애매한 경우
- ex) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우 애매하면 POST를 사용한다.
- PUT, PATCH, DELETE
- PUT: 리소스가 있으면 리소스를 완전히 덮어쓰기 하며, 해당 리소스가 없으면 생성한다. 클라이언트가 리소스 위치를 알고 URI를 지정하여 전송해야한다. (POST와 차이)
- PATCH: 리소스 내의 데이터를 부분적으로 변경할 때 사용한다.
- DELETE: 리소스 내의 데이터를 부분적으로 삭제할 때 사용한다.
- 기타 메서드
- HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
- CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
HTTP 메서드의 속성
- 안전
- 호출해도 리소스를 변경하지 않는다.(읽기모드와 비슷하다고 생각하면 된다.)
- GET,HEAD,OPTIONS,TRACE
- 멱등
- 여러번 호출해도 같은 결과가 나오는가?
- GET,HEAD,PUT,DELETE
- ex) 자동 복구 매커니즘 : 서버가 정상 응답을 못주었을 때, 클라이언트가 같은 요청을 다시해도 되는가? → 멱등이면 다시 해도 됨
- 캐시가능
- 응답 결과 리소스를 캐시해서 사용해도 되는가?
- GET,HEAD,POST
- 실제로는 GET,HEAD정도만 사용, POST는 본문까지 캐시 키로 고려해야 하는데 구현이 어려움
HTTP 메서드 활용
클라이언트에서 서버로 데이터를 전송할 때 전달 방식은 크게 2가지가 있다.
1.쿼리 파라미터를 통한 데이터 전송
- GET 메서드 이용
- 주로 정렬 필터
2.메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경
각 상황에서 이러한 방식이 어떻게 사용되는지 알아보자.
- 정적 데이터 조회
- 이미지와 정적 텍스트 문서 등을 조회할 때 사용
- 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회가 가능하다.
- 동적 데이터 조회
- 주로 검색, 게시판 목록에서 정렬 필터(검색어)에 사용
- GET 메서드를 이용하고 쿼리 파라미터를 사용하여 데이터를 전달한다.
- HTML Form 데이터 전송
- HTML Form에서 submit시 POST 전송을 하여 데이터를 전달한다.
- Contetnt-Type: application/x-www-form-urlencoded: form의 내용을 메시지 바디를 통해 전송하며, 쿼리 파라미터 형식과 동일한 key,value를 사용하는것을 의미한다.
- Contetnt-Type: multipart/form-data: 파일 업로드 같은 바이너리 데이터 전송시 사용 다른 종류의 여러 파일과 폼의 내용 함께 전송 가능
- GET전송도 가능하지만 /save와 같은 곳에는 사용하면 안된다, GET과 POST만 지원한다.
- HTTP API를 통한 데이터 전송
- 회원 가입, 상품 주문, 데이터 변경등에 사용
- 서버 to 서버, 앱 클라이언트, 웹 클라이언트 통신에서 데이터를 전송할 때 사용
- Contetnt-Type: application/json 현재 JSON을 사실상 표준으로 사용
HTTP API 설계
- 컬렉션
- 서버가 관리하는 리소스 디렉토리
- POST로 데이터를 넘기면 서버가 리소스 URI를 결정
- 서버가 새로 등록된 리소스 URI를 생성해준다. (ex)Location: /members/100)
- 회원 관리 시스템(여기서 컬렉션은 /members)
- 스토어
- 클라이언트가 관리하는 리소스 저장소
- 클라이언트가 리소스 URI를 알고 있어야하며 직접 리소스의 URI를 지정한다.
- 파일 관리 시스템(여기서 스토어는 /files)
- 컨트롤러
- GET, POST만 지원하는 HTML Form 형식에서 사용됨
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
- 리소스(명사)가 아닌 컨트롤(동사)를 사용
- POST의 /new, /edit, /delete가 컨트롤 URI
API를 설계할 때 리소스(명사)로(문서와 컬렉션) 최대한 설계를 하고, 이후에 정 안되면 컨트롤러(동사)를 사용하자!!
이전 포스팅-https://yulddong.tistory.com/20
HTTP 기본
HTTP(HyperText Transfer Protocol) HTTP는 HyperText Transfer Protocol의 약자로 웹 상에서 정보를 주고 받을 수 있는 프로토콜이다. HTTP의 기본 개념들과 특징을 알아보자. HTTP의 특징 HTTP 메시지(헤더+바디)에 모
yulddong.tistory.com
다음 포스팅-https://yulddong.tistory.com/22
이 포스팅은 모든 개발자를 위한 HTTP 웹 기본지식 (By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.
'자바 스프링 > HTTP웹 기본지식' 카테고리의 다른 글
HTTP 헤더 (0) | 2023.04.03 |
---|---|
HTTP 상태코드 (1) | 2023.02.02 |
HTTP 기본 (0) | 2023.01.27 |
인터넷 네트워크와 웹 브라우저 요청 흐름 (0) | 2023.01.16 |