1. @Controller vs @RestController
@Controller
나 @RestController
를 사용한다.view
또는 Data(ex.Json)
반환ResponseEntity
로 감싸서 반환객체
반환 / 뷰
반환@Controller
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping(value = "/test")
public @ResponseBody ResponseEntity<Test> findUser(@RequestParam("testName") String testName){
return ResponseEntity.ok(testService.findUser(test));
또는
return ResponseEntity<>(dto, header, HttpStatus.OK);
}
@GetMapping(value = "/test/detailView")
public String detailView(Model model, @RequestParam("testName") String testName){
Test test = testService.findTest(testName);
model.addAttribute("test", test);
return "/test/detailView";
}
}
1-2. @RestController
httpStatus
를 설정할 수 없음.@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping(value = "/test")
public User findTest(@RequestParam("testName") String testName){
return testService.findTest(test);
}
@GetMapping(value = "/test")
public ResponseEntity<Test> findUserWithResponseEntity(@RequestParam("testName") String testName){
return ResponseEntity.ok(testService.findTest(test));
}
}
2. @ControllerAdvice vs @RestCOntrollerAdvice
2-1. @ControllerAdvice
2-2. @RestControllerAdvice
3. 사용자 지정 상태 코드 반환 (출처)
3-1. ResponseEntity 사용
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}
3-2. 예외클래스에 @ResponseStatus 사용
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
throw new ForbiddenException();
}
" / exception "에 대한 GET 요청을 받으면 Spring은 ForbiddenException 을 던질 것 입니다. 이것은 별도의 클래스에서 정의 할 사용자 지정 예외입니다.
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}
이 예외에는 코드가 필요하지 않습니다. 모든 작업은 @ResponseStatus 어노테이션에 의해 수행됩니다 .
3-3. @ContollerAdvice 및 @ExceptionHandler 사용
※ 주의할 점은, 프로젝트에 하나의 @ControllerAdvice만 관리하는 것을 권장합니다.
요약: @Controller도 객체 반환은 되나 그러려면 @ResponseBody를 붙여야하므로 @RestController를 사용하는게 나음. 하지만 @RestController는 상태값반환이 안 되므로 (Http status 어쩌구)를 사용할 수 없으므로 적절한 ResponseEntity를 이용해야함(ex. ResponseEntity.ok)