웹개발을 하다보면 정말 많이 하게 되는 HTTP API개발. 물론 이전직장에서도 많이 개발해봤지만
Boot를 사용해서 개발을 하지는 않았기 때문에, Spring Boot환경에서의 API 관련 기능을 정리하려 한다.
@RestController
- class위에 @RestController Annotation이 존재한다면, 해당클래스의 모든 메소드는 @ResponseBody가 포함된다.
@ResponseBody
- 해당 Annotation이 있다면, HttpServletResponse에 VO(Value Object)객체를 json으로 변환하여 담는다.
- 특정 객체를 return하면 자동으로 json타입으로 변환하여 responseBody에 담는다.
- 이전직장에서는 response에 일일이 key/value로 담고 Buffer를 이용해 write해줬었는데,, Boot가 좋긴 좋다.
- @RestController를 사용하지않고 @Controller를 사용하는 class라면, 메소드위에 필히 @ResponseBody Annotation을 작성해 주어야한다.
예제
package hello.exception.api;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class APITestController {
@GetMapping("/api-test/{id}/{name}")
public TestVO getTest(@PathVariable("id") String id, @PathVariable("name") String name) {
TestVO testVO = new TestVO(id, name);
return testVO;
}
//json형태로 return하고자하는 VO
@Data
@AllArgsConstructor
static class TestVO {
private String id;
private String name;
}
}
PostMan을 사용하여 해당 API를 호출해본다.
하지만,, 이런식으로 사용자의 데이터가 포함하는 요청과 응답에는 GET방식은 좋지않다. POST방식으로 변경해보자.
@RequestBody
- 해당 Annotation이 있다면, HttpServletReqeust에서 요청된 데이터(주로 json데이터를 받을 때)을 쉽게 받기위해 사용
- 특정 객체를 return하면 자동으로 json타입으로 변환하여 responseBody에 담는다.
- 이전직장에서는 request에 넘어온 값을 일일이 getParameter로 받아서,, null check 한뒤에 사용했는데 (POST방식으로 넘어오면 InputStreamReader로 parsing해서 사용했다.)
- 하지만 Boot는 json으로 넘어오는 property와 @RequestBody의 객체의 property가 같다면 알아서 mapping해준다.
- 자매품으로는 @RequestParam이 있다.
@RequestParam
- @RequestBody와 동작은 비슷하다. 둘의 가장 큰 차이점이 있다면 객체하나를 1:1로 Mapping한다는 것이다.
예제
package hello.exception.api;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
public class APITestController {
@PostMapping("/api-test")
public TestVO getTest(@RequestBody TestVO testVO) {
TestVO ret = new TestVO();
ret.setId(testVO.getId() + "POST!");
ret.setName(testVO.getName() + "POST!");
return ret;
}
//json형태로 return하고자하는 VO
@Data
@AllArgsConstructor
@NoArgsConstructor
static class TestVO {
private String id;
private String name;
}
}
'정리 > Spring Boot' 카테고리의 다른 글
Spring Boot @Annotation종류와 쓰임새 (0) | 2023.06.14 |
---|