[Spring Boot] RestController, ResponseEntity란?

chaewss·2023년 1월 19일
0

SpringBoot

목록 보기
1/1
post-custom-banner

@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 |

  1. HTTP Body
    payload (실질적으로 전송의 목적이 되는 데이터 부분)
  2. HTTP Headers
    요청 혹은 응답 에 대한 요구사항
  3. 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(서비스 사용 불가)

👉 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

https://n1tjrgns.tistory.com/185

https://dev-splin.github.io/spring/Spring-ResponseEntity/

post-custom-banner

0개의 댓글