개념
HTTP(HyperText Transfer Protocol) method는 요청과 응답 과정에서 resource(자원)를 전달해 주는 URI와 함께 행위를 전달하는 역할을 한다. 클라이언트 / 서버, 서버 / 서버 간 전송에서 이용한다. HTTP 메시지를 통해 HTML파일, 텍스트파일, 영상파일 등 대부분 형태의 데이터를 전송 가능하다.
HTTP 메소드는 @RequestMapping, @메소드명Mapping 등을 통해 handler method와 URL 주소를 매핑한다. 클라이언트가 특정 URL을 입력하면 HTTP 메소드를 통해 해당 URL에 매핑된 handler method가 호출되어 요청을 전달하고, 응답을 되돌려 줄 view의 이름을 지정한다. 응답을 view에서 html파일 등의 방식으로 시각화한 뒤, 다시 HTTP 메소드를 통해 클라이언트에게 전송한다. 시각화 과정은 spring framework의 Thymeleaf와 같은 템플릿 엔진의 도움을 받을 수 있다.
종류
GET
GET 메소드는 주로 리소스를 조회하기 위해 사용된다. body가 아닌 query string을 통해 메시지를 전달한다. query string은 ?key=value의 형식으로, &를 통해 여러 value를 묶을 수 있다. mapping annotation은 @GetMapping이다.
리소스를 변경하지 않으므로 안전하다는 장점이 있으나, 많은 양의 데이터를 보내기에 적합하지 않다.
query string은 URL에 포함되기 때문에 즐겨찾기에 추가할 수 있다는 장점도 있다. 반대로 개인정보나 보안이 필요한 내용은 query string에 담기 적합하지 않다.
POST
POST는 단순한 등록, 조회, 수정, 삭제(CRUD)를 넘어 보다 복잡한 프로세스를 수행하거나 대량의 데이터를 전송해야 할 때 사용된다. 주로 리소스 등록 과정에서 많이 이용하게 된다. mapping annotation은 @PostMapping이다.
POST 메소드는 query string이 아닌 request body에 프로세스를 담아 전달한다. 또한 URL에 표시되지 않으므로 개인정보를 등록하기에 적합하며, 많은 양의 값을 보낼 수 있다.
POST 메소드는 프로세스를 담고 있기 때문에, 응답이 느리다고 해서 여러 번 요청 시 중복 처리될 수 있으므로 주의해야 한다. 게시글을 여러 번 올리면 게시글이 여러 번 등록되는 것을 예로 들 수 있다.
아래의 PUT 메소드도 리소스를 등록할 수 있지만, 실무에서는 대부분 POST 메소드를 사용한다.
PUT
PUT 메소드는 리소스를 생성하거나 새로운 리소스로 대체하기 위해 사용된다. mapping annotation은 @PutMapping이다.
POST 메소드와 달리 클라이언트가 리소스의 구체적인 전체 경로를 인지하고 있어야 하며, 리소스가 갱신될 URI(URL + URN)를 직접 지정한다. 이후 서버가 아닌 클라이언트가 직접 리소스를 관리한다.
기존 리소스를 덮어 씌우기 때문에 리소스의 부분 수정에는 적합하지 않다. 부분 수정을 위해서는 아래의 PATCH 메소드를 이용하는 것이 좋다.
PATCH
PATCH 메소드는 리소스의 특정 field만 변경하기 위해 사용된다. mapping annotation은 @PatchMapping이다.
PUT 메소드는 리소스 전체를 덮어 씌우므로, 일반적으로 수정에 쓰기 쉽지 않다. 따라서 실무에서는 수정에 PUT 메소드를 주로 사용한다.
DELETE
DELETE 메소드는 리소스를 삭제하기 위해 사용된다. mapping annotation은 @DeleteMapping이다.
HEAD
GET과 기본적으로는 동일하나, 메시지 없이 상태 줄과 헤더만 반환한다.
OPTIONS
OPTIONS 메소드는 대상 리소스에 대한 통신 가능 메소드를 설명해 준다.
CONNECT
CONNECT 메소드는 대상 자원으로 식별되는 서버에 대한 터널을 설정한다.
TRACE
TRACE 메소드는 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행한다.
'Development > Spring' 카테고리의 다른 글
REST API 특징 정리(https://restfulapi.net 참고) (0) | 2023.04.12 |
---|---|
spring framework에서 사용하는 주요 annotation 정리 (0) | 2023.04.11 |
DDD 기반의 AOP에서 비즈니스 로직이 가지는 의미 (0) | 2023.04.07 |
DDD에서 Controller, Service, Repository의 역할 (0) | 2023.04.07 |
DDD(Domain Driven Design)에서 Entity, DTO, VO 비교 (0) | 2023.04.05 |