HTTP응답을 처리하는 방식 (@Controller, @RestController)
2024. 3. 9. 21:20ㆍBackend 취업준비/Spring
스프링 이 http응답을 처리하는 방식 3가지
- 정적 컨텐츠
- MVC와 템플릿 엔진
- API
정적 컨텐츠
- 먼저 스프링 컨테이너에 요청에 매핑된 컨트롤러가 있는지 찾고 없으면 resources.static 패키지에서 해당 요청과 일치하는 정적 파일(html파일) URL에 대한 요청을 반환
- 홈의 경우에 GetMapping("/") 으로 매핑된 것이 있으면 해당 메소드가 반환하는 html파일 반환 없으면 resources.static 패키지의 index.html 반환 (매핑된 컨트롤러를 우선한다)
MVC와 템플릿 엔진
- 요청 수신:
- 클라이언트가 웹 애플리케이션의 URL에 HTTP 요청을 보낸다
- 스프링이 DispatcherServlet을 통해 요청을 받는다
- 핸들러(Controller) 매핑:
- DispatcherServlet은 요청된 URL을 분석하여 해당 요청을 처리할 핸들러(Controller)를 찾는다
- 핸들러는 일반적으로 @Controller 어노테이션이 지정된 클래스
- 요청 처리:
- 핸들러(Controller)는 요청을 처리하고 필요한 데이터를 검색합니다. 이 데이터는 주로 데이터베이스나 외부 서비스로부터 가져옵니다.
- 데이터 모델링:
- 핸들러(Controller)는 처리된 데이터를 모델(Model)에 넣습니다. 모델은 뷰(View)에 전달됩니다.
- 모델은 일반적으로 Java 객체이며, 뷰에 표시할 데이터를 저장하는 역할을 합니다.
- 뷰 선택:
- 핸들러(Controller)는 뷰(View)의 이름을 반환합니다. 이 이름은 일반적으로 템플릿 파일의 경로와 일치
- 템플릿 엔진 처리:
- 스프링은 선택된 뷰(View)를 렌더링하는 데 사용할 템플릿 엔진을 결정. 템플릿 엔진은 뷰에 동적인 데이터를 삽입하는 역할
- 스프링은 설정된 템플릿 엔진을 통해 템플릿 파일을 렌더링. 대표적인 템플릿 엔진으로는 Thymeleaf, FreeMarker, JSP 등이 있다.
- 렌더링된 뷰 반환:
- 템플릿 엔진은 모델(Model)에 있는 데이터를 사용하여 템플릿 파일을 렌더링. 이 결과물은 클라이언트에게 HTML 형식으로 반환.
- 응답 전송:
- DispatcherServlet은 템플릿 엔진에서 생성된 HTML을 HTTP 응답으로 클라이언트에게 전송합니다
@Controller
- @Controller는 전통적인 스프링 MVC 컨트롤러를 정의할 때 사용되는 어노테이션.
- 주로 View를 반환하기 위해 사용.
- Spring MVC의 컨트롤러를 사용하면서 Data를 반환해야 하는 경우도 있다. 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해 준다 ⇒ 이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있다.
@RestController
- @RestController는 @Controller에 @ResponseBody가 추가된 것. 따라서 당연하게도 RestController의 주 용도는 Json 형태로 객체 데이터를 반환하는 것.
- 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환.
- 이러한 이유로 동작 과정 역시 @Controller에 @ReponseBody를 붙인 것과 완벽히 동일
API
- @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님) - @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨
@ResponseBody 를 사용
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter 가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
- 참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택된다
출처
'Backend 취업준비 > Spring' 카테고리의 다른 글
@ResponseBody, @ModelAttribute, Model 인터페이스 (2) | 2024.03.18 |
---|---|
스프링 Data Jpa로 API 만들기 (0) | 2024.03.16 |
JDBC 흐름 정리 (0) | 2024.03.08 |
스프링 빈 (0) | 2024.03.03 |
빌드 도구 Gradle (0) | 2024.03.02 |