Spring mvc 패턴 VS RestfulApi
이전 글에도 언급했지만 mvc 패턴과 Api의 차이를 명확히 알아야 이해할 수 있다.
이 둘의 가장 큰 차이점만 언급하겠다.
Spring mvc 패턴
View 지향: Spring MVC 패턴은 주로 웹 애플리케이션의 사용자 인터페이스(UI)를 개발하는 데 사용된다.
컨트롤러가 뷰를 반환하고, JSP와 같은 뷰 템플릿 엔진을 통해 HTML을 생성하여 클라이언트에게 제공한다.
RestfulApi
데이터 지향: API 방식은 주로 데이터를 주고받는 데 사용된다.
JSON, XML과 같은 데이터 형식을 사용하여 클라이언트와 서버 간 데이터를 교환한다. 뷰를 생성하는 대신, 데이터만 반환한다.
이 둘의 차이를 꼭 알아야, 이해가 가능하다.
Api의 경우 웹 페이지가 아닌 json으로 통신하기 때문에, 오류 상황에 따라 어떠한 오류가 잘못되었는지 명시해줘야 한다.
Api 또한 오류 페이지와 같은 방법으로 서블릿 오류 페이지 방식을 사용해서 학습한다.
다시 WebServerCustomizer를 Component 애노테이션으로 다시 등록한다.
그리고 아주 간단한 Api예제를 만들어서 실행해 보자.
@RestController
public class ApiExceptionController {
@GetMapping("/api/members/{id}")
public MemberDto getMember(@PathVariable String id) {
if (id.equals("ex")) {
throw new RuntimeException("잘못된 사용자");
}
return new MemberDto(id, "나의 이름은! " + id);
}
}
이제 http://localhost:8080/api/members/{id}로 값을 요청해 보자.
json 형태의 결과가 잘 나온다. 이제 RuntimeException을 유도해 보자.
전에 만들어 놓은 오류 로직 처리 때문에, 500 폼으로 넘어가게 된다.
이전에 했던 Spring mvc 패턴의 개발이 아닌, Api를 설계하고 있으므로 html의 오류 페이지가 나가서는 안된다.
해당 오류가 발생한 이유와 상태코드를 내려줘야 하므로 수정이 필요하다.
기존의 accept 로직은 유지한 채, application/json일 때에만 json으로 응답하게 MediaType을 json 형식으로 명시해 줬다.
// 기존 로직
@RequestMapping("/error-page/500")
public String errorPage500(HttpServletRequest request, HttpServletResponse response) {
log.info("errorPage 500");
printErrorInfo(request);
return "error-page/500";
}
// json에 대한 추가 로직
@RequestMapping(value = "/error-page/500", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> errorPage500Api
(HttpServletRequest request, HttpServletResponse response) {
log.info("Api errorPage 500");
HashMap<String, Object> result = new HashMap<>();
Exception ex = (Exception) request.getAttribute(ERROR_EXCEPTION);
result.put("status", request.getAttribute(ERROR_STATUS_CODE));
result.put("message", ex.getMessage());
Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
return new ResponseEntity<>(result, HttpStatus.valueOf(statusCode));
}
기존의 mvc 패턴에서 500 에러에 View 렌더링 하기 위한 코드에서 json에 응답하기 위한 코드를 추가했다.
json에 대한 응답을 보기 위해 postman에서 요청할 때 application/json으로 요청했다. 그 결과 아래와 같이 json형태로 잘 나오는 것을 볼 수 있다.
또한 Accept가 json이 아니면, 기존 오류 응답인 HTML 응답이 출력된다.
하지만 이러한 과정은 너무 복잡하다.
Spring Boot는 이를 또 해결했다.
이전에 mvc패턴에서 사용한 BasicErrorController를 사용해서 이를 얼마나 쉽게 해결했는지 다음 포스팅에서 알아본다.
코드 링크
https://github.com/toychip/StudySpring/commit/485600d05143dd0a2956376537b6d3123b53fd4e
Feat: Spring-mvc2-exception Api 예외처리 시작 · toychip/StudySpring@485600d
toychip committed Aug 16, 2023
github.com
김영한님 mvc2 - Exception 강의로 학습하였습니다.
공부한 내용을 상기시키기고 해당 내용을 몰랐을 때의 입장에서 쉽게 배울 수 있지 않을까 해서 작성한 글입니다. 잘못된 내용이 있을 경우 말씀해 주세요. 피드백 환영합니다.
'Spring > Spring Exception' 카테고리의 다른 글
Spring Exception 6. ExceptionResolver (HandlerExceptionResolver) (0) | 2023.08.17 |
---|---|
Spring Exception 5. 스프링 부트 Api 오류처리 (BasicErrorController) (0) | 2023.08.16 |
Spring Exception 3. 스프링 부트 오류페이지 View(BasicErrorController) (0) | 2023.08.15 |
Spring Exception 2. 서블릿2 (Filter와 Interceptor를 안 거치려면?) (0) | 2023.08.14 |
Spring Exception 1. 서블릿1 (Spring에서 예외처리를 어떻게 할까?) (0) | 2023.08.12 |