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

[모든 개발자를 위한 HTTP 웹 기본 지식] 04. HTTP 메서드 - GET, POST

HSY_mumu 2022. 5. 29. 23:35
728x90

(인프런) 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 리뷰한 글입니다.

2. GET, POST

HTTP 메서드클라이언트가 서버에 무언가를 요청할 때 기대하는 행위이다.

최근에는 리소스라는 단어대신 representation 을 사용하는데, 아직 설명전이니 representation 대신 리소스를 사용하도록 하겠다.

 

<HTTP 주요 메서드 종류>
1) GET: 리소스 조회

2) POST: 요청 데이터 처리(주로 등록에 사용)

3) PUT: 리소스를 대체, 해당 리소스가 없으면 생성(파일을 폴더에 넣는 것과 비슷)

4) PATCH: 리소스 부분 변경(e.g 회원의 이름 변경)

5) DELETE: 리소스 삭제

 

<HTTP 기타 메서드 종류>

1) HEAD: GET과 동일하지만 메시시 부분(message body)을 제외하고, 상태 줄(status-line)과 헤더만 반환

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

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

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

(참고) CONNECT, TRACE는 거의 사용하지 않음

 

1. GET

리소스 조회

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

- 메시지 바디를 사용해 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아 권장X

 

2. GET 과정

1) 리소스 조회1 - 메시지 전달

클라이언트가 members/100 유저를 조회하기 위해 GET 방식으로 HTTP 요청 메시지를 서버에 전달한다.

 

2) 리소스 조회2 - 서버 도착

서버에 GET 메시지가 도착하면 서버는 GET 메시지를 해석하여 DB에서 /members/100 유저를 조회하여 JSON 메시지를 만든다.

 

3) 리소스 조회3 - 응답 데이터

서버는 리소스 조회에 성공했다는 의미로

status-line에 200 OK,

header에 Content-Type,

message-body에 /members/100을 조회한 결과(JSON)을 붙여 HTTP 응답 메시지를 만든다.

 

3. POST

요청 데이터 처리

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

- 서버는 요청 데이터를 처리(메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능 수행)

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

 

4. POST 과정

1) 리소스 조회1 - 메시지 전달

클라이언트가 유저를 등록하기 위해  message-body에 유저 데이터를 담아서 POST 방식으로 HTTP 요청 메시지를 서버에 전달한다.

(POST로 /members에 요청이 들어오면 서버는 데이터를 저장한다는 것을 미리 약속해놓는다)

 

2) 리소스 조회2 - 서버 도착

서버에 POST 메시지가 도착하면 서버는 POST 메시지를 해석하여 DB에 데이터를 등록하고 신규 리소스 식별자를 생성한다.

 

3) 리소스 조회3 - 응답 데이터

서버는 데이터 등록을 성공했다는 의미로

status-line에 201 Created,

header에 Location: 리소스가 생성된 신규 URI 경로(/members/100),

message-body에 등록된 리소스(JSON)을 붙여 HTTP 응답 메시지를 만든다.

 

5. POST는 요청 데이터를 어떻게 처리한다는 뜻일까? (예시)

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

 

<POST가 사용되는 곳>

1) HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공

- HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용

2) 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시

- 게시판 글쓰기, 댓글 달기

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

- 신규 주문 생성

4) 기존 자원에 데이터 추가

- 한 문서 끝에 내용 추가하기

 

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

 

<POST 정리>

1) 새 리소스 생성(등록)

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

- 주로 이 목적으로 많이 사용

2) 요청 데이터 처리 (중요!)

- 단순히 데이터를 생성, 변경하는 것을 넘어서 프로세스를 처리해야하는 경우

e.g. 주문에서 결제 완료 → 배달시작 → 배달완료 처럼 단순히 값 변경을 넘어 프로세스 상태가 변경되는 경우

- POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음

(참고) 기본적으로 리소스만을 가지고 URI를 설계하는 것이 이상적이지만, 어쩔 수 없는 경우 컨트롤 URI로 설계한다. (start-delivery 처럼 동사가 어쩔 수 없이 들어갈 수 있음)

e.g. POST/orders/{orderId}/start-delivery (컨트롤 URI)

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

e.g. JSON으로 조회 데이터를 넘겨야하는데, GET 메서드를 사용하기 어려운 경우 POST의 message-body에 조회 데이터를 넘긴다.

 

데이터를 조회할 때는 최대한 GET을 쓰고 그 외에 데이터가 변경되거나 프로세스가 진행되거나 정말 어쩔 수 없는 경우, POST를 쓴다!!


4-1. GET, POST 질문 정리

Q. /orders/{orderId}/start-delivery 는 배달 상태 변경의 의미에서 POST가 아닌 PATCH를 사용해야하는 거 아닌가?

배달 상태를 변경한다는 것은 단순히 해당 리소스의 값을 변경하는 정도로 끝나는 것이 아니라, 내부에서 매우 큰 프로세스가 실행된다.

이렇게 해당 리소스만 변경하는 것이 아니라 내부 프로세스를 실행해야할 때PATCH보다 POST를 사용하는 것이 좋다. 단순히 회원 정보를 변경하는 것처럼 특정 리소스의 데이터를 변경할 때PATCH를 사용하는 것이 좋다.

(참고)

[출처] https://www.inflearn.com/questions/110170

 

Q. GET 메서드를 사용해 복수 개의 리소스를 조회할 때, URI를 어떤식으로 설계하는 것이 좋을까?

예를 들어, id가 3, 4, 5인 회원을 조회하고 싶다면

path를 사용하기보다는 query string을 사용하는 것이 더 좋다.

[출처] https://www.inflearn.com/questions/212054

 

 

 

728x90