우리는 REST API를 통해 CRUD를 구현할 수 있다.
CRUD는 Create, Read, Update, Delete이고 각각 http method에서 POST, GET, PUT, DELETE에 대응된다.
리소스를 생성하는데 GET을 써서 구현해도 동작이야 하겠지만 이것 또한 개발자들간의 합의(?)같은 것이기 때문에 일치시키는게 좋다.
HTTP Method
지난시간에 GetMapping을 통해 GET을 구현했다.
{method}Mapping어노테이션을 사용하면 해당하는 메소드를 구현할 수 있다.
// controller/ApiController.java
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String getMethod() {
return "GET";
}
@PostMapping("/api/hello")
public String postMethod() {
return "POST";
}
@PutMapping("/api/hello")
public String putMethod() {
return "PUT";
}
@DeleteMapping("/api/hello")
public String deleteMethod() {
return "DELETE";
}
}
이렇게 각각의 메소드에 대해 호출해보면 해당하는 값이 리턴되는 것을 확인할 수 있다.
여기서 서로 다른 메소드라면 uri가 같아도 된다는 점이다.
같은 메소드, 같은 uri인데 함수가 여러개 있다면 정상적인 실행이 안될 것이다.
RequestMapping
위의 uri에서 /api라는 주소가 계속 겹친다.
RequestMapping을 사용하면 한번에 관리할 수 있다.
// controller/ApiController.java
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/hello")
public String getMethod() {
return "GET";
}
@PostMapping("/hello")
public String postMethod() {
return "POST";
}
@PutMapping("/hello")
public String putMethod() {
return "PUT";
}
@DeleteMapping("/hello")
public String deleteMethod() {
return "DELETE";
}
}
이렇게 하면 /api를 /api2로 바꿀 때 한군데만 바꾸면 된다.
RequestMapping에 들어갈 주소를 컨트롤러 명으로 하면 깔끔할 것 같다.
Query Parameter
우리는 보통 정보를 얻을 때 모든 정보를 얻기도 하지만 특정 조건을 만족하는 정보를 얻을 때가 많다.
예를들면 아이디가 A인 유저의 정보를 얻는 경우가 있을 것이다.
이를 위해 Query Parameter를 사용한다.
여기에는 두가지 방법이 있다.
1) 쿼리스트링(/api/hello?name=abc)
함수 인자에 RequestParam 어노테이션을 사용한다.
// controller/ApiController.java
@GetMapping("/hello")
public String getMethod(@RequestParam String name) {
return "GET : " + name;
}
2) REST(/api/hello/abc)
함수 인자에 PathVariable 어노테이션을 사용한다.
// controller/ApiController.java
@GetMapping("/hello/{name}")
public String getMethod(@PathVariable String name) {
return "GET : " + name;
}
PathVariable이 있는 변수명과 uri의 변수명이 일치해야 한다.
두개를 동시에 쓸 수 있다.
// controller/ApiController
@GetMapping("/hello/{name}")
public String getMethod(@PathVariable String name, @RequestParam Long id) {
return "GET : " + name + ", id : " + id;
}
RequestBody
GET이나 DELETE는 위와 같은 방법을 사용해도 되지만 POST와 PUT은 실제로 정보를 생성하고 수정하기 때문에 uri에 직접 노출되면 안된다.
그래서 사용하는 것이 RequestBody이다.
// controller/ApiController.java
@PostMapping("/hello")
public String postMethod(@RequestBody String name) {
return "POST : " + name;
}
데이터가 RequestBody를 통해 정상적으로 전달되었다.
지금까지 RequestBody나 Response가 String인 경우만 다루었다.
하지만 실제 데이터는 훨씬 복잡한 구조를 가지고 있는 경우도 있다.
그러한 경우에는 String대신에 Object(class)를 사용해야 한다.
다음시간에 이러한 경우를 처리하는 방법에 대해 알아볼 것이다.
'프로그래밍 > 스프링' 카테고리의 다른 글
[스프링] 6. 테스트코드 작성 (0) | 2022.08.02 |
---|---|
[스프링] 5. Lombok (0) | 2022.07.22 |
[스프링] 4. Object Mapper (0) | 2022.07.18 |
[스프링] 2. 첫 api 만들기 (0) | 2022.07.15 |
[스프링] 1. 스프링 시작하기 (0) | 2022.07.12 |