상세 컨텐츠

본문 제목

[백엔드 - 스프링부트] 2025-01-06 12:08:59.129 WARN 13000 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]

🍜개발자라면/에러 - 담에는 빠르게 헤어지자🎁

by :부셔져버린개발자 2025. 1. 6. 12:35

본문

 

결론 : 혹시 본인이 ResponseEntity Return Class에 default constructor를 생성 안했는지 확인해보자


동작 원리를 분석해보자 

ResponseEntity<T>는 Spring에서 HTTP 응답을 커스터마이징할 수 있도록 제공하는 클래스이다 

ResponseEntity<T>를 사용하면 MessageConverter와 ViewResolver 중 MessageConverter가 우선 동작하게 된다. 

 

Spring MVC 란 무엇이며 어떻게 동작하나요

 

웹 애플리케이션 개발을 위한 모듈로 Model-View-Controller 패턴을 기반으로 동작합니다.

1. 클라이언트의 요청이 들어오면 `DispatcherServlet`이 가로챕니다.
2. DispatcherServlet은 `HandlerMapping`을 통해 요청 URL에 맞는 Controller를 찾습니다.
3. Controller는 사용자 요청을 처리하고 비즈니스 로직을 수행하거나 서비스 레이어에 위임합니다.

 

(그 후 - 전통적인 MVC 과정)

4. Controller는 View 이름(String)을 반환합니다

5. ViewResolver가 해당 View를 찾아서 렌더링을 합니다. 

6. DispatcherServlet이 최종 응답을 반환하게 됩니다. 

 

(그 후- REST API 응답 과정)

4. Controller는 DTO 객체를 반환합니다.

5. MessageConverter가 DTO를 JSON으로 변환합니다.

6. DispatcherServlet이 JSON 응답을 반한합니다. 

 

 

@Controller와 @RestController의 차이점에 대해 설명해주세요

 

- @Controller는 전통적인 MVC 패턴에서 사용하는 어노테이션입니다. `뷰이름을 반환`하여 `View Resolver`가 실제 뷰 파일로 변환하는 역할을 진행합니다.  
- @RestController는 RESTful 웹 서비스에서 사용하는 어노테이션입니다. @Controller에 `@ResponseBody가 결합`된 형태입니다. 이는 `메시지 컨버터(Message Converter)`가 클라이언트에게 적합한 형식으로 변환하여 응답 본문에 담아 반환합니다.
    - Accept 헤더를 통해 클라이언트가 원하는 응답 형식을 명시적으로 요청할 수 있습니다. 

Spring의 HttpMessageConverter는 요청(Request) 또는 응답(Response) 데이터를 변환하는 역할을 수행합니다. 

요청 데이터를 Java 객체로 변환 (Deserialization) 하고, Java 객체를 JSON, XML 등의 포맷으로 변환(Serialization) 하게 됩니다. 

        - JSON => MappingJackson2HttpMessageConverter : application/json
        - HTML 폼 => FormHttpMessageConverter : application/x-www.form-urlencoded
        - Text => StringHttpMessageConverter : text/plain
        - XML => Jaxb2RootElementHttpMessageConverter : application/xml, text/xml 
        - 바이너리 데이터 => ByteArrayHttpMessageConverter : application/octet-stream

 

클라이언트가 JSON 데이터를 요청하면 MessageConverter를 통해 JAVA 객체를 변환하게 됩니다.

Jackson(ObjectMapper) 등이 DTO를 객체로 변환할 때 기본 생성자가 필요합니다 

 

 

 

728x90

관련글 더보기