Spring Boot_API

이세미·2023년 5월 7일
0

SpringBoot

목록 보기
6/23
post-thumbnail

API

스프링 웹 개발에서 이야기하는 API방식에 대한 이야기.

정적 컨텐츠 방식을 제외하면, 이전에 봤던 MVC방식에서 view를 찾아서 템플릿 엔진을 통해 화면을 렌더링하여 html을 웹 브라우저에 넘겨주는 방식이 있고, 오늘 얘기할 API 방식이 있다.

직접 코딩해보기

@GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }

위 사진처럼 HelloController에 위 코드를 추가해 주었다.
여기서 @ResponseBody를 꼭 추가해 주어야 한다.
ResponseBody의 의미는
http의 header부분과 body부분이 있는데, body부분에 "hello " + name이라는 data를 직접 넣어주겠다는 뜻이다.

String name에 spring이라고 값을 넣으면, return문은 hello spring이라고 바뀔 것이다.
문자가 내가 요청한 클라이언트에 그대로 내려간다는 뜻이다.
이전 템플릿 엔진과의 차이는 view가 없이 문자가 그대로!!! 내려간다는 점이 차이점이다.
코드를 실행시켜 웹 브라우저에 localhost:8080/hello-string?name=spring!!!이라고 치고 접속을 해 보았더니 문자가 그대로 화면에 출력되었다.

페이지 소스보기를 해봤더니 다른 html 태그가 일절 없이 hello spring!!!만 떠 있는 것을 볼 수 있다.

이전의 템플릿 엔진은 view라는 템플릿이 있는 상황에서 조작하는 방식이었다면, 이 API 방식은 문자를 그대로 내려주는 방식인 것이다.

사실 위에 한 것은 별 의미가 없다. 문자가 아니라 데이터를 내려달라고 했을 경우 때문에 API 방식을 사용하는 것이다.

위 사진처럼 HelloController에 아래 코드를 추가해 보았다.

@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
    static class Hello {
        private String name;

        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
    }

static class Hello라는 class를 만들어서 getter와 setter를 추가하고,
hello라는 객체를 만들어서 setter에 name을 주고, 값이 아닌 객체를 반환시켜 본 코드이다.

그 후 주소창에 /hello-api?name=spring!!!을 쳐서 접속했더니, 이전과는 다른 화면이 나타났다.

이는 json이라는 방식이다.
json은 key value로 이루어진 구조이다. {"name":"spring!!!"}

과거에는 xml방식도 많이 쓰였다.
그런데 xml방식은 무겁고, 태그를 여러 번 써야한다는 단점이 있지만,
json방식은 간단하기 때문에 최근 프로젝트를 하게 되면 모두 json방식을 쓴다.

**Getter Setter 단축키 : ctrl + enter

@ResponseBody 사용 원리를 그림으로 설명해보면 이렇다.

  1. 웹 브라우저에서 localhost:8080/hello-api를 입력한다.
  2. tomcat 내장 서버에서 hello-api가 왔다고 스프링에 던져준다.
  3. 스프링이 helloController에서 hello-api를 찾는다.
  4. 템플릿에서는 view resolver에게 던졌지만, @ResponseBody를 발견하면 스프링은 http 응답에 데이터를 그대로 넣어주는 동작을 한다.
    but! 문자가 아니라 객체가 반환이 되어야 할 때, 스프링은 어떻게 해줄까?
    객체가 오면 디폴트로 jason 방식의 데이터를 만들어서, http 응답에 반환을 한다.
    어떻게??
    ResponseBody가 나오면, HttpMessageConverter가 동작을 한다.(템플릿 방식에서는 viewResolver가 동작)
    만약 도착한 값이 문자면, StringConverter가 동작을 하고, 객체면 JsonConverter가 동작을 하게 된다.
    이 JsonConverter가 객체를 Json스타일로 바꾼다.
    Json은 바꾼 객체를 요청한 웹 브라우저에 반환을 해준다.

0개의 댓글