Http-2

ys·2024년 5월 20일

Spring공부

목록 보기
3/14

1. Http 메서드 활용

클라이언트 -> 서버

크게 데이터 전달 방식은 두가지

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

4가지 상황이 있다

  1. 정적 데이터 조회( 쿼리 파라미터 미사용)
  2. 동적 데이터 조회( 쿼리 파라미터 사용)
  3. HTML Form을 통한 데이터 전송( GET,POST만 지원)
  4. 🤔 HTTP API를 이용한 데이터 전송

HTTP API 전송

  • 서버 to 서버
    • 백엔드 시스템 통신
  • 앱 클라이언트
    • 아이폰, 안드로이드
  • 웹 클라이언트
    • HMTL에서 Form 전송 대신, 자바 스크립트를 이용해 통신(AJAX)
    • React, Vue.js같은 웹 클라이언트와, API 통신
  • Post, Put, Patch : 메시지 body를 통해 데이터 전송
  • Get : 조회, 쿼리 파라미터로 데이터 전달
  • Content-Type : application/json을 주로 사용(사실상 표준)

🤔 등록 -> POST, PUT 차이!

API 설계!

  • URI 설계시 먼저 리소스를 식별하고
  • 리소스와 행위를 분리하자

  • POST는, 클라이언트가 등록될 리소스의 URI를 모른다
  • 회원등록 : POST/members
  • 응답 : HTTP/1.1 201 Created
  • 응답 : Location:/members/100
  • 이렇게, 서버가 관리하는 리소스 디렉토리를 ✅컬렉션(Collection)이라고 한다
    • 서버가 리소스의 URI를 생성하고 관리
    • 여기서 컬렉션은 /members이다
  • Put은, 클라이언트가 리소스 URI를 알아야 한다
  • 파일 등록 : PUT /files/{filename}
  • 클라이언트가, 생성될 리소스의 URI를 알고 관리하는 것
  • 이렇게 클라이언트가 관리하는 리소스 저장소를 ✅스토어(Store)라고 한다
    • 여기선 /files가 스토어다

🤔 POST, PUT은 리소스의 관리 주체가 다르다!!!


2. URI 설계

URI

  • Unifrom Resource Identifier
  • 인터넷에서 특정 자원을 나타내는 주소값
  • 해당값은 유일하다

`http://www.foo.co.kr/resource/sample/{1}의 응답은

  • sample1.pdf, sample2.pdf, sample.doc

URL

  • Uniform Resource Locator
  • 인터넷 상에서 자원,특정 파일이 어디에 위치하는지 식별 하는 주소

https://www.foo.co.kr/sample1.pdf

  • URL은 URI의 하위 개념이다!

URI 설계원칙 (RFC-3986)

  • 슬래시 구분자 ( / )는 계층 관계를 나타내는 데 사용한다.
    https://foo.co.kr/vehicles/suv/q6
  • URI 마지막 문자로 ( / ) 는 포함하지 않는다.
    https://foo.co.kr/vehicles/suv/q6/
  • 하이픈(-)은 URI가독성을 높이는데 사용한다
    https://foo.co.kr/vehicles/suv/q-series/6
  • 밑줄(_)은 사용하지 않는다.
    https://foo.co.kr/vehicles/suv/q_series/6
  • URI 경로에는 소문자가 적합하다.
    https://foo.co.kr/vehicles/suv/q6 ( O )
    https://Foo.co.kr/Vehicles/SUV/Q6 ( X )
  • 파일 확장자는 URI에 포함하지 않는다.
    https://foo.co.kr/vehicles/suv/q6.jsp
  • 프로그래밍 언어에 의존적인 확장자를 사용하지 않는다.
    https://foo.co.kr/vehicles/suv/q6.do
  • 구현에 의존적인 경로를 사용하지 않는다.
  • 세션 ID를 포함하지 않는다.
    https://foo.co.kr/vehicles/suv/q6?session-id=abcdef
  • 프로그래밍 언어의 Method명을 이용하지 않는다.
    https://foo.co.kr/vehicles/suv/q6?action=intro
  • 명사에 단수형 보다는 복수형을 사용해야 한다. 컬렉션에 대한 표현은 복수로 사용
    https://foo.co.kr/vehicles/suv/q6
  • 컨트롤러 이름으로는 동사나 동사구를 사용한다.
    https://foo.co.kr/vehicles/suv/q6/re-order
  • 경로 부분 중 변하는 부분은 유일한 값으로 대체 한다.
    https://foo.co.kr/vehicles/suv/q7/{car-id}/users/{user-id}/release
    https://foo.co.kr/vehicles/suv/q7/117/users/steve/release
  • CRUD 기능을 나타내는것은 URI에 사용하지 않는다.
    GET : https://foo.co.kr/vehicles/q7/delete/{car-id} ( X )
    DELETE : https://foo.co.kr/vehicles/q7/{car-id} ( O )
  • URI Query Parameter 디자인
    • URI 쿼리 부분으로 컬렉션 결과에 대해서 필터링 할 수 있다.
      https://foo.co.kr/vehicles/suv?model=q7
    • URI 쿼리는 컬렉션의 결과를 페이지로 구분하여 나타내는데
      사용한다.
      https://foo.co.kr/vehicles/suv?page=0&size=10&sort=asc
  • API에 있어서 서브 도메인은 일관성 있게 사용해야 한다.
    https://foo.co.kr
    https://api.foo.co.kr
  • 클라이언트 개발자 포탈 서브 도메인은 일관성 있게 만든다.
    https://dev-api.foo.co.kr/vehicles/suv/q6
    https://developer-api.foo.co.kr/vehicles/suv/q6
    https://foo.co.kr/servlet/vehicles/suv/q6

3. Http Status

  • HTTP 상태코드 : 클라이언트가 보낸 요청의 처리 상태를 응답해서 알려주는 기능
  • 그렇기에 응답 메시지에서 볼 수 있고, http응답 메시지 사직라인에서 볼 수 있다
  • 자세한 Http Status 상태 코드는 https://velog.io/@yys/http-stauts 참고
  • 만약 생성되는 리소스 주소(POST)는 응답 Http 헤더의 Location 헤더로 찾아볼 수 있다

4. Http 헤더

  • 우리가 f12를 눌러 네트워크를 보면, 우리가 보낸 http 메시지와 응답에 대한 정보를 볼 수 있다
  • 정말 많은 요청 헤더를 볼 수 있다...
  • 실제로 표준 헤더는 엄청 많고 임의의 헤더를 추가 가능하다
  • RFC723X로 표준이 변경되면서...
  • 엔티티에서 표현으로 방식이 바뀌었다
  • 표현 = 표현 메타데이터 + 표현 데이터
  • 메시지 본문(message body)를 통해 표현 데이터를 전달한다
  • 메시지 본문 = 페이로드(payload)
  • 표현은, 요청이나 응답에서 전달할 실제 데이터
  • 표현 헤더는 표현 데이터를 해설할 수 있는 정보를 제공한다
    즉, 표현은 = 표현 헤더 + 메시지 본문(payload)가 된다
profile
개발 공부,정리

0개의 댓글