HTTP응답을 처리하는 방식 (@Controller, @RestController)

2024. 3. 9. 21:20Backend 취업준비/Spring

스프링 이 http응답을 처리하는 방식 3가지

  • 정적 컨텐츠
  • MVC와 템플릿 엔진
  • API

 

정적 컨텐츠

  • 먼저 스프링 컨테이너에 요청에 매핑된 컨트롤러가 있는지 찾고 없으면 resources.static 패키지에서 해당 요청과 일치하는 정적 파일(html파일)  URL에 대한 요청을 반환
  • 홈의 경우에 GetMapping("/") 으로 매핑된 것이 있으면 해당 메소드가 반환하는 html파일 반환 없으면 resources.static 패키지의 index.html 반환 (매핑된 컨트롤러를 우선한다)

 

 

MVC와 템플릿 엔진

  1. 요청 수신:
    • 클라이언트가 웹 애플리케이션의 URL에 HTTP 요청을 보낸다
    • 스프링이 DispatcherServlet을 통해 요청을 받는다
  2. 핸들러(Controller) 매핑:
    • DispatcherServlet은 요청된 URL을 분석하여 해당 요청을 처리할 핸들러(Controller)를 찾는다
    • 핸들러는 일반적으로 @Controller 어노테이션이 지정된 클래스
  3. 요청 처리:
    • 핸들러(Controller)는 요청을 처리하고 필요한 데이터를 검색합니다. 이 데이터는 주로 데이터베이스나 외부 서비스로부터 가져옵니다.
  4. 데이터 모델링:
    • 핸들러(Controller)는 처리된 데이터를 모델(Model)에 넣습니다. 모델은 뷰(View)에 전달됩니다.
    • 모델은 일반적으로 Java 객체이며, 뷰에 표시할 데이터를 저장하는 역할을 합니다.
  5. 뷰 선택:
    • 핸들러(Controller)는 뷰(View)의 이름을 반환합니다. 이 이름은 일반적으로 템플릿 파일의 경로와 일치
  6. 템플릿 엔진 처리:
    • 스프링은 선택된 뷰(View)를 렌더링하는 데 사용할 템플릿 엔진을 결정. 템플릿 엔진은 뷰에 동적인 데이터를 삽입하는 역할
    • 스프링은 설정된 템플릿 엔진을 통해 템플릿 파일을 렌더링. 대표적인 템플릿 엔진으로는 Thymeleaf, FreeMarker, JSP 등이 있다.
  7. 렌더링된 뷰 반환:
    • 템플릿 엔진은 모델(Model)에 있는 데이터를 사용하여 템플릿 파일을 렌더링. 이 결과물은 클라이언트에게 HTML 형식으로 반환.
  8. 응답 전송:
    • 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 가 선택된다

 

출처

https://mangkyu.tistory.com/49

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

'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