기존 컨트롤러에 다음과 같은 부분을 추가하였다.지금 추가한 부분은 MVC처럼 뷰에서 사용할 것들을 모델에 담아 뷰에 전달하는 방식을 사용하지 않고, HTML 내 Body부에 들어갈 데이터를 이 함수를 통해 직접 넣는다.
@ResponseBody 가 그 역할을 한다.
언뜻 보기엔 MVC와 비슷해보일 수도 있는데, 실제로 해당 페이지에 가서 결과물을 보자.
name 값을 "spring!!!!!!"으로 전달했을 때 페이지에는 당연히 hello spring!!!!!!으로 뜰 것이다. 하지만 페이지 소스 코드를 확인한다면❓
페이지 소스 코드에서조차 어떠한 HTML 코드 하나 없이, 설정한 데이터인
"hello spring!!!!!!"만 존재하는 것을 확인할 수 있다.
실제로는 이렇게 문자열만 전달하는 방식으로 사용을 하지는 않지만 API로서 대략 어떤 흐름으로 동작하는지 예시를 통해 확인할 수 있었다.
실제로는 스프링에서 API를 어떻게 사용하는지 살펴보자.
📁 HelloController.java
@Controller
public class 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;
}
}
}
기존 컨트롤러에 위와 같은 메서드를 추가하였다.
/hello-api
엔드포인트로 GET 요청이 들어오면 helloApi 메서드가 호출된다. 이 메서드는 쿼리 파라미터로 전달된 name 값을 받아 Hello 객체에 설정한 뒤, 해당 객체를 반환한다.따라서 위 주소로 접속했을 때의 화면이나 페이지 소스 코드 모두 JSON 형태의 값이 나타나는 것을 확인할 수 있다.
정리하자면, 컨트롤러 메서드가 객체를 반환하고 @ResponseBody가 적용되어있다면, 해당 객체는 기본적으로 JSON 형태로 변환되어 응답된다‼️
이는 스프링이 Http Message Converter를 통해 객체를 자동으로 JSON으로 직렬화해주기 때문이다.
이 흐름을 그림으로 나타내면 위와 같다.
기본적으로는 MVC와 같으나, @ResponseBody가 있기 때문에 HTTP 응답에 반환 데이터를 그대로 넣는 형식이다. 하지만 여기서 반환 데이터는 객체이기 때문에, JSON 형식으로 데이터를 만들어서 HTTP 응답에 반환한다.
그 후 HTTP Message Converter가 동작한다. (이는 @ResponseBody가 있기에 !!) 반환 데이터가 문자열이라면 String Converter가, 객체라면 Json Converter가 동작한다. 이 경우에는 Json Converter가 동작하기 때문에 데이터를 JSON 형태로 바꿔 반환한다.
JavaBean 규약은 Java에서 재사용 가능한 컴포넌트(객체)를 정의하기 위한 표준 규칙이며, 주로 Spring, JSP, JavaFX 등 다양한 프레임워크와 기술에서 객체를 일관되게 다루기 위해 사용된다.
JavaBean은 속성(property), 메서드(method), 생성자(constructor) 등에 대해 일정한 규칙을 따르는 일반적인 자바 클래스이다.
public class Person {
public Person() {} // 기본 생성자
}
이는 프레임워크나 라이브러리가 객체를 쉽게 생성할 수 있도록 하기 위함이다.
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
implements Serializable
을 통해 객체를 직렬화할 수 있어야 한다는 요구가 붙는 경우도 많다. (Ex> JSP에서 form 데이터를 전달받을 때 등)
Spring에서는 @RequestBody, @ModelAttribute, @ResponseBody 등으로 데이터를 주고받을 때 주로 JavaBean 규약이 사용된다.