[HTTP] #5. HTTP 메서드 활용- 김영한(인프런)

bien·2023년 6월 19일
0

HTTP

목록 보기
5/7

클라이언트에서 서버로 데이터 전송

2가지 데이터 전달 방식

  • 쿼리 파라미터를 통한 데이터 전송
    • GET
    • 주로 정렬 필터 (검색어)
  • 메시지 바디를 통한 데이터 전송
    • POST, PUT, PATCH
    • 회원가입, 상품 주문, 리소스 등록, 리소스 변경

4가지 데이터 전송 상황

  1. 정적 데이터 조회
    • 이미지, 정적 테스트 문서
  2. 동적 데이터 조회
    • 주로 검색, 게시판 목록에서 정렬 필터(검색어)
  3. HTML Form을 통한 데이터 전송
    • 회원가입, 상품 주문, 데이터 변경
  4. HTML API를 통한 데이터 전송
    • 회원가입, 상품 주문, 데이터 변경
    • 서버 to 서버, 앱 클라이언트, 웹 클라이언트(Ajax)

1. 정적 데이터 조회

쿼리 파라미터 미사용

  • 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능
  • 이미지, 정적 텍스트 문서
  • 조회: GET 사용

서버에서 단순 별 이미지를 클라이언트에게 내려주는 것. 클라이언트 측에서 데이터를 전송할 필요가 없다.

2. 동적 데이터 조회

쿼리 파라미터 사용

  • 주로 검색, 게시판 목록에서 정렬 필터(=검색어)
  • 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
  • 조회는 GET 사용
  • GET은 쿼리 파라미터 사용해서 데이터를 전달

3. HTML Form 데이터 전송

POST 전송 - 저장

Content-Type: application/x-www-form-urlencoded: 기본 설정

form 태그 안에 POST 방식으로 보내는 경우, 메시지를 바디에 담아서 보낸다.
form 태그 안에 GET 방식으로 보내는 경우, 쿼리 파라미터로 보낸다.

GET 전송 - 저장

GET 전송 - 조회

multipart/form-data

enctype="multipart/form-data"로 전송하면 웹 브라우저가 경계(boundary)를 자동으로 설정해준다. 여러 바이너리 컨텐트 파일을 보내기 위함.

📌 정리

  • HTML Form은 GET도 전송 가능
  • HTML Form submit시 POST전송
    • 예) 회원 가입, 상품 주문, 데이터 변경
  • Content-Type: application/x-www-urlencoded
    • form의 내용을 메시지 바디를 통해서 전송
      (key=value, like 쿼리 파라미터 형식)
  • Content-Type: multipart/form-data
    • 파일 업로드 같은 바이너리 데이터 전송시 사용
    • 다른 종류의 여러 파일과 폼의 내용 함께 전송 가능
      (그래서 이름이 multipart)
  • 참고: HTML Form 전송은 GET, POST만 지원

4. HTTP API 데이터 전송

클라이언트에서 서버로 데이터를 바로 전송하는 경우

  • 서버 to 서버: 백엔드 시스템 통신
  • 앱 클라이언트: 아이폰, 안드로이드
  • 웹 클라이언트
    • HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용(AJAX)
    • 예) React, VueJs같은 웹 클라이언트와 API 통신
  • POST, PUT, PATCH: 메시지 바디를 통해 데이터 전송
  • GET: 조회, 쿼리 파라미터로 데이터 전달
  • Content-Type: application/json 을 주로 사용 (사실상 표준)
    • TEXT, XML, JSON 등등

HTTP API 설계 예시

  • HTTP API - 컬렉션
    • POST 기반 등록
    • 예) 회원 관리 API 제공
  • HTTP API - 스토어
    • PUT 기반 등록
    • 예) 정적 컨텐츠 관리, 원격 파일 관리
  • HTML FORM 사용
    • 웹 페이지 회원 관리
    • GET, POST만 지원

회원 관리 시스템

API 설계 - POST 기반 등록

URI는 "리소스"를 식별해야지, 동작에 집중해서는 안된다.

회원 목록 /members -> GET
회원 등록 /members -> POST
회원 조회 /members/{id} -> GET
회원 수정 /members/{id} -> PATCH, PUT, POST
회원 삭제 /members/{id} -> DELETE

PUT: 완전히 덮어야 하는 경우사용

POST- 신규 자원 등록 특징

  • 클라이언트는 등록될 리소스의 URI를 모른다.
    • 회원 등록 /members -> POST
    • POST /mebers
  • 서버가 새로 등록된 리소스 URI를 생성해준다.
HTTP/1.1 201 CREATED
Location: /members/100
  • 컬렉션(Collection)
    • 서버가 관리하는 디소스 디렉토리
    • 서버가 리소스의 URI를 생성하고 관리
    • 여기서 컬렉션은 /members

클라이언트는 등록될 리소스의 URI를 모른다. 서버가 식별 URI를 생성해준다. 이러한 형식을 컬렉션이라고 부른다. 서버가 리소스 디렉토리를 관리하고, 리소스의 URI를 생성 관리한다.

파일 관리 시스템

API 설계 - PUT 기반 등록

파일 목록 /files -> GET
파일 조회 /files/{filename} -> GET
파일 등록 /files/{filename} -> PUT
파일 삭제 /files/{filename} -> DELETE
파일 대량 등록 /files -> POST

원격지에 파일 관리 시스템이 있는 것. 파일 등록하는 경우에, 클라이언트가 파일 이름을 알고 있으므로 URI를 알고 있다. 또한 파일을 업로드 하는경우 기존의 파일 내용을 덮어버리는 것이 맞으므로 PUT이 적절하다.

PUT-신규 자원 등록 특징

  • 클라이언트가 리소스 URI를 알고 있어야 한다.
    • 파일 등록 /files/{filename} -> PUT
    • PUT /files/star.jpb
  • 클라이언트가 직접 리소스의 URI를 지정한다.
  • 스토어(Store)
    • 클라이언트가 관리하는 저장소
    • 클라이언트가 리소스의 URI를 알고 관리
    • 여기서 스토어는 /files

POST와 달리, 클라이언트가 식별 URI를 알고 직접 등록한다. 이같은 방식을 스토어(Store) 라고 한다. 클라이언트가 직접 리소스의 저장소를 관리하는 것으로 이는 클라이언트가 리소스의 식별 URI를 알고 있으며 이를 관리할 수 있음을 의미한다.

실무에서는 거의 대부분 post기반의 컬렉션을 주로 사용한다. put기반의 스토어는 파일 업로드 기반으로 드물게 사용 된다.

HTML FORM 사용

  • HTML FORM은 GET, POST만 사용
  • AJAX 같은 기술을 사용해서 해결 가능 -> 회원 API 참고
  • 순수 HTML, HTML FORM만 사용한다고 전제하면 GET, POST만 지원하므로 제약이 있다.
- 회원 목록     /members -> GET
- 회원 등록 폼  /members/new -> GET
- 회원 등록     /members/new, /members -> POST
- 회원 조회     /members/{id} -> GET
- 회원 수정 폼  /members/{id}/edit -> GET
- 회원 수정     /members/{id}/edit, /members/{id} -> POST
- 회원 삭제     /members/{id}/delete -> POST

회원 등록에는 두가지 URI를 모두 사용 가능. Validation문제를 고려하면 등록의 GET, POST URI를 일치시켜 놓는것(members/new -> GET,POST)이 좋다. (검증과정 중 오류 발생시 다시 폼 페이지로 옮길때 URI 변경이 필요 없으므로)

DELETE 메서드를 쓰면 좋지만, 이것이 지원이 되지 않는 경우 어쩔 수 없이 메서드는 POST를 이용하고 URI로 구별해야 한다.

  • 컨트롤 URI
    • GET, POST만 지원하므로 제약이 있음
    • 이런 제약을 해결하기 위해 동사로 된 리소스 경로 사용
    • 컨트롤 URI: POST의 /new, /edit, /delete
    • HTTP 메서드로 해결하기 애매한 경우 사용 (HTTP API 포함)

실무에서는 컨트롤 URI 이용이 많다. 최대한 리소스 개념을 토대로 URI를 설계하고 한계가 있을때 대체제로 컨트롤 URI를 사용해야 한다.

📌 정리

  • HTTP API - 컬렉션
    • POST 기반 등록: 서버가 리소스 URI 결정
  • HTTP API - 스토어
    • PUT 기반 등록: 클라이언트가 리소스 URI 결정
  • HTTP FORM 사용
    • 순수 HTML+HTML form 사용 -> GET, POST만 지원

참고하면 좋은 URI 설계 개념

  • 문서(document)
    • 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
    • 예) /members/100, /files/satr.jpg
  • 컬렉션(collection)
    • 서버가 관리하는 리소스 디렉토리
    • 서버가 리소스의 URI를 생성하고 관리
    • /members

클라이언트는 요청만. 서버가 리소스에 이름 붙이고 등록, 저장, 삭제 다 수행

  • 스토어(store)
    • 클라이언트가 관리하는 자원 저장소
    • 클라이언트가 리소스의 URI를 알고 관리
    • /files

클라이언트가 uri를 알고 관리. put으로 클라이언트가 파일을 대체해버린다. 진짜 파일, 게시판 정도에만 사용됨

  • 컨트롤러(controller), 컨트롤 URI
    • 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
    • 동사를 직접 사용
    • /members/{id}/delete

실무의 복잡한 환경에서는 리소스는 uri로, 동작은 메서드로 구성하는 이상적인 수행이 어렵다. 컨트롤러, 컨트롤 URI를 통해 동사를 사용하여 리소스에 표기하는 것이 필요하다.
실제 URI를 설계 : 1. 가장 첫번째로 리소스를 초점으로 설계한다.(컬렉션이므로 s를 붙여서) 2. 이를 통해 해결이 안되는 경우 컨트롤 URI를 사용하여 명명한다.

profile
Good Luck!

0개의 댓글