HTTP에는 다양한 Method가 있다. 서버에 요청을 보낼때 어떠한 동작을 수행할지 나타내는데, 일반적으로 사용되는 메서드는 GET, POST, PUT, DELETE, PATCH 등이 있다.
1 - 1 GET Method
서버로부터 리소스(데이터)를 요청하는 데 사용된다. 주로 데이터의 조회, 검색과 같은 읽기 작업에 활용된다. 데이터를 URL의 쿼리 스트링의 형태로 전달하며 '?'로 시작하고 'key=value' 형태로 데이터를 전달한다. 데이터의 구분에는 '&'를 사용한다. URL로 전달하기 때문에 데이터 전송에는 데이터 크기에 제한이 있다. 다음과 같은 특징이 있다. - 캐시 가능 : 동일한 URL 요청에 대해 서버의 응답을 임시저장(캐시) 하여 재사용할 수 있다. 이는 네트워크 트래픽 을 줄이고 응답 속도를 향상 시킨다. - 북마크 기능 : URL에 요청 데이터가 포함되므로 해당 URL을 북마크 하여 동일한 데이터를 다시 조회할 수 있다. - 히스토리 기능 : 브라우저의 히스토리로 기록되므로 사용자가 이전 페이지로 되돌아갈 수 있다.
GET /users?id=test&name=admin HTTP/1.1
Host: example.com
'example.com' 도메인으로 '/users' 엔드포인트에 'id=test', 'name=admin' 데이터를 전달하며 요청한다.
1 - 2 POST Method
클라이언트에서 서버로 데이터를 전송하여 리소스를 생성할때 사용한다. 데이터를 HTTP 요청의 본문에 담아 서버로 전송한다. 일반적으로 HTML form을 사용하거나 JSON 형태로 전송한다. 다음과 같은 특징이 있다. - 데이터의 은닉 : 데이터를 HTTP 요청 본문에 담아 전송하기 때문에 GET과 다르게 URL에 데이터가 노출되지 않는다. - 전송 제한 : HTTP 요청 본문에 담아 전송하기 때문에 데이터 길이에 제한이 없다. 이를 통해 대용량 데이터 전송이 가능하다. - 멱등성을 보장하지 않음 : 서버의 상태를 변경할 수 있으므로 동일한 POST 요청을 여러 번 보내더라도 서버의 상태가 변경 될수 있다. 따라서 멱등성을 보장하지 않는다. ※ 멱등성 : 동일한 연산에 대해 결과가 동일하게 유지되는 특성
'example.com' 도메인으로 '/users/' 엔드포인트에 json 형태의 데이터를 전송한다. json 내부에는 name = Test, email = admin@example.com 이 있다.
1 - 3 PUT Method
클라이언트에서 서버로 데이터를 전송하여 리소스의 전체적인 업데이트를 하거나 생성을 위해 사용한다. 일반적으로 JSON 데이터를 HTTP 요청의 본문에 담아 서버로 전송하고 요청된 리소스의 모든 내용을 업데이트하거나 리소스를 생성하는 데 사용된다. 다음과 같은 특징이 있다. - 전체 업데이트 : 전체 리소스를 업데이트하는 것을 의미한다. 요청 본문에는 업데이트할 리소스의 전체 내용을 포함해야 한다. - 멱등성 보장 : PUT 요청은 동일한 요청을 보내더라도 동일한 상태를 유지한다.
'example.com' 도메인으로 '/users' 엔드포인트에 json 형태로 데이터를 전송한다. json 내부에는 name = Test, email = admin@example.com 이 있고 업데이트 대상 리소스가 있을경우 업데이트를 하고 없을 경우 생성을 한다.
1 - 4 DELETE Method
클라이언트에서 서버로 리소스의 삭제를 요청할 때 사용한다. 일반적으로 URL을 통해 서버로 요청을 전송하여 리소스 삭제를 요청한다. 다음과 같은 특징이 있다. - 리소스 삭제 : URL을 통해 서버에게 특정 리소스 삭제를 요청한다. 서버에 존재하는 경우 해당 리소스를 삭제한다. - 멱등성 보장 : 동일한 요청을 보내더라도 동일한 상태를 유지한다.
DELETE users/userA HTTP/1.1
Host: example.com
'example.com' 도메인으로 '/users' 엔드포인트의 'userA' 의 리소스를 삭제하는 DELETE 요청이다. URL로 요청하기 때문에 요청에 대한 인가와 접근 제어, 요청에 대한 유효성 검증을 철저히 해야한다.
1 - 5 PATCH Method
클라이언트에서 서버로 리소스의 일부를 업데이트 하거나 수정하는 요청에 사용한다. 일반적으로 JSON 형태의 데이터를 서버로 전송하며 서버에서는 리소스의 일부를 업데이트하거나 수정한다. 다음과 같은 특징이 있다. - 리소스의 부분 수정 : 리소스의 일부분을 수정할때 사용한다. - 유연성과 효율성 : PUT에 비해 리소스의 일부분만 수정하기 때문에 네트워크 대역폭 및 DB 처리에 효율적이다. - 멱등성 : PATCH 요청은 동일한 요청을 여러번 보내더라도 결과는 동일하게 유지된다. - 명시적 : 수정 내용을 명시적으로 전달해야 요청의 복잡성이 증가 하지 않는다.
'example.com' 도메인으로 '/users' 엔드포인트의 'userA' 의 리소스를 일부 업데이트하는 요청이다. JSON을 사용해 name을 John Doe로 업데이트 한다.
2. HTTP 상태코드
HTTP 상태 코드는 서버가 클라이언트에게 응답할 때 응답의 상태를 나타낸다. 상태 코드는 3자리 숫자로 구성되며, 다양한 상태를 나타낸다. 다음과 같은 범주로 분류된다. - 1xx : 정보성 응답. 요청이 수용되고 처리가 진행 중 임을 나타낸다. - 2xx : 성공적 응답. 요청이 성공적으로 처리되었음을 나타낸다. - 3xx : 리다이렌션 응답. 요청에 대한 추가 동작을 수행하기위해 요청을 다른 위치로 리다이렉션해야 함을 나타냄 - 4xx : 클라이언트 오류. 클라이언트의 요청이 잘못되었거나 처리할 수 없음을 나타냄 - 5xx : 서버 오류. 서버가 유요한 요청을 처리 하지 못함을 나타냄
2 - 1) 200 OK
가장 많이 사용되는 상태 코드, 요청이 성공했음을 의미한다.
ex) 로그인 성공시, 게시글 조회 요청에 성공시
2 - 2) 201 Created
리소스 생성을 요청했을때 성공적으로 완료한 경우 사용한다. 일반적으로 POST 에서 사용된다.
ex) 회원가입 성공, 글 작성 성공
2 - 3) 400 Bad Request
쿼리 스트링 또는 Request Body 로 전달된 데이터의 형식이 올바르지 않거나 서버측에서 필수로 요구하는 데이터가 누락되었을때 사용된다.
ex) validation을 사용하여 필수로 요구하는 파라미터가 누락된 경우
2 - 4) 401 Unauthorized
클라이언트가 서버가 요구한 인증 정보를 가지고 있지 않거나 유효하지 않을때 사용된다.
ex) 로그인을 하지 않고 유저 정보 수정 또는 삭제를 요청하는 경우
2 - 5) 403 Forbidden
클라이언트가 요청한 리소스에 대해 접근 권한이 없을 경우
ex) 일반 유저 권한으로 관리자 권한의 리소스를 요청
2 - 6) 404 Not Found
클라이언트가 요청한 리소스를 서버에서 찾을 수 없을 경우
ex) 존재하지 않는 글에 대한 조회 요청
2 - 7) 405 Method Not Allowed
서버에서 특정 리소스에 관한 특정 Method를 제한하고 싶을 경우 사용한다. 즉 서버에서 해당 Method의 처리를 할 수 없음을 나타냄
ex) 특정 리소스에 대해 수정/삭제를 제한하고 조회만 허용하는 경우
2 - 8) 409 Conflict
요청이 서버의 상태와 충돌될 경우 사용한다. 서버의 상태를 변경하는 요청이 동일하게 발생할 경우
ex) 회원가입의 중복 요청
2 - 9) 413 Payload Too Large
클라이언트에서 서버로 요청한 요청 본문(Request Body)의 데이터 크기가 서버에서 처리할 수 있는 크기를 초과했을때 나타낸다.
ex) 전달받은 파일의 크기가 정의한 값보다 클 경우
2 - 10) 500 Bad Gateway
클라이언트가 요청한 서버로의 연결에서 장애가 발생하여 유효 하지 않은 응답을 반환했때 사용된다. 서버로 요청을 보냈으나 서버의 네트워크 문제나 서버로부터 받은 응답이 유효하지 않을 경우 발생할 수 있다.
ex) 올바른 요청에 대해 DB오류로 인한 리소스 접근 불가, 예외처리 하지 않은 오류 발생
3. GET Method를 사용한 API 및 응답 코드 구현
간단한 예제를 통해 HTTP 상태코드를 반환하고 예제를 작성해 본다. 환경설정 start.spring.io Framework : SpringBoot 2.7.12 | JDK : JAVA 11 | IDE : IntelliJ | DB : OracleDB | build Tool : Gradle