@Controller 🆚 @RestController
- @Controller
- 기존의 Spring MVC가 view을 사용하기 때문에 view(화면)를 return
- 데이터는 ModelAndView객체를 이용해 Controller에서 Client로 전달
- @ResponseBody 어노테이션을 사용 시 View를 return하지 않고 Controller에서 직접 데이터 return 가능
- @RestController
- 모든 메서드는 @ResponseBody 어노테이션 기본으로 작동
- 컨트롤러 클래스의 각 메서드마다 @ResponseBody을 추가할 필요 X
- View가 필요없는 REST 방식에서 주로 사용
ResponseEntity란
스프링에서 제공하는 ResponseEntity 타입은 개발자가 직접 결과 데이터와 HTTP 상태코드를 제어할 수 있는 클래스다.
// ResponseEntity 선언 구조
public class ResponseEntity extends HttpEntity {
private final Object status;
}
ResponseEntity의 구조를 보게 되면, 위과 같이 Status만 필드값으로 가지고 있다.
이는 ResponseEntity에서 직접적으로 Status Code 를 지정할 수 있다는 것을 의미한다.
ResponseEntity 구조
| HttpBody | HttpHeaders | HttpStatus |
- HTTP Body
- payload (실질적으로 전송의 목적이 되는 데이터 부분)
- HTTP Headers
- 요청 혹은 응답 에 대한 요구사항
- HTTP Status
- 1xx (요청에 대한 정보): Request received, continuing process.
🌱 요청을 받으면, 기존 작업 처리를 계속 진행한다. - 2xx (성공): The action was successfully received, understood, and accepted.
🌱 작업이 성공적으로 수용되고, 해석되었으며, 수행되었다.
ex) 200(성공), 201(새 리소스 작성), 202(요청이 접수, 아직 처리 X) - 3xx (리다이렉션): Further action needs to be taken in order to complete the request.
🌱 요청 작업을 완료하기 위해 추가적인 동작을 수행해야한다.
ex) 300(여러개의 응답으로 선택해야 한다), 301(영구 이동), 302(임시 이동) - 4xx (클라이언트 오류): The request contains bad syntax or cannot be fulfilled.
🌱 클라이언트 요청에 부적절한 구문이 있거나 해당 내용이 수행될 수 없다.
ex) 401(권한 없음), 404(금지됨), 404(찾을 수 없음, 서버에 없음) - 5xx (서버 오류): The server failed to fulfil an apparently valid request.
🌱 서버가 유효한 요청에 대한 작업을 수행하지 못했다.
ex) 500(내부 서버 오류), 501(메소드 인식 불가), 503(서비스 사용 불가)
- 1xx (요청에 대한 정보): Request received, continuing process.
👉 ResponseEntity 클래스를 사용하면 (결과값, 상태코드, 헤더값) 을 모두 프론트에 넘겨줄 수 있고, 에러코드 또한 섬세하게 설정해서 보내줄 수 있다는 장점이 있다
@RequiredArgsConstructor
@RestController
public class ResponseEntityController {
private final ResponseEntityService service;
@GetMapping("/user/{id}")
public ResponseEntity<MyDto> findByid(@PathVariable Long id) {
User user = service.getUser();
MyDto dto = new MyDto();
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
dto.setStatus(StatusEnum.OK);
dto.setData(user);
dto.setMessage("메세지메세지!");
return new ResponseEntity<>(dto, header, HttpStatus.OK);
}
}
ResponseEntity 사용방법
ResponseEntity를 뜯어보면 이미 생성자가 다양하게 작성되어 있어 status값만 넣거나, body만 넣어도 ResponseEntity의 나머지 값은 null로 들어가는 것을 알 수 있다.
👆 생성자를 이용한 ResponseEntity 작성
@PostMapping("/post")
public ResponseEntity<PostResponseDto> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return new ResponseEntity<>(HttpStatus.OK);
return new ResponseEntity<>(response, HttpStatus.CREATED);
return new ResponseEntity<>(response, new HttpHeaders(HttpHeaders.EMPTY), HttpStatus.CREATED);
}
✌️ 빌더를 이용한 ResponseEntity 작성
ResponseEntity를 사용 시 생성자 사용보다는 Builder 사용을 권장하고 있다.
그 이유는 숫자 상태 코드를 넣을 때, 잘못된 숫자를 넣는 실수가 발생할 수 있기 때문이다.
1️⃣ Status 만 반환할 때
@PostMapping("/post")
public ResponseEntity<void> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return return ResponseEntity.ok().build();
}
2️⃣ Body 도 반환할 때
@PostMapping("/post")
public ResponseEntity<PostResponseDto> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return return ResponseEntity.ok(response);
}
참고
https://thalals.tistory.com/268
'Back-end' 카테고리의 다른 글
[AWS] SpringBoot + gradle 프로젝트(jar) EC2 서버 배포 (0) | 2023.02.11 |
---|---|
[Spring Security] CSRF disable? (0) | 2023.01.26 |
[Spring Boot] H2 설치, Spring Boot H2 연결 (0) | 2023.01.18 |
[git] .gitignore 사용법, gitignore 적용하기 (0) | 2023.01.18 |
[Lombok] 사용한 롬복 정리 (0) | 2022.09.21 |