모든 웹, 앱 애플리케이션은 Web MVC 패턴을 통해 다양하게 개발되고 있으며 서비스 간 클라이언트와 서버의 통신은 모두 HTTP 통신을 통해 이루어지고 있습니다. MVC의 전체적인 구조를 파악하기 전, 클라이언트와 서버 간 통신에 사용되는 HTTP 주요 메서드에 대한 이해가 필요하기 때문에 포스팅으로 정리했습니다.
1. HTTP 메서드(HTTP Method)
1-1. HTTP 메서드의 정의
(1) HTTP 메서드란, 클라이언트와 서버 사이에 이루어지는 Request, Response 데이터를 전송하는 방식을 말합니다. 쉽게 풀어보면 서버에 존재하는 리소스(Resource)를 활용해 서버가 수행해야 할 동작을 지정하는 요청 방법을 의미합니다.
1-2. HTTP 주요 메서드
- 총 9가지의 HTTP 메서드가 존재하고, 주로 사용되는 HTTP 메서드로 아래와 같이 5가지가 있습니다.
(1) GET
- 리소스를 조회할 때 사용합니다.
(2) POST
- 클라이언트의 요청 데이터를 처리할 때 주로 사용되고 이를 통해 리소스를 등록할 때 사용합니다.
(3) PUT
- 리소스를 대체할 때(덮어쓰기) 사용하고, 만약 덮어쓸 리소스가 존재하지 않는다면 새로 생성합니다.
(4) PATCH
- 리소스를 일부 변경해야 할 때 사용합니다.
(PUT 메소드는 리소스 전체 변경, PATCH 메소드는 일부 변경입니다.)
(5) DELETE
- 리소스를 삭제할 때 사용합니다.
1-3. HTTP 기타 메서드
- 나머지 4가지의 HTTP 메서드입니다.
(1) HEAD
- GET 메서드와 동일하지만, HTTP Message Body 부분을 제외하고 Status line, Header만 반환하게 됩니다.
(2) OPTIONS
- 대상 리소스에 대한 통신 가능한 옵션(메서드)을 설명할 때 사용합니다.
(주로 CORS에서 사용)
(3) CONNECT
- 대상 리소스로 식별되는 서버에 대한 터널을 설정할 때 사용합니다.
(4) TRACE
- 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트(Message loopback test)를 수행할 때 사용합니다.
2. HTTP 메서드의 속성(Attribution)
2-1. 개요
- 각각의 HTTP 메서드는 용도와 특징이 모두 다르고 이러한 메서드의 속성은 각 메서드의 특징을 확인할 수 있는 지표로 볼 수 있습니다. 메서드의 속성으로는 아래와 같이 크게 5가지가 존재합니다.
(1) 안전(Safe methods)
(2) 멱등(Idempotent methods)
(3) 캐시 가능(Cacheable methods)
(4) 요청에 본문(Body) 존재
(5) 응답에 본문(Body) 존재
2-2. 안전(Safe)
(1) 안전(Safe)은 메서드를 호출하더라도 리소스를 변경하지 않는 메서드 속성을 의미합니다.
(2) 데이터의 변경이 일어나지 않는다는 뜻으로 GET 메서드가 단순히 데이터를 가져오거나 조회할 때 사용하게 되는데 이러한 GET 메서드를 안전(Safe)한 속성을 가진 메서드라고 합니다.
2-3. 멱등(Idempotent)
(1) 멱등성은 일반적으로 수학이나 전산학(CS, Computer Science)에서 연산에 대한 성질을 나타내는 용어로, 연산을 여러 번 해도 결과가 달라지지 않아야 하는 성질을 의미하고 있습니다. HTTP 메서드의 속성에도 이러한 성질을 대입해 볼 수 있습니다.
(2) HTTP 메서드에서의 멱등은 여러 번 메서드를 호출하더라도 최종적인 결과는 이전과 똑같은 성질을 나타냅니다. 데이터를 가져오거나 삭제, 완전히 대체하는 메서드들(GET, DELETE, PUT)은 여러 번 수행되더라도 결과적으로 데이터를 조회, 삭제, 대체한다는 결과적인 사실에는 변함이 없기 때문에 멱등한 메서드(Idempotent method)라고 할 수 있습니다.
(3) 그러나 POST의 경우 멱등하지 않은 메서드입니다. 이유는 예를 들어 고객에게 돈을 보내는 송금 기능을 구현할 때 POST 메서드를 사용했다고 가정해 보겠습니다. 해당 메서드를 2번 이상 호출했다면 작업이 2번 이상 발생하게 됩니다. 돈을 보내는 사람과 받는 사람에 대해 계좌에 보유한 돈의 금액이 송금을 할 때마다 계속 변화하기 때문에 기존 데이터는 계속 변화한다고 볼 수 있으므로 이에 따라 POST 메서드는 멱등하지 않은 메서드에 해당됩니다.
2-4. 캐시 가능(Cacheable)
(1) 응답 결과에 대한 리소스를 캐시해서 사용해도 되는지에 대한 속성입니다. GET, HEAD, POST, PATCH 메서드가 캐시 가능 속성을 가지는 메서드로, 일반적으로는 GET, HEAD 메서드 정도만 캐시로 쓰고 있습니다.
2-5. 요청 / 응답에 본문(Body) 존재
(1) 요청 또는 응답 시 데이터를 Message Body에 담아서 보내는지에 대한 속성입니다.
2-6. 각 메서드들에 대한 속성 지원 여부
- Wikipedia 공식 문서에서 지원하는 HTTP 메서드 속성 지원표입니다.
3. 주요 HTTP 메서드(GET) 내용 정리
3-1. GET
(1) 리소스를 조회할 때 사용하는 HTTP 메서드입니다.
(2) 서버에 전달하고 싶은 데이터가 있을 때 Query string을 통해 전달할 수 있습니다.
GET /members/100?username="wonjun"&age=26
(3) Query string 외에도 Message body를 통해 데이터를 보낼 수도 있지만 서버 자체에서 지원하지 않는 곳이 많아서 권장되지는 않습니다.
(4) 조회 시 POST 메서드를 사용할 수는 있지만 주로 캐싱이 가능한 GET 메서드를 사용합니다.
3-2. GET 메서드의 정적 데이터 조회 과정
(1) Query parameter 없이 리소스 경로로 단순히 조회 요청
(1-a) 아래와 같이 클라이언트에서 /members/100 경로로 데이터 조회를 GET 메서드로 요청합니다.
(1-b) 이에 따라 서버는 요청 메시지를 분석해 클라이언트에 요청에 따른 응답 데이터를 결과로 전송합니다.
- 서버에서는 요청을 성공적으로 처리하였기 때문에 200번 상태 응답 코드와 함께 요청에 대한 데이터를 전송하게 됩니다.
- 예시에서는 JSON 형태의 데이터를 주고받았지만 실제로는 HTML 파일이거나 이미지와 같은 멀티미디어 파일일 수 있습니다.
3-3. GET 메서드의 동적 데이터 조회 과정
(1) 주로 서비스 내에서 검색, 게시판 목록에서 필터링, 검색어로 이용됩니다.
(2) Query parameter(Query string)를 통해 데이터를 전달합니다.
(3) Query parameter의 경우 Key=Value의 구조를 갖게 됩니다.
- 요청 URL 뒤에 ?q=hello&hl=ko 형식의 Query parameter를 줘서 조회 데이터를 얻을 수 있습니다.
- 동적으로 Query parameter를 주게 되면 서버에서는 클라이언트의 요청이 정상적일 경우 Query parameter를 기반으로 필터링해서 응답 결과를 동적으로 생성한 후 클라이언트로 응답하게 됩니다.
3-4. GET 메서드의 HTML Form Data 조회 과정
(1) HTML 문서 내부의 자체 태그로 서버와 통신할 수 있는 조회 방법입니다.
(2) 해당 방식은 GET, POST 메서드에 대해서만 지원되는 방식입니다.
(3) 태그 내부에 지정한 GET 메서드의 동작에 따라 input 태그에 들어간 값들이 Query String 형태로 서버에 전달됩니다.
4. 주요 HTTP 메서드(POST) 내용 정리
4-1. POST
(1) POST 메서드는 전달한 데이터를 직접적으로 처리해야 할 때 사용합니다. (로그인, 회원가입, 주문 결제 등)
(2) HTTP Message body를 통해 서버로 데이터를 전달하면 서버는 요청에 맞게 데이터를 처리하여 업데이트합니다.
(3) 요청 당시 전달된 데이터는 주로 신규 리소스로 등록되거나 다른 비즈니스 로직 처리를 위한 데이터로 사용됩니다.
(4) 만약 데이터를 GET으로 조회하는데 있어서 JSON 형식을 사용해야 한다면 POST 메서드 사용을 고려해 볼 수 있습니다.
4-2. POST 메서드를 통한 JSON 데이터 전송
(1) 클라이언트는 메시지 바디에 아래와 같은 정보를 JSON 형태로 담고 서버에 요청을 보냅니다.
(2) 서버에서는 요청 메서드를 기반으로 로직대로 서버 자원에 클라이언트 요청 데이터를 저장하게 됩니다.
(데이터베이스 등에 데이터 적재)
(3) 이후 업데이트된 리소스 결과에 대한 데이터를 응답 메시지 바디에 담아서 클라이언트 측으로 전송합니다.
5. 주요 HTTP 메서드(PUT) 내용 정리
5-1. PUT
(1) 서버 자원의 리소스를 대체(수정, Update)할 수 있는 메서드입니다.
(2) 만일 클라이언트의 요청 메시지에 리소스가 존재하면 완전히 덮어쓰고 없다면 새로 생성합니다.
- PUT /members/100 : 해당 경로에 리소스가 존재하면 기존 것을 덮어쓰게 된다.
- PUT /members/100 : 해당 경로에 리소스가 없다면 새롭게 생성
(3) PUT 메서드는 기존 데이터를 대체하는 특성상 클라이언트에서 요청 메시지에 반드시 정확한 경로를 지정해야 합니다.
- POST /members의 경우 해당 경로에 새로운 데이터를 추가할 수 있음
- PUT은 /members로 적지 말고 /members/100과 같은 상세한 경로를 지정해야 함
(4) 완전히 덮어쓴다는 메서드의 특성상 일부 리소스 변경을 원하는 경우 PATCH 메서드를 사용해야 합니다.
5-2. PUT 요청에 대해 기존 리소스가 존재하는 경우
(1) 아래와 같은 경로에 존재하는 리소스를 대체하는 요청을 서버로 전송합니다.
(2) 아래와 같이 기존 데이터가 존재한다면 요청 당시 바디에 있던 데이터로 완전히 대체됩니다.
5-3. PUT 요청에 대해 기존 리소스가 존재하지 않는 경우
(1) 아래와 같은 경로에 대해 리소스를 대체하겠다는 요청을 서버로 전송합니다.
(2) 해당 경로로 기존 데이터가 없었기 때문에 요청 데이터를 기반으로 새로운 리소스가 생성됩니다.
6. 주요 HTTP 메서드(PATCH) 내용 정리
6-1. PATCH
(1) 리소스 일부를 변경(수정, Update)할 수 있는 메서드입니다.
(2) 서버에 따라 PATCH를 지원하지 않을 수 있으니 이때는 POST를 사용합니다.
6-2. 리소스의 일부를 변경하고자 하는 경우
(1) 아래와 같은 경로에 존재하는 age 값을 수정하고자 할 때 PATCH 메서드를 사용합니다.
(2) age 필드 데이터만 변경된 것을 확인할 수 있습니다.
7. 주요 HTTP 메서드(DELETE) 내용 정리
7-1. DELETE
(1) 리소스를 삭제할 수 있는 메서드입니다.
(2) HTTP State 응답 코드로는 200 또는 204번을 사용합니다.
7-2. 특정 자원의 리소스를 삭제하고자 하는 경우
(1) DELETE 메서드를 사용해 특정 경로의 리소스를 삭제할 수 있습니다.
(2) 서버의 요청을 받고 데이터베이스의 해당 리소스를 제거하게 됩니다.
8. Reference
※ 해당 포스팅은 InFlearn에서 김영한님의 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의를 듣고 공부한 내용을 정리하였습니다.
- URL : https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!
댓글