Spring Boot & Rest API (1)

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 을 이용하는 경우 methodRequestMethod.GET 과 같이 메소드 명을 넣어서 처리를 하며, GET 외에 POST, PUT, DELETE 등 HTTP Method 들을 제공한다.

이처럼 매핑하는 어노테이션은 @RequestMappingmethod 처럼 작성할 수 있지만
@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 를 이용하여 테스트를 한다.
MockMvcRequestBuildersparam() 을 이용하면 Get Parameter 를 전달 할 수 있다.
전달한 coffeeName이 정상 출력 되는지 jsonPath() 를 이용해 확인한다.

테스트 코드가 아닌 실제 테스트를 위해서 Postman 을 이용하도록 하겠다.
실제 요청 화면은 다음과 같다.

rest_api_get_param

정상적으로 잘 요청이 되었다.

이번엔 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에서도 마찬가지로 테스트 코드를 추가한다.
여기서 MockMvcRequestBuilderscontent() 를 이용하여 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 활용하기

+ Recent posts