스프링과 API

jooog·2022년 7월 24일
0

스프링 프레임워크의 MVC 패턴을 통해 뷰 템플릿이 아닌 API로 요청한 데이터를 반환하는 방법을 공부해본다.

🎨 @ResponseBody

@ResponseBody를 controller에 붙여주면 뷰 리졸버(View Resolver )를 통해 뷰 템플릿을 반환하는 것이 아니라 HTTP의 BODY에 문자 내용을 직접 반환할 수 있다.

html의 body tag가 아니라 http의 body 부분이라는 점에 주의해야한다.

    @GetMapping("/hello-api")
    @ResponseBody
    public String helloApi(@RequestParam("api") String api){
        return "hello" + api;
    }

뷰 템플릿 엔진을 사용할 때와의 차이는 request param으로 받아온 api 값을 그대로 화면에 출력한다는 점이다.

🎨 데이터 출력해보기

HelloApi 객체 생성

@Data
public class HelloApi {

    private String name;

    private String address;
    
}

reqeust param으로 받아온 name으로 HelloApi 객체의 name value를 채워주고 HelloApi 객체를 반환한다.

HelloApi 객체를 반환하는 컨트롤러

 @GetMapping("/call-api")
    @ResponseBody
    public HelloApi callApi(@RequestParam("name")String name, @RequestParam("address") String address){
        HelloApi helloApi = new HelloApi();
        helloApi.setName(name);
        helloApi.setAddress(address);
        return helloApi;
    }

localhost:8080/call-api?name=callApi&address=Seoul 로 호출해보면 JSON 방식으로 화면에 출력되는 것을 볼 수 있다.

예전에는 XML 방식을 많이 사용했지만 최근에는 @ResponseBody를 사용해서 객체를 반환하면 기본적으로 JSON의 양식으로 출력된다.

🎨 @ResponseBody 사용 원리

api 방식으로 데이터를 바로 화면에 출력할 수 있도록 만들어주는 @ResponseBody 애노테이션의 원리는 무엇일까? 뷰 템플릿을 사용하지 않고도 http의 body 부분에 바로 내용을 출력할 수 있게 도와주는 @ResponseBody의 동작 원리를 살펴본다.

먼저 localhost:8080/hello-api로 요청이 오면 내장 톰캣 서버를 거쳐서 스프링 컨테이너로 전달된다. 스프링 컨테이너 내부에서는 해당 요청에 맞는 컨트롤러를 찾고 찾은 컨트롤러에 @ResponseBody 애노테이션이 붙어있으면 뷰 리졸버(View Resolver)를 호출하는것이 아니라 HttpMessageConverter로 전달하게된다.

🎨 HttpMessageConverter

객체를 반환해서 http body 부분에 그대로 반환해 출력하기 위해서는 스프링 컨테이너 내부에서 HttpMessageConverter를 호출하게 되는데 단순 문자를 반환하는 경우와 객체를 반환하는 경우가 다소 다르다. 단순 문자를 반환한다면 HttpMessageConverter 내부에서도 StringConverter를 호출하고 객체를 반환한다면 JsonConverter를 호출한다. JsonConverter에서는 반환되는 객체를 json 형식으로 변환해주는 역할을 한다.

0개의 댓글