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
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을 반환한다.
'Back-End > Java Spring Boot' 카테고리의 다른 글
[Spring Boot] 테스트 코드 작성해보기 (0) | 2022.03.13 |
---|---|
[Spring Boot] 일반적인 웹 애플리케이션 계층 구조 (0) | 2022.03.13 |
[Spring Boot] MVC & Template Engine (0) | 2022.03.12 |
[Spring Boot] Spring Static Content (0) | 2022.03.12 |
[Spring Boot] Welcome Page 만들어보기 (0) | 2022.03.12 |