지난 포스트에서는 사용자의 URL 요청이 들어오면 dispatcherServlet이 해당 URL과 매핑되는
Controller를 찾아서 메소드를 실행한 다음 viewResolver를 통해 해당 view로 이동하는 과정을 살펴보았다.
그런데, 이번 포스트에서는 사용자의 요청 URL과 매핑되는 Controller에
@ResponseBody 어노테이션이 작성되면 어떤 흐름으로 진행되는지 알아보려고 한다.
코드
@GetMapping("hello.do")
@ResponseBody
public String hello(String name) {
return "hello " + name;
}
HelloController에 위와 같은 코드를 작성하고 'hello.do?name='
URL 요청을 보내면 다음과 같은 결과를 확인할 수 있다.
결과
위의 코드와 이미지를 보면 알 수 있듯이 @ResponseBody 어노테이션이 붙어있으면
viewResolver를 통해 return 값에 있는 view로 가는 것이 아닌 값 그대로를 출력하는 것을 확인할 수 있다.
어노테이션 생김새 그대로 HTTP 프로토콜의 Body 부분에 출력을 하겠다는 뜻이 된다.
그렇다면 String 값만 출력할 수 있냐 궁금증이 생길텐데 그렇지 않다.
@ResponseBody 는 객체를 출력할 수도 있다.
코드
@GetMapping("hello-class.do")
@ResponseBody
public Hello helloCls(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;
}
);
@ResponseBody 를 통해 객체를 출력해보기 위해 static class를 작성하고 인스턴스화 해주었다.
그리고 hello-class.do?name= 을 통해 들어오는 parameter 값으로
hello 클래스 변수의 값을 초기화 해주는 코드를 작성했다.
결과
hello 객체가 JSON 형태로 출력된 것을 확인할 수 있다.
이처럼, @ResponseBody 는 문자열ㆍ객체 그대로를 출력한다는 것을 확인할 수 있다.
그렇다면 이 처리는 누가 해주는 것일까?
이미지를 참고하면 HttpMessageConverter 라는 객체가 그 역할을 하는 것으로 확인이 된다.
return 값이 객체이면 JSONConverter가 작동, return 값이 String이면 StringConverter가 작동한다.
따라서 브라우저에서는 그에 맞는 데이터를 문자열 형식으로 확인할 수 있는 것이다.
이 포스트를 통해 스프링에서 @ResponseBody 어노테이션을 만나면
어떻게 동작하는지 이해가 되었으면 좋겠다.
'BACK-END > SPRING' 카테고리의 다른 글
[Spring Boot] 서버 재시작 없이 변경된 코드 반영 (0) | 2023.04.13 |
---|---|
[SPRING] Controller/JSP 데이터 주고 받기 (0) | 2023.02.21 |
[SPRING] dispatcherServlet, ViewResolver, Controller (0) | 2023.02.21 |
[SPRING] 스프링 설치 및 프로젝트 설정 (0) | 2023.02.20 |
Ajax (0) | 2022.05.24 |
댓글