Spring 입문 Chapter 2-3. 스프링 웹 개발 기초 : API
이 글은 인프런에 있는 김영한님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의를 듣고 정리한 필기입니다.
⛅️ Spring 웹 개발에서 정적 컨텐츠 방식을 제외한다면?
MVC 방식
원하는 view를 찾은 후, template engine을 통해서 해당 view를 html로 렌더링해서 웹 브라우저(고객)에게 넘겨주는 형식이다.
API 방식
spring 개발 시 이야기하는 API방식은, JSON 형식으로 바꾸어 반환하는 것을 말한다.
view없이 그대로 http body에 전달하는 방식이다.
⛅️ @ResponseBody
@ResponseBody란?
- http(통신 프로토콜)의 body 부에 return(반환)값을 직접 넣어주겠다는 뜻.
- Template engine과의 차이점은?
- API를 사용하면 view가 따로 없다.
- 따라서 소스코드 보기를 통해 보아도 html 관련 코드는 없고, 출렷된 문자만 보인다. - Template engine은 view라는 템플릿이 있는 상황에서 view를 html로 변환하는 것이고,
API는 데이터를 그대로 내보내는 것이다.
⛅️ @ResponseBody는 어떻게 사용하는가?
문자열(String)을 전달하는 경우는 거의 없고, 데이터. 즉, 객체를 요청할 때 주로 사용한다.
API 방식을 이용하여 helloController를 발전시켜보자.
1. Hello라는 클래스를 하나 만들고, 변수 name와 해당 변수에 대한 Getter/Setter를 생성한다.
static class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. @GetMapping을 통해 url과 연결하고, @RequestParam을 통해 url에서 변수의 정보를 받도록 한다.
그리고 그 정보를 setName을 통해 hello 객체의 변수 name에 대입한다.
@ResponseBody 어노테이션더 적는다.
@GetMapping("hello-api")
@ResponseBody
public Hello helloAPI(@RequestParam("name") String nameValue){
Hello hello = new Hello();
hello.setName(nameValue);
return hello;
}
3. 위 코드를 실행하게 되면 JSON 방식으로 표현이 된다.
예를 들어 hello의 name 변수에 spring을 전달했다면, 웹 브라우저에 {"name" : "spring"}이라고 뜬다.
즉, 함수에서 @RequestParam을 통해 변수 nameValue를 받은 후, 해당 값을 hello 객체의 name 변수에 받은 값을 넣어준다. 그리고 hello 객체를 반환한다.
이러한 방식을 API 방식이라고 한다.
⛅️ JSON이란?
참고링크: https://velog.io/@surim014/JSON이란-무엇인가
- Java Script Object Notation의 약자.
- key-value 페어로 이루어진 데이터 오브젝트를 전달하기 위해 사용하는 개방형 표준 포맷.
- http 통신 시, 데이터를 주고 받을 때 사용하는 데이터 포맷 중 하나.
- null, numer, string, array, object, boolean을 사용할 수 있다.
- @ResponseBody 어노테이션이 적혀있고, 객체를 반환한다면 spring에서 key와 value 쌍 포맷인 JSON을 반환한다.
⛅️ Java Bean 규약이란?
1. Java bean 규약을 사용하는 이유
프론트엔드와 백엔드가 각자 구현할 때, 공통의 약속을 지키며 사용함으로써 일관된 방식으로 java 클래스를 사용할 수 있도록 한다.
2. 규약 내용
- 기본 생성자를 가지고 있어야 한다.
- default 패키지가 아닌 지정된 패키지에 저장되어 있어야 한다.
- 멤버 변수의 접근자는 private로 선언한다.
- 멤버 변수에 접근하기 위한 Getter/Setter를 public으로 선언하여 외부에서 접근하도록 한다.
⛅️ @ResponseBody 작동 원리
- 웹 브라우저에서 localhost:8080/hello-api를 요청하면 tomcat 서버에서 hello-api 요청이 들어왔음을 Spring에게 알린다.
- Spring은 먼저 Controller에 hello-api가 Mapping 되어 있는지 확인한다.
이 때, 만일 @ResponseBody가 적혀있지 않았다면, viewResolver에게 전달해서 template engine이 html로 변환했을 것이다. - 메서드에 @ResponseBody 어노테이션이 있고, String을 반환하는 것이 아닌 hello 객체를 반환할 것이다.
따라서 기본적으로 JSON 방식으로 데이터를 만들어서 http응답에 반환할 것이다. - helloController에서 메서드가 실행되어 hello 객체를 넘기게 되면 "HttpMessageConverter"가 작동한다.
만일 단순 문자열을 반환했다면 "StringConverter"가 동작하고, 객체를 반환했다면 "JsonConverter"가 동작한다.
이 상황에서는 hello 객체를 받았기 때문에 JsonConverter가 동작하여 hello 객체의 내용을 JSON 스타일로 바꾼다. - JSON 스타일로 바꾼 내용을 요청한 웹 브라우저/서버에게 응답한다.