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();
}
}
public class UserRequest {
private String name;
private String email;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserRequest{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
<GetMapping 방법>
1. @GetMapping 어노테이션으로 내부에 path를 지정해서 명확하게 경로를 지정
2. @RequestMapping 어노테이션으로 내부에 value로 경로를 지정하고 method로 RequestMethod.GET을 지정해준다.
@PathVariable 어노테이션을 사용할때는 @GetMapping 어노테이션 내부 { }값과 , @PathVariable 어노테이션 내부 " " 값이 같아야한다.
<parameter 받는 방법>
1. @RequestParam 어노테이션 및 Map< > 을 사용해서 한번에 받기
2. @RequestParam 어노테이션만 사용해서 명시적으로 변수들을 각각 받기
3. dto클래스를 만들어서 dto 내의 변수와 mapping하기
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;
}
}
public class PutRequestDto {
private String name;
private int age;
@JsonProperty("car_list")
private List<CarDto> carList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<CarDto> getCarList() {
return carList;
}
public void setCarList(List<CarDto> carList) {
this.carList = carList;
}
@Override
public String toString() {
return "PutRequestDto{" +
"name='" + name + '\'' +
", age=" + age +
", carList=" + carList +
'}';
}
}
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class CarDto {
private String carName;
private String carNumber;
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public String getCarNumber() {
return carNumber;
}
public void setCarNumber(String carNumber) {
this.carNumber = carNumber;
}
@Override
public String toString() {
return "CarDto{" +
"carName='" + carName + '\'' +
", carNumber='" + carNumber + '\'' +
'}';
}
}
반환타입을 dto클래스로 하고 실제 값을 입력했을때 body에 출력되는 값을 확인.
자바의 클래스나 변수는 기본적으로 카멜케이스(첫단어의 시작 소문자, 이후 단어의 시작 대문자)이다. ex) carList
View단에서 카멜케이스가 아닌 스네이크케이스(언더바 _ 사용)로 표현하려면
1. 한가지 변수에 대해서 @JsonProperty 어노테이션을 사용하여 getter/setter 변수를 멤버변수와 다르게 사용.
2. 클래스 위에 적용하는 @JsonNaming 어노테이션을 사용하여 클래스 내의 모든 변수를 일괄적으로 적용해서 사용.
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 웹개발마스터 강의