묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ResponseEntity와 @RestController
안녕하세요 강의 너무 잘 듣고 있습니다! 다름이 아니라 섹션 6. 스프링 MVC - 기본 기능 부분을 듣다가 궁금한 점이 생겨서 질문 드립니다. 우선 제가 이해하기로는 ResponseEntity를 사용하는 이유는 데이터(객체)와 함께 HTTP 응답 코드를 같이 반환 할 수 있기 때문이다물론 @ResponseBody와 @ResponseStatus를 같이 쓰면 데이터와 HTTP 응답 코드를 같이 보내줄 수 있지만, @ResponseStatus는 애노테이션이기에 동적으로 HTTP 응답 코드를 설정할 수 없기에 ResponseEntity를 사용하는게 더 효율적이다이렇게 두 가지 정도로 알고 있습니다. 여기서 제가 궁금한 점은 반환 타입이 ResponseEntity인 경우 왜 @RestController를 사용하는지 입니다. 그 동안 저도 ResponseEntity를 반환하는 컨트롤러에 @RestController를 항상 붙여줬는데, 강의를 보다 보니 ResponseEntity를 반환할 때는 @ReponseBody가 필요하지 않아서 @RestController가 아닌 @Controller로도 동작하는데 문제가 없어 보이기에 혹시 다른 이유가 있는지 궁금합니다.개인적으로 생각했을때 ResponseEntity를 반환하는 컨트롤러에 @RestController를 쓰는 이유는중간중간 ResponseEntity가 아닌 String, Object 같은 데이터만 반환하는 메서드가 있을 수 있고, 그런 메서드 마다 @ResponseBody를 붙이는게 번거롭기 때문에@RestController 적용시 스프링 컨테이너가 Bean Scope를 template 영역까지 고려하지 않아서 resource를 절약할 수 있기 때문에(?)이 두가지 정도 떠오릅니다. 만약 추가적으로 ResponseEntity를 반환하는 컨트롤러에서 @RestController를 사용하는 이유가 있을까요?그리고 두 번째 이유는 저도 정확히 아는게 아니라 주변에서 들었던 부분인데 이 이유도 해당된다면 조금 풀어서 설명해주실 수 있을까요?감사합니다!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
@ExceptionHandler 메서드에서 ResponseEntity 반환 시 상황 질문
안녕하세요 백기선 강사님! 덕분에 강의를 완주하고 사이드프로젝트로 api 서버를 만들고 있습니다. restapi를 만들고있는데 view기반이랑 조금은 달라서 찾아볼게 많네요.!!ㅎ 익셉션핸들러 처리 중 질문거리가 생겨서 달려왔습니다. @RestControllerAdvice public class ControllerExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(value=HttpStatus.BAD_REQUEST) public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException e){ System.out.println(e.toString()); ErrorResponse response = ErrorResponse.builder() .status(HttpStatus.BAD_REQUEST.value()) .message(e.getMessage()) .build(); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } @Getter @Builder public class ErrorResponse { @Builder.Default private LocalDateTime timestamp = LocalDateTime.now(); private String message; //예외 메시지 저장 @Builder.Default private String code = ""; // 예외를 세분화하기 위한 사용자 지정 코드 private int status; // HTTP 상태 값 저장 400, 404, 500 등 } 익셉션핸들러에 대해 위처럼 작성하였고 핸들러메서드에서 return으로 ResponseEntity 가 반환되고, body부로 ErrorResponse 객체 전달하고 있습니다. ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.itevent.iteventapi.common.error.ControllerExceptionHandler#handleIllegalArgumentException org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 위와 같은 에러가 났었는데 결론은 ErrorResponse에 @Getter를 붙이지 않아서 에러가 났고 @Getter 붙여서 해결하였는데요. 어떤 이유로 게터가 없어서 에러가 났는지 짐작이 안되서 질문드립니다. ErrorResponse객체에 getter가 왜 필요한건가요? (jackson변환할 때 getter가 필요..? POJO 객체의 필수조건? 다양한 생각은 드는게 확신이 안서서 질문드립니다.. 아시면 답변 부탁드리겠습니다 :) )