RestController에서 클라이언트에게 어떤 값을 반환해야 할까?
Spring Boot를 활용하여 REST API를 만들던 도중 클라이언트에게 값을 반환하는 방법은 어떤 것들이 존재하며 어떤 값을 반환해야 할지 정리하면 좋을 것 같아 해보려고 합니다.
우선 반환하는 방법들에는 어떤것들이 존재할까요?
1. String반환(단순 문자열)
@RestController
public class testController{
@RequestMapping("/test")
public String test1(){
return "test";
}
}
문자열 데이터는 기본적으로 text/html 타입을 처리됩니다.
"test"라는 메시지가 HTTP ResponseBody에 직접 쓰이게 됩니다.
2. 객체 반환
@RestController
public class testController{
@RequestMapping("/test")
public Member test1(){
Member member = new Member("김준우",26);
return member;
}
}
MessageConveter를 통해 application/json 형태로 반환됩니다.
{"name" : "김준우" , "age" : 26}
3. 객체 리스트 반환
@RestController
public class testController{
@RequestMapping("/test")
public List<Member> test1(){
List<Member> list = new ArrayList<>();
Member member1 = new Member("김준우",26);
Member member2 = new Member("Dummy", 30);
list.add(member1);
list.add(member2);
return list;
}
}
[{"name" : "김준우" , "age" : 26} , {"name" : "Dummy" , "age" : 30}]
4. Map 반환
@RestController
public class testController{
@RequestMapping("/test")
public Map<String,Member> test1(){
Map<String, Member> map = new HashMap<>();
Member member1 = new Member("김준우",26);
Member member2 = new Member("Dummy", 30);
map.put("1", member1);
map.put("2", member2);
return map;
}
}
{ "1" : {"name" : "김준우" , "age" : 26} , "2" : {"name" : "Dummy" , "age" : 30} }
5. ResponseEntity 반환
RestController는 별도의 View를 제공하지 않는 형태로 서비스를 실행합니다.
ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500 ERROR와 같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할 수 있기 때문에 좀 더 세밀한 제어를 할 수 있습니다.
@RestController
public class testController{
@RequestMapping("/test")
public ResponseEntity<Member> test1(){
Member member1 = new Member("김준우",26);
return new ResponseEntity<Member>(member1, HttpStatus.OK);
}
}
또한 여기에는 다음과 같이 사용자 지정 상태 코드, 헤더 및 본문을 제공할 수 있습니다.
@RestController
public class testController{
@RequestMapping("/test")
public ResponseEntity<Member> test1(){
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
Member member1 = new Member("김준우",26);
headers.add("test", "hello world!!!!");
return new ResponseEntity<Member>(member1, headers, HttpStatus.OK);
}
}
반환값
Status : 200 OK
test : hello world!!!!
Content-Type : application/json;charset=UTF-8
...
{
"name": "김준우",
"age": "26"
}
6. @ResponseStatus 어노테이션 활용
반환되어야 하는 상태 코드 및 이유 메시지로 메서드 또는 예외 클래스를 표시할 수 있습니다.
@RestController
public class testController{
@ResponseStatus(value = "HttpStatus.OK")
@RequestMapping("/test")
public Member test1(){
Member member = new Member("김준우",26);
return member;
}
}
가독성이 조금 좋아 보이는 것 같습니다.
하지만 커스텀 Header 정의도 불가능하며 ResponseEntity클래스처럼 유연하지 않습니다.
value를 설정하지 않으면 default는 500입니다.
보통 Exception에 많이 활용됩니다.
공통점
HTTP 응답 데이터(body)에 값이 쓰여서 클라이언트에게 전달됩니다.
원리
@ResponseBody의 역할
HttpMessageConverter를 통해서 응답 값을 자동으로 json으로 직렬화 한 뒤 응답해주는 역할을 수행합니다.
출처
https://wondongho.tistory.com/76
[SpringFramework] RESTful방식의 @RestController 와 @ResponseBody란?
몇달전 본인은 프로젝를 진행하면서 클래스를 하나를 Controller로 두고, Controller클래스 내에 view return하는 메소드, RESTful방식으로 return 하는 메소드를 짬뽕해서 사용했다. 결과적으로 이런방
wondongho.tistory.com
https://kkangdda.tistory.com/39
RESTful(4) - @RestController 사용하기 (단순문자열, 객체타입, List타입, Map타입)
@RestController → @Responsebody없이도 처리됨 (생략) @Controller와는 다르게 @RestController는 리턴값에 자동으로 @ResponseBody를 붙게되어 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달 된다고 한다..
kkangdda.tistory.com
https://programmertoday.com/spring-responseentity-responsebody-resonsestatus/
Spring ResponseEntity, ResponseBody, ResonseStatus - ProgrammerToday
Spring ResponseEntity represents an HTTP response, including headers, body, and status. While @ResponseBody returns the value with response body.
programmertoday.com