HTTP Method의 PUT vs PATCH
Rest API
URI라는 자원을 통해서 HTTP METHOD(GET, POST, PUT, DELETE...)를 사용하여 데이터를 얻고, 변경하고 삭제하는 등의 행위
URI와 URL
URI - 특정 리소스를 식별; 통합 자원 식별자(Uniform Resource Identifier)
URL - 웹 주소. 네트워크 상 리소스가 어디 있는지 알려주기 위한 규약. URI의 서브셋
URI는 식별하고 URL은 위치를 가리킨다.
멱등(Idempotent)
여러 번 실행해도 한 번 실행한 것과 동일한 성질
HTTP 메서드 중, GET, PUT, DELETE는 Idempotent하지만 POST는 Idempotent하지 않다.
PUT vs PATCH
PUT
리소스를 생성 / 업데이트하기 위해 서버로 데이터를 보내는 데 사용
동일한 PUT 요청을 여러 번 호출하면 항상 동일한 결과가 생성
e.g.
PUT/user/1
body : {date : "update example"}
Content-Type : "application/json"
데이터를 수정하는 것이기 때문에 요청 시에 Body 값과 Content-Type 값을 작성해야 한다.
해당 예시는 JSON을 통해서 작성된 예시이다.
URL을 통해서 어떠한 데이터를 수정할지 파라미터를 받는다. 그리고 수정할 데이터 값을 Body 값을 통해서 받는다.
데이터 조회에 성공한다면 Body 값에 저장한 데이터 값을 저장하여 성공 응답을 보낸다.
UPDATE는 뭘 사용해야 할까?
PUT : 리소스의 전체를 변경할 때 사용 (partial modifications), 변경하는 데이터만 요청하면 된다. (멱등성 o)
PATCH : 리소스의 부분을 변경할 때 사용, 변경하지 않는 데이터도 함께 전송해야 한다. (멱등성 x)
리소스의 부분 수정인 PATCH 혹은 POST를 사용하면 된다.
→ 뭘 사용할지 모르겠다면 POST를 사용하면 된다. POST가 가장 REST 스타일을 잘 따르는 것이다.
HTTP의 PUT 메서드 정의
없다면 생성하고 있으면 교체한다.
The PUT method requests that the state of the target resource be
created or replaced with the state defined by the representation
enclosed in the request message payload(= Request Body).
Spring Boot를 사용한 REST API
@RequestMapping을 사용하여 모든 HTTP 메서드를 처리하던 이전 방식과는 다르게
최신 방식은 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 등을 사용한다.
URI 엔드포인트는 동일하게 사용하되, 어노테이션만 다르게 설정하여 REST API를 처리한다.
또한 메소드 이름 또한 readPerson, deletePerson과 같이 명확하게 사용하면 REST 스타일에 가깝게 코딩할 수 있다.
엔드포인트?
→ 메서드가 같은 URL들에 대해서도 다른 요청을 하게끔 구별하게 해주는 항목
API가 서버에서 리소스에 접근할 수 있도록 하게 하는 URL
@RestController // Rest API를 처리하는 Controller
@RequiredArgsConstructor
@RequestMapping("/api")
public class PersonController {
private final PersonService personService;
// POST
@PostMapping(value = "/person", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
public Person createPerson(@RequestBody Person person){
Person createdPerson = personService.createPerson(person);
return createdPerson;
}
// GET
@GetMapping("/person/{name}")
public Person readPerson(@PathVariable("name") String name) {
Person readOnePerson = personService.readOnePerson(name);
return readOnePerson;
}
// 전체를 받아올 때 -> URI에 s 붙여 사용
@GetMapping("/persons")
public List<Person> readPersons() {
List<Person> readAllPerson = personService.readAllPerson();
return readAllPerson;
}
// DELETE
@DeleteMapping("/person/{id}")
public String deletePerson(@PathVariable("id") Long id) {
int row = personService.deletePerson(id);
return row + "개의 id가 삭제되었습니다.";
}
// PATCH (Partial Modify; 부분 수정)
@PatchMapping("/person")
public Person patchPerson(@RequestParam("column") String column, @RequestParam("tobe") String tobe, @RequestParam("id") Long id) {
Person modifiedPerson = personService.patchPersonCompany(column, tobe, id);
return modifiedPerson;
}
// PUT (create and replace; 전체 수정)
@PutMapping("/person")
public Person putPerson(@RequestBody Person person) {
Person putPerson = personService.putPerson(person);
return putPerson;
}
}
POST vs PUT
POST : 새로운 데이터를 계속 생성하기 때문에 요청 시마다 데이터를 생성
PUT : 사용자가 데이터를 지정하고 수정하는 것이기 때문에 같은 요청을 계속하더라도 데이터가 계속 생성되지는 않는다.