HTTP 메서드

2021. 12. 9. 20:26·교육 및 인강/모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한

김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 수강하면서 HTTP 내용을 정리한다.

자세한 정보가 궁금하면 수강을 추천드립니다.

 

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

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

www.inflearn.com


HTTP API 만들어보기

백엔드 개발자는 주 업무는 API 개발인데, 요구사항 기반으로 API를 만든다.

일반적으로 회원 정보 관리 API 요구사항을 받아 URI 설계를 하면 대부분 다음과 같은 형태를 가진다. 

- 회원 목록 조회 /read-member-list 

- 회원 조회 /read-member-by-id 

- 회원 등록 /create-member

- 회원 수정 /update-member

- 회원 삭제 /delete-member

* 지금도 많은 사이트에서 위와 같은 URI 방식으로 설계되어 사용된다.   

과연 좋은 URI 설계일까?

가장 중요한 것은 리소스 식별이다.

 

리소스의 의미는?

- 회원을 등록하고 수정하고 조회하는 건 리소스가 아니다.

- 회원이라는 개념 자체가 바로 리소스다.

 

리소스 식별 방법은?

- 회원을 등록하고 수정하고 조회하는 것을 모두 배제한다.

- 회원이라는 리소스만 식별하면 된다. -> 회원 리소스를 URI에 매핑

 

리소스 식별, URI 계층 구조 활용

재식별된 리소스를 기반으로 URI를 재설계하면 다음과 같은 구조가 나온다.

- 회원 목록 조회 /members

- 회원 조회 /members/{id}

- 회원 등록 /members/{id}

- 회원 수정 /members/{id}

- 회원 삭제 /members/{id}

* 참고 : 계층 구조상 상위를 컬렉션으로 보고 복수 단어 사용 권장(member -> members) 

 

URI는 리소스만 식별

리소스와 해당 리소스를 대상으로 하는 행위를 분리

- 리소스 (명사) : 회원

- 행위 (동사) : 조회, 등록, 삭제, 변경     

 

그럼 구분을 어떻게 하지?

행위 (조회, 등록, 수정, 삭제)가 같은 /members/{id}를 사용하고 있다.

구분하는 방법은 HTTP 메서드 GET, POST, PATCH, DELETE를 사용하는 거다.


HTTP 메서드 종류

HTTP 주요 메서드

- GET : 리소스 조회 

- POST : 요청 데이터 처리, 주로 등록에 사용

- PUT : 리소스를 대체, 해당 리소스가 없으면 생성

ex) 파일을 폴더에 넣는데 기존 파일이 있으면 덮어 씌우고, 없으면 추가

- PATCH : 리소스 부분 교체

- DELETE : 리소스 삭제

 

기타 메서드 (참고)

- HEAD : GET과 동일하지만 메시지 부분만 제외하고, 상태 줄과 헤더만 반환

- OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명 (주로 CORS에서 사용)

- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정

- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

GET

- 말 그대로 리소스를 조회

- 서버에 전달하고 싶은 데이터는 쿼리 파라미터(쿼리 스트링)를 통해서 전달

- 메시지 바디를 사용할 수 있지만, 지원하지 않은 곳이 많아서 권장하지 않음.

쿼리스트링으로 데이터 전달

 

GET 요청과 응답

 

POST

- 요청 데이터 처리

- 메시지 바디를 통해 서버로 요청 데이터 전달

- 서버는 요청 데이터를 처리

    - 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.

- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용

 

POST 요청과 응답

* 생성된 리소스 식별자도 보내준다

 

POST, 요청 데이터를 어떻게 처리한다는 뜻일까?

- 스펙 : POST 메서드는 대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함 된 표현을 처리하도록 요청.

- POST는 다음과 같은 기능에 사용

    - HTML 양식에 입력 된 필드 같은 데이터 블록을 데이터 처리 프로세스에 제공 ex) 회원 가입, 주문 등

    - 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시 ex) 게시판 글쓰기, 댓글 달기

    - 서버가 아직 식별하지 않은 새 리소스 생성 ex) 신규 주문 생성

    - 기존 자원에 데이터 추가 ex) 한 문서 끝에 내용 추가하기

이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없다.

 

POST 정리

- 새 리소스 생성 (등록)

    - 서버가 아직 식별하지 않은 새 리소스 생성

- 요청 데이터 처리

    - 단순한 데이터 생성, 변경을 넘어서 프로세스를 처리해야할 경우 ex) 주문에서 결제 완료 -> 배달 시작 -> 배달 완료처럼 프로세스의 상태가 변경되는 경우

    - POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음 ex) POST /orders/{orderId}/start-delivery (컨트롤 URI)

- 다른 메서드로 처리하기 애매한 경우

    ex) JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우

    * 애매하면 POST를 사용하자

PUT

리소스를 대체

- 리소스가 있으면 대체, 없으면 생성 -> 파일의 덮어씌기를 생각하자.

*클라이언트가 리소스를 식별

- 클라이언트가 리소스 위치를 알고 URI 지정

- POST와 차이점

 

 

 

존재하면 대체, 없으면 생성

* 주의점은 리소스를 완전히 대체해서 기존 정보가 다 날라간다. 

 

PATCH

완전히 대체하지 않고 부분 대체만 하려면 부분 변경하는 PATCH를 사용한다.

부분 변경하는 PATCH

 

DELETE

리소스 제거는 DELETE를 한다.

삭제하려면 DELETE


HTTP 메서드의 속성

- 안전 (Safe Methods)

- 멱등 (Idempotent Methods)

- 캐시가능 (Cacheable Methods)

안전 (Safe)

- 호출해도 리소스를 변경하지 않는다. ex) GET 조회

- 오로지 해당 리소스만 고려한다. 계속된 조회로 서버 과부하로 발생한 장애는 고려하지 않는다.

멱등 (Idenpotent)

- 몇번을 호출하든 결과는 동일해야 한다.

- 멱등 메서드

    - GET : 한번, 두번 결과가 동일

    - PUT : 결과를 대체한다. 같은 요청을 보내도 결과는 동일하다.

    - DELETE : 결과를 삭제한다. 여러 번 삭제해도 결과는 같다.

- POST는 멱등이 아니다. ex) 주문을 두번하면 새로운 리소스로 구별이 된다.

- 활용

    - 자동 복구 메커니즘
    - 서버가 타임아웃 등으로 응답을 못주었을 때, 클라이언트가 같은 요청을 보내도 되는가? 판단 근거.

- 동시성 문제로 리소스가 변경되면? -> 멱등은 동시성 문제까지 고려하지 않는다.  

캐시 가능 (Cacheable)

- 응답 결과 리소스를 캐시해서 사용해도 되는가? (이미지, js 등)

- GET, HEAD, POST, PATCH 캐시 가능

- 실제로는 GET, HEAD 정도만 캐시로 사용 

    - GET, HEAD는 동일한 요청이 자주와서 사용하기 쉬움

    - POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음.

'교육 및 인강 > 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한' 카테고리의 다른 글

HTTP 상태코드  (0) 2021.12.10
HTTP 메서드 활용  (0) 2021.12.10
HTTP 기본  (0) 2021.12.09
URI와 웹 브라우저 요청 흐름  (0) 2021.12.08
인터넷 네트워크  (0) 2021.12.08
'교육 및 인강/모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한' 카테고리의 다른 글
  • HTTP 상태코드
  • HTTP 메서드 활용
  • HTTP 기본
  • URI와 웹 브라우저 요청 흐름
loop-study
loop-study
오늘도 공부하자
  • loop-study
    개발 공부할래?
    loop-study
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • 목표 및 회고 (26)
      • 세미나 & 워크샵 (1)
      • 교육 및 인강 (67)
        • TDD, Clean Code with Java (5)
        • ATDD, 클린 코드 with Spring (6)
        • DDD 세레나데 (3)
        • 인프라 공방 (6)
        • 이규원의 현실 세상의 TDD (19)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (18)
        • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 (8)
        • 코딩으로 학습하는 GoF의 디자인 패턴 (1)
        • 스프링 시큐리티 완전정복 6.x (1)
      • 서적 (62)
        • 객체지향의 사실과 오해 (1)
        • 객체지향과 디자인패턴 (7)
        • 만들면서 배우는 클린 아키텍처 (3)
        • 테스트 주도 개발로 배우는 객체 지향 설계와 실천 (1)
        • 오브젝트: 코드로 이해하는 객체지향 설계 (17)
        • 리팩토링 : 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (0)
        • 토비의 스프링 (3)
        • 엔터프라이즈 애플리케이션 아키텍처 패턴 (9)
        • 개발자의 글쓰기 (1)
        • 소프트웨어 장인 (17)
        • Real MySQL 8.0 (2)
        • JVM 밑바닥까지 파헤치기 (0)
      • 개발 & 방법론 (29)
        • Java (13)
        • TDD (5)
        • ATDD (3)
        • DDD (6)
        • 인프라 (2)
        • SQL (0)
      • 개인이야기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 백엔드 로드맵
  • 인기 글

  • 태그

    테스트 주도 개발
    자바
    스프링
    ATDD
    스터디
    객체지향
    Test Driven Development
    김영한
    백기선
    DDD 세레나데
    마틴 파울러
    nextstep
    study
    TDD
    소프트웨어 장인
    java
    이규원
    Patterns of Enterprise Application Architecture
    현실세상의 TDD
    모든 개발자를 위한 HTTP 웹 기본 지식
    오브젝트
    추상화
    엔터프라이즈 애플리케이션 아키텍처 패턴
    인프런
    조영호
    넥스트스탭
    fastcampus
    인프라공방
    장인정신
    JUnit
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
loop-study
HTTP 메서드
상단으로

티스토리툴바