Spring Boot & Rest API (1)
이제 Spring Boot 를 이용하여 Rest API 서버를 제작해본다.
Rest API
Rest API 에 대해서는 첨부를 참고하자.
본 예제에서는 간단한 GET, POST API 를 제작 할 것이다.
간단하게 Coffee 정보를 가져오는 API 를 제작한다.
API 의 각 End-Point 는 Controller 를 이용하여 작성한다.
Controller 에서는 각 @RestController
, @RequestMapping
을 이용 End-Point 를 만들 수 있다.
단순 요청을 받는 예제이기 때문에 데이터는 무시하도록 하자.
@RequestMapping
을 이용하는 경우 method
에 RequestMethod.GET
과 같이 메소드 명을 넣어서 처리를 하며, GET 외에 POST, PUT, DELETE 등 HTTP Method 들을 제공한다.
이처럼 매핑하는 어노테이션은 @RequestMapping
에 method
처럼 작성할 수 있지만@GetMapping
처럼 작성하여 불필요한 값을 적지 않고 직관적으로 표현할 수 있다.
(ProductController.java)
@RestController
public class ProductController {
@RequestMapping(method = RequestMethod.GET, value = "/req_get")
public String reqGet() {
return "{\"coffee\":{\"name\":\"americano\"}}";
}
@GetMapping("/get") // method 를 별도로 적지 않아도 됨
public String get() {
return "{\"coffee\":{\"name\":\"americano\"}}";
}
}
GET
위에서 했던 방식중 우리는 @GetMapping
을 이용하여 GET Parameter 를 얻는 방법을 알아볼 것이다.
(ProductController.java)
@RestController
public class ProductController {
@GetMapping(
value = "/get",
produces = "application/json; charset=utf-8") // GetMapping 에서도 인코딩을 지정하기 위해 produces 를 사용 가능
public String get(
@RequestParam(value = "coffee", defaultValue = "americano") String name,
@RequestParam(value = "price", required = true) int price) { // RequestParam 을 이용하여 Get parameter 를 가져올 수 있으며, defaultValue, required 등의 옵션 설정이 가능하다.
return "{\"coffee\":{"
+"\"name\":\""+name+"\","
+"\"prince\":"+price+","
+"}}";
}
}
메소드에 들어가는 파라미터에 @RequestParam
을 넣어 어떤 파라미터를 가져올지 설정할 수 있다.
또한 defaultValue
, required
등의 옵션을 미리 설정 가능하다
이렇게 작성한 API 를 테스트 코드를 통해 확인해 보도록 하자.
(ProductControllerTest.java)
@SpringBootTest
@AutoConfigureMockMvc
class ProductControllerTest {
@Autowired
public MockMvc mockMvc;
@Test
public void get() throws Exception {
String coffeeName = "cafe latte";
mockMvc.perform(
MockMvcRequestBuilders
.get("/get")
.param("coffee", coffeeName) // Get Parameter 를 전달
)
.andDo(MockMvcResultHandlers.print())
.andExpect(jsonPath("$.coffee.name").value(coffeeName));
}
}
이전 글들을 통해 배운 MockMvc 를 이용하여 테스트를 한다.MockMvcRequestBuilders
의 param()
을 이용하면 Get Parameter 를 전달 할 수 있다.
전달한 coffeeName이 정상 출력 되는지 jsonPath()
를 이용해 확인한다.
테스트 코드가 아닌 실제 테스트를 위해서 Postman 을 이용하도록 하겠다.
실제 요청 화면은 다음과 같다.
정상적으로 잘 요청이 되었다.
이번엔 Rest API 작성법에 맞춰 path 에 함께 오는 값을 PathVariable 사용하여 받아보자
(ProductController.java)
// {} 를 이용하여 `count` path variable 정의
@GetMapping(
value = "/get/{count}",
produces = "application/json; charset=utf-8")
public String getSellCount(
@PathVariable(value = "count") int count, // count PathVariable 선언
@RequestParam(value = "coffee", defaultValue = "americano") String name,
@RequestParam(value = "price", required = true) int price) {
return "{\"coffee\":{"
+"\"name\":\""+name+"\","
+"\"prince\":"+price+","
+"\"count\":"+count
+"}}";
}
Path 부분에 중괄호{}
를 이용하여 이름을 지정해주고 @PathVariable
어노테이션을 사용하면 마찬가지로 이름을 넣으면 이를 변수로 활용 가능하다.
여기서도 위와 마찬가지로 테스트를 하여 값을 확인하도록 한다.
Post
POST 요청은 Body 를 포함한다. 따라서 Body 를 받을 수 있도록 추가로 @ReqeustBody
를 넣어 확인하도록 한다.
(ProductController.java)
@PostMapping(
value = "/order/{nickname}",
produces = "application/json; charset=utf-8")
public String addOrder(
@PathVariable(value = "nickname") String nickname,
@RequestParam(value = "coffee", defaultValue = "americano") String coffeeName,
@RequestParam(value = "EA", required = true) int ea,
@RequestBody String body) {
return "Nickname "+nickname+" order "+ea+" "+coffeeName+" with comment "+body;
}
POST에서도 마찬가지로 테스트 코드를 추가한다.
여기서 MockMvcRequestBuilders
의 content()
를 이용하여 body를 넣을 수 있는데 본 예제에서는 간단한 문자열만 넣도록 한다.
(ProductControllerTest.java)
@Test
public void addOrder() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders
.post("/order/mikle") // POST 요청
.accept(MediaType.APPLICATION_JSON)
.param("coffee", "Cafe Latte")
.param("EA", "5")
.content(new ObjectMapper().writeValueAsString("Take out PLZ"))
)
.andDo(MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().string("Nickname mikle order 5 Cafe Latte with comment \"Take out PLZ\""));
}
이처럼 Get, Post 등의 요청을 받아 처리가 가능하며 추후 DB 연동을 통해 데이터를 다룰 수 있을 것이다.
엮인글
Spring Boot & 테스트 코드 작성 (1) - JUnit
Spring Boot & 테스트 코드 작성 (2) - Mock, Mockito
Spring Boot & 테스트 코드 작성 (3) - MockMvc
Spring Boot & Rest API (1)
Spring Boot & Rest API (2) - JPA, MySQL
참조
Building a RESTful Web Service
Serving Web Content with Spring MVC
Building REST services with Spring
[To-Do 앱] 스프링 부트(Spring Boot) RESTful API - GET
[To-Do 앱] 스프링 부트(Spring Boot) RESTful API - POST
Spring4에서 json view 활용하기
'java' 카테고리의 다른 글
[Spring] Spring Boot & Rest API (3) - JPA 조건 (0) | 2020.05.18 |
---|---|
[Spring] Spring Boot & Rest API (2) - JPA, MySQL (0) | 2020.05.18 |
[Spring] Spring Boot & 테스트 코드 작성 (3) - MockMvc (0) | 2020.05.13 |
[Spring] Spring Boot & 테스트 코드 작성 (2) - Mock, Mockito (1) | 2020.05.11 |
[Spring] Spring Boot & 테스트 코드 작성 (1) - JUnit (0) | 2020.05.08 |