[스프링 웹 개발 기초] API

김지수·2023년 8월 16일

API

  • API
    • 안드로이드, 아이폰에 개발할 때 과거엔 xml, 요즘엔 json이라는 데이터 구조 포맷을 사용하여 클라이언트에게 데이터 전달
    • Vue.js, React를 사용할 때도 API로 데이터만 내려주면 화면은 클라이언트가 알아서 그리고 정리함
    • 서버끼리 통신할 때는 html을 내려줄 필요가 없고 데이터를 주고 받는 게 중요 → 데이터를 받을 때 API 방식 사용(이 부분은 깊이 있게 파고 들면 정의가 달라질 수 있음)

데이터를 내려주는 방법

  1. View를 찾아서 템플릿 엔진을 통해 화면에 렌더링 할 html 파일을 웹브라우저에 넘겨주는 방법
  2. API를 쓰는 방법

View 방식

@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {  // 외부에서 인자를 받아 옴
        model.addAttribute("name", name);
        return "hello-template";
    }

페이지 소스 코드 보기를 하면 아래 화면이 나온다.


API 방식 (param이 문자)

@GetMapping("hello-string")
    @ResponseBody  // http의 헤더부와 바디부 중 바디부에 데이터를 직접 넣어주겠다는 것
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;  // "hello spring"
        // View 같은 것 없이 문자가 그대로 내려감
    }

페이지 소스 코드 보기를 하면 아래 화면이 나온다.

html을 거치지 않고 데이터를 그대로 내려준다.

위에선 문자를 내려 받았지만, 실제로 API가 유용한 건 데이터를 내려 받을 때이다.


API 방식 (param이 객체)

@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello(); // 객체화
        hello.setName(name);
        return hello;  // 문자가 아닌 객체를 넘김
    }

    static class Hello {  // Hello 클래스
        private String name;

        public String getName() {
            return name;
        }

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

localhost:8080/hello-api?name=spring! 으로 실행하면 아래 화면이 출력된다.

페이지 소스 코드 보기를 해도 똑같이 나온다.

이렇게 json 방식이 사용된 걸 볼 수 있다.



과정 요약

  • @ResponseBody 사용
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신에 HttpMessageConverter 가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter (JsonConverter)
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

클라이언트의 1. HTTP Accept 헤더(어떤 포맷으로 받고 싶은지 요청)와 2. 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택됨
그러나 요새는 거의 json만 사용된다.

profile
안녕하세요

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

정보에 감사드립니다.

답글 달기