danuri
오늘의 기록
danuri
전체 방문자
오늘
어제
  • 오늘의 기록 (307)
    • java (150)
      • java (33)
      • spring (63)
      • jpa (36)
      • querydsl (7)
      • intelliJ (9)
    • kotlin (8)
    • python (24)
      • python (10)
      • data analysis (13)
      • crawling (1)
    • ddd (2)
    • chatgpt (2)
    • algorithm (33)
      • theory (9)
      • problems (23)
    • http (8)
    • git (8)
    • database (5)
    • aws (12)
    • devops (10)
      • docker (6)
      • cicd (4)
    • book (44)
      • clean code (9)
      • 도메인 주도 개발 시작하기 (10)
      • 자바 최적화 (11)
      • 마이크로서비스 패턴 (0)
      • 스프링으로 시작하는 리액티브 프로그래밍 (14)
    • tistory (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • DDD
  • ChatGPT
  • JPA
  • AWS
  • Database
  • 자바 최적화
  • Java
  • Kotlin
  • PostgreSQL
  • 마이크로서비스패턴
  • Thymeleaf
  • Bitmask
  • POSTGIS
  • S3
  • Jackson
  • gitlab
  • 등가속도 운동
  • mockito
  • 도메인 주도 설계
  • SWAGGER
  • 트랜잭션
  • nuribank
  • Spring
  • connection
  • CICD
  • Security
  • docker
  • RDS
  • Saving Plans
  • reactive

최근 댓글

최근 글

hELLO · Designed By 정상우.
danuri

오늘의 기록

HTTP 메서드 활용
http

HTTP 메서드 활용

2021. 4. 12. 22:34

모든 개발자를 위한 HTTP 웹 기본 지식

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., 웹 기술을 사용하는 개발자라면 누구나 OK!꼭 필요한 HTTP의 핵심을 알려드립니다. 📣 확인해주세요!본 강의는 자바 스

www.inflearn.com

강의를 들으며 생각 정리

 

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


데이터 전달 방식은 크게 2가지로 나뉜다.

 

쿼리 파라미터를 통한 데이터 전송

GET

주로 정렬 필터(검색어)

 

메시지 바디를 통한 데이터 전송

POST, PUT, PATCH

회원 가입, 상품 주문, 리소스 등록, 리소스 변경

 

위 데이터 전달 방식을 기억하고 아래 클라이언트에서 서버로 데이터를 전송하는 4가지 상황을 보자.

  1. 정적 데이터 조회
  2. 동적 데이터 조회
  3. HTML Form을 통한 데이터 전송
  4. HTTP API를 통한 데이터 전송

하나하나 살펴보자.

 

정적 데이터 조회

쿼리 파라미터 미사용

 

ex)

GET /static/star.jpg HTTP/1.1

Host: localhost:8080

 

이미지, 정적 텍스트 문서를 전송한다.

조회는 GET을 사용한다.

정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능하다.

 

동적 데이터 조회

쿼리 파라미터 사용

 

ex)

GET /search?q=hello&hl=ko HTTP/1.1

Host: www.google.com

 

주로 검색, 게시판 목록에서 정렬 필터(검색어)

조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용

GET 사용

쿼리 파라미터를 사용해서 데이터를 전달

 

HTML Form 데이터 전송

POST 전송 - 저장

ex)

<form action="/save" method="post">

  <input type="text" name="username"/>

  <input type="text" name="age"/>

  <button type="submit">전송</button>

</form>

 

<웹 브라우저가 생성한 요청 HTTP 메시지>

POST /save HTTP/1.1

Host: localhost:8080

Content-Type: application/x-www-form-urlencoded : form의 내용을 메시지 바디를 통해서 전송

 

username=kim&age=20

 

GET 전송 - 조회

<form action="/members" method="get">

  <input type="text" name="username"/>

  <input type="text" name="age"/>

  <button type="submit">전송</button>

</form>

+) GET은 조회에만 사용해야 한다.

 

multipart/form-data

<form action="/save" method="post", enctype="multipart/form-data">

: 파일 업로드 같은 바이너리 데이터 전송시 사용

  <input type="text" name="username"/>

  <input type="text" name="age"/>

  <input type="file" name="file1"/>

  <button type="submit">전송</button>

</form>

 

<웹 브라우저가 생성한 요청 HTTP 메시지>

정리

1. HTML Form은 GET 조회도 가능

 

2. HTML Form submit시 POST 전송

2-1. Content-Type: application/x-www-form-urlencoded

form의 내용을 메시지 바디를 통해서 전송(key=value, 쿼리 파라미터 형식)

전송 데이터를 url encoding 처리 : "김" -> %EA%B9%80

 

2-2. Content-Type: multipart/form-data

파일 업로드 같은 바이너리 데이터 전송시 사용

다른 종류의 여러 파일과 폼의 내용 함께 전송 가능(multipart)

 

+) 참고로 HTML Form 전송은 GET, POST만 지원

 

HTTP API 데이터 전송

직접 HTTP 메시지 작성

 

ex)

POST /members HTTP/1.1

Content-Type: application/json

{ "username": "young", "age": 20 }

 

사용

  1. 서버 to 서버 : 백엔드 시스템 통신(HTML을 사용하지 않을 때)
  2. 앱 클라이언트 : 아이폰, 안드로이드
  3. 웹 클라이언트 : HTML에서 Form 전송 대신 자바 스크립트를 통한 통신(AJAX)
  4. POST, PUT, PATCH :  메시지 바디를 통해 데이터 전송
  5. GET : 조회, 쿼리 파라미터로 데이터 전달
  6. Content-Type: application/json을 주로 사용

 

+) HTML Form을 제외한 방법을 HTTP API라고 생각해도 좋다.

 

 

HTTP API 설계 예시


HTTP API 설계 방법으로 크게 3가지로 나눌 수 있다.

  1. HTTP API - 컬렉션
  2. HTTP API - 스토어
  3. HTML FORM 사용

하나씩 알아보자.

 

HTTP API - 컬렉션

POST 기반 등록

어떤 회원 관리 시스템이 있다고 하자.

• 회원 목록 /members -> GET

• 회원 등록 /members -> POST : 클라이언트는 등록될 리소스의 URI를 모르기 때문에 서버가 새로 등록된 리소스 URI를 생성해준다. (Location: /members/100)

• 회원 조회 /members/{id} -> GET

• 회원 수정 /members/{id} -> PATCH, PUT, POST

• 회원 삭제 /members/{id} -> DELETE

 

컬렉션

서버가 관리하는 리소스 디렉토리

서버가 리소스의 URI를 생성하고 관리

여기서 컬렉션은 /members

 

HTTP API - 스토어

PUT 기반 등록

어떤 파일 관리 시스템이 있다고 하자.

• 파일 목록 /files -> GET

• 파일 조회 /files/{filename} -> GET

• 파일 등록 /files/{filename} -> PUT : 클라이언트가 리소스 URI를 알고 있어야 하기 때문에 클라이언트가 직접 리소스의 URI를 지정한다.

• 파일 삭제 /files/{filename} -> DELETE

• 파일 대량 등록 /files -> POST : POST의 경우 사용자 편의에 따라 로직을 설정할 수 있다.

 

스토어

클라이언트가 관리하는 리소스 저장소

클라이언트가 리소스의 URI를 알고 관리

여기서 스토어는 /files

 

HTML FORM 사용

HTML FORM은 GET, POST만 지원하기 때문에 제약이 있다.

회원관리 시스템을 예로 들자.

• 회원 목록 /members -> GET

• 회원 등록 폼 /members/new -> GET

• 회원 등록 /members/new, /members -> POST : 두 URI 중 어떤 것을 사용해도 좋다. 그러나 validation 관리 측면에서 GET 폼과 동일한 URI를 사용하는 것이 편리하다. 

• 회원 조회 /members/{id} -> GET

• 회원 수정 폼 /members/{id}/edit -> GET

• 회원 수정 /members/{id}/edit, /members/{id} -> POST

• 회원 삭제 /members/{id}/delete -> POST

 

GET, POST만 지원하기 때문에 이런 제약을 해결하기 위해 동사로 된 추가적인 리소스 경로인  컨트롤 URI를 사용한다.

POST의 /new, /edit, /delete가 컨트롤 URI

컨트롤 URI는 HTTP 메서드로 해결하기 애매한 경우 사용한다.

 

정리

  1. HTTP API - 컬렉션 : POST 기반 등록, 서버가 리소스 URI 결정
  2. HTTP API - 스토어 : PUT 기반 등록, 클라이언트가 리소스 URI 결정
  3. HTML FORM 사용 : GET, POST만 지원 + 컨트롤 URI

참고하면 좋은 URI 설계 개념

문서 : 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)

ex) /members/100, /files/start.jpg

 

컬렉션 : 서버가 관리하는 리소스 디렉토리, 서버가 리소스의 URI를 생성하고 관리

ex) /members

 

스토어 : 클라이언트가 관리하는 자원 저장소, 클라이언트가 리소스의 URI를 알고 관리

ex) /files

 

컨트롤러, 컨트롤 URI : 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행, 동사를 직접 사용

ex) /members/{id}/delete

 

tips

일반적으로 설계 시 최대한 리소스 중심으로 문서와 컬렉션만을 이용하며 API를 설계한다.

만약 리소스+메서드로만 해결하기 어렵다면 이 때 컨트롤 URI를 사용한다.(대부분 이런 경우가 많다)

 

'http' 카테고리의 다른 글

HTTP 헤더 1 - 일반 헤더  (0) 2021.04.14
HTTP 상태코드  (0) 2021.04.13
HTTP 메서드  (0) 2021.04.12
HTTP 기본  (0) 2021.04.07
URI와 웹 브라우저 요청 흐름  (0) 2021.04.07
    'http' 카테고리의 다른 글
    • HTTP 헤더 1 - 일반 헤더
    • HTTP 상태코드
    • HTTP 메서드
    • HTTP 기본
    danuri
    danuri
    IT 관련 정보(컴퓨터 지식, 개발)를 꾸준히 기록하는 블로그입니다.

    티스토리툴바