-
RestController에서 클라이언트에게 어떤 값을 반환해야 할까?프로젝트/게시판 프로젝트 2022. 5. 5. 03:41반응형
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
'프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
Spring Rest API 예외처리 (feat. 스프링의 기본적인 예외 처리 방법과 Best Practice) (0) 2022.05.10 Controller에 인자값은 어떤값이 올 수 있을까? (0) 2022.05.06 Entity와 DTO를 분리하자! (0) 2022.05.04 @Builder 제대로 알고 사용해보기 (0) 2022.04.30 JPA로 CRUD 해보기 + 테스트코드 (0) 2022.04.28