@ResponseBody
"ajax요청에 대한 응답을 위한 controller에는 @ResponseBody어노테이션을 작성해줘야한다.
기본적인 세팅이 jsp응답으로 되어있기 때문에 @ResponseBody를 작성해주면
반환값을 http응답 객체에 직접 작성하겠다라는 의미를 가지고 있다."
: 스프링에서 비동기 처리를 위한 어노테이션으로
MVC패턴에서 클라이언트에게 응답할 때 데이터만 직접 반환할 수 있게 해준다.
# 비동기 처리: 웹에서 화면전환 없이 이루어지는 동작들을 처리하기 위한 방식
비동기통신을 하기 위해서는 클라이언트에서 서버로 요청을 보낼 때, 본문에 데이터를 담아서 보내야하고, 서버에서 클라이언트로 응답을 보낼 때에도 본문에 데이터를 담아서 보내야한다.
여기서 "본문"이 Body 이다. 그래서 @ResponseBody 인 것
+ "Body"는 HTTP Body에 해당한다.
그리고 이때 본문에 담기는 데이터 형식 중 가장 대표적으로 사용되는 게 JSON이다.
즉, 비동기식 - 서버 통신을 위해 "JSON 형식"의 데이터를 주고받는 것.
@ResponseBody를 사용하면 메소드의 반환값을 그대로 HTTP Body에 담아서 클라이언트에게 전달함
보통 AJAX요청이나 REST API의 JSON응답으로 많이 사용된다.
EX) return "loginSuccess"
라고 하면 문자열 자체가 http응답으로 반환되고 페이지 이동 없이 "loginSuccess"라는 텍스트를 클라이언트에게 전달함
@RequestBody도 있긴 한데 나의 경우에는 사용하지 않고 있음.
Q. @ResponseBody가 어떤 기능을 대신 해주고 있는거지?
@ResponseBody를 안 쓸 경우 데이터를 JSON으로 직접 변환하고 컨버터를 직접 등록해줘야 함
안 쓸 경우 직접 해야하는 것 ( =java사용 시 )
1. 반환할 데이터를 담고있는 객체를 ObjectMapper()를 사용해서 JSON문자열로 직접 변환해야 함
// JSON 변환기(ObjectMapper) 사용해서 JSON 문자열로 변환
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(member); // JSON 문자열 생성
2. HttpServletResponse에 JSON문자열을 작성해야 함
// HttpServletResponse로 JSON 응답 설정
response.setContentType("application/json"); // 응답의 Content-Type 설정
response.setCharacterEncoding("UTF-8"); // 응답 인코딩 설정
response.getWriter().write(json); // JSON 데이터를 HTTP 응답 본문에 작성
# 응답의 Content-Type을 "~/json"으로 지정해야 클라이언트가 JSON형식으로 인식함
총정리
@ResponseBody는
AJAX / REST API의 비동기통신을 위한 어노테이션@임
가장 많이 쓰이는 반환 형식이 JSON이다
@ResponseBody가 제공 해주는 기능
1. 반환객체를 json문자열로 변환 해준다.
2. 변환된 문자열을 HTTP응답본문에 작성해준다(response.~~)
+ 11.13 추가
프로젝트 하다가 @ResponseBody의 Body가 Html의 <Body>인건가? 라는 의문이 들음
결론부터 말하자면 아님
여기서 Body는 HTTP의 통신의 Body에 해당함.
HTTP request / response에는 header와 body가 있는데
head에는 통신의 대한 정보를 넣고, body에는 데이터, 메세지를 넣는다
@ResponseBody를 사용하게 되면 "직접 HTTP Body에 넣어주겠다"는 의미고
여기서 "직접 HTTP Body에 넣어주겠다"의 의미는
jsp에는 html이 있는데 html은 String으로 변환이 돼서 HttpBody에 담겨서 감
이처럼 데이터를 Body에 넣어주겠다는 것.
@ResponseBody
= ajax 요청을 응답할 때 Body에 직접 넣어주겠다 라는 것
# @ResponseBody는 데이터를 Body에 넣기만함!!!
그리고 그 @ResponseBody 아래에 작성하는
@GetMapping(value="replyList.bo", produces = "application/json; charset = UTF-8"){
return new Gson().toJson(list);
}
의 경우 보내는 String 데이터가 json타입과 UTF-8형식이라고 알려주는 것
=> return에서 json타입(String)으로 리턴을 하지만 받는 jsp 입장에서는 받은 데이터(String)가 어떤 타입이였는지 알 수가 없으니까 jsp에게 "json타입, UTF-8형식이야~" 라고 알려주는 것
# 이렇게 안 하면 SPRING 설정했던 viewResolver때문에 .jsp가 붙어서가니까 명시를 해주는 것(내가 직접보낸다)
'Spring' 카테고리의 다른 글
SPRING의 기본적인 어노테이션 정리 (0) | 2024.10.31 |
---|---|
@Mapping 어노테이션 (4) | 2024.10.31 |
Spring - Cookie (0) | 2024.10.18 |
Spring 개념정리(DispatcherServlet, 매개변수 바인딩, DB 커넥트풀, 싱글톤 패턴) (0) | 2024.10.18 |
Spring - Filter / Interceptor (0) | 2024.10.18 |