본문 바로가기

카테고리 없음

HTTP Method 및 상태 코드

1. HTTP Method

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 요청을 여러 번 보내더라도 서버의 상태가 변경 될수 있다. 따라서 멱등성을 보장하지 않는다.
※ 멱등성 : 동일한 연산에 대해 결과가 동일하게 유지되는 특성
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "Test",
  "email": "admin@example.com"
}​

'example.com' 도메인으로 '/users/' 엔드포인트에 json 형태의 데이터를 전송한다.
json 내부에는 name = Test, email = admin@example.com 이 있다.

1 - 3 PUT Method

클라이언트에서 서버로 데이터를 전송하여 리소스의 전체적인 업데이트를 하거나 생성을 위해 사용한다.
일반적으로 JSON 데이터를 HTTP 요청의 본문에 담아 서버로 전송하고 요청된 리소스의 모든 내용을 업데이트하거나 리소스를 생성하는 데 사용된다.
다음과 같은 특징이 있다.
- 전체 업데이트 : 전체 리소스를 업데이트하는 것을 의미한다. 요청 본문에는 업데이트할 리소스의 전체 내용을 포함해야 한다.
- 멱등성 보장 : PUT 요청은 동일한 요청을 보내더라도 동일한 상태를 유지한다.
PUT /users HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "Test",
  "email": "admin@example.com"
}​

'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 요청은 동일한 요청을 여러번 보내더라도 결과는 동일하게 유지된다.
- 명시적 : 수정 내용을 명시적으로 전달해야 요청의 복잡성이 증가 하지 않는다.
PATCH /users/userA HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "John Doe"
}​

'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
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
	implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
	runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
	runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
	implementation group: 'com.auth0', name: 'java-jwt', version: '4.0.0'​
#Application.properties

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=C##APITEST
spring.datasource.password=APITEST
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

mybatis.mapper-locations=mapper/*.xml
mybatis.type-aliases-package=com.newbie.training
mybatis.configuration.map-underscore-to-camel-case=true​

DTO Post 및 Controller class
Service와 Repository
테이블 스키마와 Mapper
응답 객체 와 메시지

/posts/{postNo} 를 통해 리소스를 요청하는 GET Method이다. postNo 파라미터를 사용하여 Service > Repository를 거쳐 데이터를 가져오며 데이터가 있을 경우와 없을 경우에 대해 반환한다.

결과

정상 응답

정상 요청에 대한 응답 200 코드로 요청 성공과 해당 값을 리턴한다.

요청에 필요한 파라미터 없음 / 400 Bad Request

요청에 대한 파라미터가 없는 경우 400 잘못된 요청을 리턴한다.

데이터 없음 404 Not Found

비정상 응답으로 응답 코드 404 요청한 리소스 없음을 리턴한다.

인증되지 않음 401 Unauthorized

인증되지 않은 경우 401 인증되지 않음 코드를 리턴한다.