REST API 설계를 위한 항목에서 Resource에 대한 행위는 HTTP Method로 표현되어야 한다.
코드를 통해서 각 HTTP Method를 테스트했다.
종류 | 역할 |
---|---|
POST (C) | Resource 생성. DataBody 포함가능 |
GET (R) | Resource를 조회하고 Document에 대한 정보를 가져온다. DataBody 포함안됨 |
PUT (U) | Resource가 없으면 생성. Resource가 있으면 기존것을 수정. DataBody 포함가능 |
DELETE (D) | Resource 삭제. DataBody 포함안됨 |
1) GET 방식
@RestController
@RequestMapping("/api/get")
public class GetApiController {
@GetMapping(path = "get-mapping-path")
public String getHello() {
return "GetMapping path";
}
@RequestMapping(value = "/get-request-mapping", method = RequestMethod.GET)
public String hi() {
return "RequestMapping Get";
}
@GetMapping(path = "path-variable/{id}")
public String pathVariable(@PathVariable(name = "id") String pathName) {
System.out.println("PathVariable : " + pathName);
return pathName;
}
@GetMapping(path = "query-param")
public String queryParam(@RequestParam Map<String, String> queryParam) {
StringBuilder sb = new StringBuilder();
queryParam.entrySet().forEach( entry -> {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
System.out.println("\n");
sb.append(entry.getKey() + " = " + entry.getValue() + "\n");
});
return sb.toString();
}
@GetMapping(path = "query-param-2")
public String queryParam2(@RequestParam String name,
@RequestParam String email,
@RequestParam int age) {
System.out.println(name);
System.out.println(email);
System.out.println(age);
return name + " " + email + " " + age;
}
@GetMapping(path = "query-param-3")
public String queryParam3(UserRequest userRequest) {
System.out.println(userRequest.getName());
System.out.println(userRequest.getEmail());
System.out.println(userRequest.getAge());
return userRequest.toString();
}
}
@Data
public class UserRequest {
private String name;
private String email;
private int age;
}
@PathVariable 어노테이션을 사용할때는 @GetMapping 어노테이션 내부 { }값과 , @PathVariable 어노테이션 내부 " " 값이 같아야한다.
2) POST 방식
@RestController
@RequestMapping("/api/post")
public class PostApiController {
@PostMapping(path = "post")
public void post(@RequestBody Map<String, Object> requestData) {
requestData.entrySet().forEach(stringObjectEntry -> {
System.out.println("key : " + stringObjectEntry.getKey());
System.out.println("value : " + stringObjectEntry.getValue());
});
}
@PostMapping(path = "post-dto")
public void post(@RequestBody PostRequestDto postRequestDto) {
System.out.println(postRequestDto);
}
}
클라이언트와 서버가 통신할때 본문(body)에 담는 데이터 형식은 JSON 형식이므로
parameter에 @RequestBody 어노테이션을 붙여서 http request의 본문(body)을 그대로 전달한다.
3) PUT 방식
@RestController
@RequestMapping("/api/put")
public class PutApiController {
@PutMapping(path = "put")
public PutRequestDto put(@RequestBody PutRequestDto putRequestDto) {
System.out.println(putRequestDto);
return putRequestDto;
}
@PutMapping(path = "path-variable/{userId}")
public PutRequestDto pathVariable(@RequestBody PutRequestDto putRequestDto,
@PathVariable(name = "userId") Long id) {
System.out.println("id : " + id);
return putRequestDto;
}
}
@Data
public class PutRequestDto {
private String name;
private int age;
@JsonProperty("car_list")
private List<CarDto> carList;
}
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class CarDto {
private String carName;
private String carNumber;
}
반환타입을 dto클래스로 하고 실제 값을 입력했을때 body에 출력되는 값을 확인.
자바의 클래스나 변수는 기본적으로 카멜케이스(첫단어의 시작 소문자, 이후 단어의 시작 대문자)이다. ex) carList
View단에서 카멜케이스가 아닌 스네이크케이스(언더바 _ 사용)로 표현하려면
4) DELETE 방식
@RestController
@RequestMapping("/api/delete")
public class DeleteApiController {
@DeleteMapping(path = "delete/{userId}")
public void delete(@PathVariable String userId, @RequestParam String account) {
System.out.println(userId);
System.out.println(account);
}
}
body에는 아무런 정보가 없으므로 @PathVariable 어노테이션만을 사용해서 특정 userId를 삭제했다.
출처
- 패스트캠퍼스 내의 Spring 웹개발마스터 강의