[Spring Boot] API 방식
API란?
기본적인 API의 의미는 Application Programming Interface의 약자이다. 이는 일종의 소프트웨어 인터페이스이며, Third Party 소프트웨어를 제작하거나, 관련 소프트웨어 제작 인터페이스를 제공하는것을 의미한다. 다만, 웹에서의 API의 의미는 개발자가 브라우저 상에 쉽게 개발할 수 있도록 도와주는 객체 모음이다.웹 API는 객체 기반으로 동작하며, 엔트리 포인트가 존재한다.
기본적인 Spring API 방식
String 타입 Response
우선 아래와 같은 코드를 보자
@Controller
public class HelloController {
// Basic API Returns String
@GetMapping("hello-spring")
@ResponseBody // html의 <body>태그가 아닌 http header의 body 부분에 데이터를 넣는다는 의미이다.
public String helloString(@RequestParam("name") String name){
return "hello" + name;
}
}
@GetMapping은 Url Mapping할때 쓰이던것과 동일하다. 그리고 @RequestParam("name")으로 URLparam을 가지고 오는것도 간단한 MVC예제에서 다루었던것과 동일하다. MVC예제와 다른점은 Model 객체를 매개변수로 받지 않는다. 또 다른 차이점은 @ResponseBody라는 어노테이션이 작성되어있다. 이 어노테이션의 의미는 Http 패킷의 body 부분에 데이터를 넣겠다는 의미를 가지고 있다. 이 코드에서는 return값으로 반환하는 String 데이터를 Response Body에 넣겠다는것을 의미한다.
위 코드를 작성하고 실행 후 URL로 들어가면 아래와 같이 String 데이터가 나오는것을 볼 수 있다. 다만 페이지 소스를 보면, html구조가 아닌, String값만 출력된것을 볼 수 있다. 그리고 개발자 도구에서 해당 요청의 패킷을 보면 Content-Type이 html/text로 나와있는것을 볼 수 있다.
Http Content-Type의 다른 종류는 아래 블로그를 참고하자
https://juyoung-1008.tistory.com/4
MIME-Type,Content-Type이란?
MIME이란? MIME이란? Multipurpose Internet Mail Extensions의 약자로 간략히 말씀을 드리면 파일 변환을 뜻한다. MIME는 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달하기
juyoung-1008.tistory.com
JSON 타입 Response
이번에는 객체를 반환하는 코드를 작성해 보자. 아래와 같이 코드를 작성했다고 가정하자.
@Controller
public class HelloController {
//JSON type Response
@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;
}
}
}
Hello라는 정적중첩클래스(Static Nested Class)의 객체를 반환하는 코드이다. 이 코드를 실행해보면 아래와 같이 JSON 형식으로 결과를 반환하는것을 볼 수 있다.
객체의 반환타입에는 크게 XML, JSON이 있는데, 최근에는 모두 JSON으로 통일되었다. Spring에서도 기본적으로 객체를 반환하고, @ResponseBody를 통해 패킷에 반환하면, JSON으로 반환하는것이 디폴트로 세팅되어있다.(필요에 따라 바꿀 수 있다. XML은 거의 Legacy 프로젝트에서만 쓰인다고 한다.)
원리
@ResponseBody를 사용해서 작동하는 원리는 아래와 같다.
원리의 전개는 아래와 같다.
- Controller에 요청을 주고, Parameter을 넘겨주는것은 MVC방식과 동일하게 취한다
- 어노테이션 @ResponseBody가 발견되면 스프링은 우선 HttpMessageConverter를 동작시킨다(tmi. MVC방식에서는 viewResolver가 작동했다)
- HttpMessageConverter는 넘겨진 값의 타입을 보고 Converter를 결정한다. 위 예시경우에는 객체를 반환했다. 객체는 기본적으로 JSON으로 반환하도록 되어있다. 기본적으로 Spring에서 객체를 JSON으로 변환할 때 사용하는것은 MappingJackson2HttpMessageConverter이다.(Jackson은 객체를 JSON으로 바꿔주는 대표적인 라이브러리이다. 또 다른 대표적인것으로 Gson이 있다.)(String은 StringHttpMessageConverter가 작동됨)
- 요청한 브라우저에 JSON을 반환한다.