데이터 교환 방법
사용자에게 페이지를 전달하는 방법은 템플릿 엔진 포맷에 맞게 전달하는 것이다.
그렇다면 데이터를 전달하는 방법은 무엇이고 어떤 포맷으로 전달을 해주어야 할까?
정답은 json이다. json은 '일반적으로' 서버에서 클라이언트로 데이터를 보낼 때 사용하는 양식이다.
스프링에서 어떻게 json 데이터를 클라이언트와 교환하는지 알아보자
데이터를 받는 법
@RequestBody 를 사용한다.
클라이언트가 서버로 JSON 데이터를 Http body에 담아서 서버로 보내면, 서버는 @RequestBody 를 사용하여 해당 데이터를 '객체'로 받을 수 있다.
@RequestBody 는 HttpMessageConverter 를 사용하여 Http 요청의 body 부분을 자바 객체로 변환시킨다.
public String practice(@RequestBody MemberDto memberDto) {
System.out.println("멤버 이름 = ", memberDto.getName());
return "home";
}
데이터를 주는 법
데이터를 주는 방법으로 대표적인 방법 2가지가 있다.
1. @ResponseBody
아주 직관적인 이름이다. @RequestBody 로 받고 @ResponseBody 로 보낸다고 생각하면 쉽다.
@ResponseBody 는 자바 객체를 Http body 내용으로 매핑하여 클라이언트에게 전송한다.
@ResponseBody 역시 HttpMessageConverter 를 사용하여 변환시킨다.
@ResponseBody
//매핑 주소 입력
public MemberDto practice() {
return new MemberDto;
}
또한, @RestController 를 사용하여 @ResponseBody 를 생략할 수 있다.
@RestController = @Controller + @ResponseBody 라고 생각하면 편리하다.
2.ResponseEntity
@ResponseBody 가 있는데 ResponseEntity 를 대체 왜 써야할까?
이유는 @ResponseEntity 는 그냥 정말 데이터'만' 전송하기 때문이다.
Header 에 대한 설정과 Status 설정 등을 추가로 하려면 따로 설정해주어야 한다.
ResponseEntity 는 이러한 문제를 해결해준다.
ResponseEntity 는 애노테이션이 아닌 객체로 사용이 되며 return 값으로 넣어주면 된다.
<Constructor 사용>
public ResponseEntity<MemberDto> practice(@RequestBody MemberDto memberDto) {
return new ResponseEntity<MemberDto>(memberDto, headers, HttpStatus.valueOf(200));
}
//headers 는 따로 설정해줘야한다.
Constructor 를 사용하여 ResponseEntity 를 반환해주는 방법이다. 하지만 이 방법보다 권장되는 방법은 Builder 를 사용하는 방법이다.
<Builder 사용>
public ResponseEntity<MemberDto> practice(@RequestBody MemberDto memberDto) {
return ResponseEntity.ok()
.headers(headers)
.body(memberDto);
}
//headers 는 따로 설정해줘야한다
헷갈렸던 점
@RequestBody 와 @ResponseBody 를 언제 사용해야 하는지 -> Api 통신 때 사용. 데이터 주고 받을 때
ResponseEntity 대신 @ResponseBody 사용하면 안되는지 -> 사용 가능. 하지만 자세한 설정 불가
'Spring' 카테고리의 다른 글
ArgumentResolver 와 ReturnValueHandler (0) | 2024.08.14 |
---|---|
Servlet 과 DispatcherServlet (0) | 2024.08.14 |
AOP 간단 요약 (0) | 2024.08.12 |
@ModelAttribute 는 언제 어떻게 왜 쓰는가 (0) | 2024.06.29 |