0. HTTP Method
각 HTTP Method가 하는 역할과 요청을 할 때 필요한 정보는 다음과 같습니다.
CRUD | 멱등성 | 안정성 | Path Variable | Query Parameter | DataBody | |
GET | R (리소스 취득) | O | O | O | O | X |
POST | C (리소스 생성, 추가) | X | X | O | △ | O |
PUT | C/U(리소스 갱신, 생성) | O | X | O | △ | O |
DELETE | D(리소스 삭제) | O | X | O | O | X |
1. GET 요청
1-1. GET 요청 받아서 String 리턴하기
스프링에서는 @RestController
를 지원합니다. @RestController
는 스프링 프레임워크 4점대 버전 이상부터 사용가능하고 @Controller
와 @ResponseBody
가 결합된 어노테이션입니다. 즉, 컨트롤러 클래스 하위 메서드에 @ResponseBody
어노테이션을 붙이지 않아도 문자열과 JSON을 전송할 수 있습니다.(객체를 리턴하면 자동으로 형변환을 하여 JSON으로 리턴해줍니다.)
그리고 @GetMapping
은 @RequestMapping
어노테이션에 method
속성을 RequestMethod.GET
으로 한 것과 같은 어노테이션입니다. @GetMapping
에는 path를 명시적으로 작성 후, URI를 작성해줄 수도 있고, path를 생략후, URI로 사용될 문자열만 작성해줘도 문제없이 작동합니다.
@RestController
@RequestMapping("/api/get")
public class GetApiController {
@GetMapping(path = "/hello")
public String hello() {
return "Hello";
}
}
1-2. path variable 받기
다음으로는 URI에서 path variable을 받아보겠습니다. path variable을 받기 위해서는 @PathVariable
어노테이션이 필요합니다. @PathVariable
의 name 속성에는 @GetMapping
에 작성한 URI에서 사용된 변수명을 지정해주변 됩니다.
@RestController
@RequestMapping("/api/get")
public class GetApiController {
// http://localhost:8080/api/path-variable/{id}
@GetMapping("/path-variable/{id}")
public String pathVariable(@PathVariable(name="id") String idValue) {
System.out.println("path-variable: " + idValue);
return idValue;
}
}
1-3. query parameter 받기
GET 요청을 할 때에는 쿼리 파라미터를 받아야하는 경우가 많습니다. 쿼리 파라미터를 요청으로 받기 위해서는 @RequestParam
이라는 어노테이션을 클래스 내의 메서드의 파라미터에 작성해주어야 합니다.
@RestController
@RequestMapping("/api/get")
public class GetApiController {
//http://localhost:8080/api/query-param?user={user_name}&email={email}
@GetMapping("/query-param")
public String queryParam02(
@RequestParam String user,
@RequestParam String email
) {
return user + " " + email + "\n";
}
}
1-4. query parameter로 객체 받기
쿼리 파라미터로 객체를 넘겨주어야 하는 경우도 많습니다. UserDTO
클래스를 작성하고 이 객체를 쿼리 파라미터로 넘겨보도록 하겠습니다. UserDTO
클래스와 API를 다음과 같이 작성했습니다. 객체를 쿼리 파라미터로 넘겨줄 때에는 @RequestParam
어노테이션을 작성하지 않아도 됩니다.
@Data
public class UserDTO {
private Integer id;
private String address;
private String email;
private String password;
}
@RestController
@RequestMapping("/api/get")
public class GetApiController {
@GetMapping("/query-param")
public String queryParam(UserDTO user) {
return user.toString();
}
}
이때, 리턴 타입을 String이 아닌 UserDTO
로 user
객체를 그대로 반환하면 스프링에서 자동으로 JSON 형태로 변환하여 응답은 내려줍니다.
@RestController
@RequestMapping("/api/get")
public class GetAPIController {
@GetMapping("/query-param")
public UserDTO queryParam(UserDTO user) {
return user;
}
}
2. POST
다음은 POST 메서드 요청입니다. POST 메서드로 요청을 할 때는 일반적으로 쿼리 파라미터에 데이터를 담아서 보내지 않고, Request body에 데이터를 담아 보냅니다. 이때 @RequestBody
어노테이션을 사용합니다. 위의 예시와 마찬가지로 UserDTO
객체를 Request body에 담아 echo해보겠습니다. (POST 메서드 요청의 리턴값은 대부분 void이므로 콘솔에만 데이터를 찍어보겠습니다.)
@RestController
@RequestMapping("/api/post")
public class PostApiController {
@PostMapping("/userdto")
public void postUserDTO(@RequestBody UserDTO user) {
System.out.println(user.toString());
}
}
위와 같이 POST 요청에 json 데이터를 request body에 담아서 send하면, 아래와 같이 객체가 잘 전달되어 찍히는 것을 확인할 수 있습니다.
+) PUT과 DELETE 요청을 POST 메서드와 비슷하므로 생략하도록 하겠습니다.
+) 추가적으로, java의 notation과 JSON의 notation이 다를 때, 데이터를 넘기고 받는 방법에 대해 알아보겠습니다. 일반적으로 자바에서는 camel notation(ex. userName
)을 사용하고, JSON은 snake notation(ex. user_name
)을 사용하는 것이 컨벤션입니다. 이런 컨벤션을 양 쪽 모두 지켜서 데이터를 주고 받기 위해서 @JSONNaming과
@JSONProperty 어노테이션을 사용합니다. @JSONProperty
는 멤버 변수 각각에 대해서 JSON에서는 어떤 이름을 사용할 지 지정해주고, @JSONNaming
은 해당 클래스의 전체 변수에 대해 어떤 네이밍 전략을 사용할 지 지정해줍니다.
@Data
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDTO {
@JsonProperty("user_id")
private Integer userId;
private String userAddress;
private String userEmail;
private String userPassword;
}
위와 같이 멤버 변수를 모두 camel notation으로 UserDTO를 작성하고 JSON으로 snake notation에 따라 request body를 보내도 아래와 같이 객체가 잘 담겨서 전달되는 것을 확인할 수 있습니다.
'Java > Spring' 카테고리의 다른 글
Spring Boot와 GCS(Google Cloud Storage) 연동하여 파일 업로드 구현하기 (Sprint WebFlux에서 파일업로드, FilePart) (0) | 2023.08.07 |
---|---|
[Spring Boot] API 개발 - response 내려주기 (0) | 2023.01.23 |
REST API란? (0) | 2023.01.23 |
[Spring MVC] Presentation Tier 구현 (0) | 2023.01.12 |
[Spring MVC] Business Tier 구현 (0) | 2023.01.11 |
댓글