🌱 Spring

스프링 부트로 웹을 개발한다는 것은? (정적 컨텐츠, MVC와 템플릿 엔진, API)

토심 2023. 12. 20. 00:10

웹 개발은 크게 세 가지 영역으로 나눌 수 있습니다.

- 정적 컨텐츠

- MVC와 템플릿 엔진

- API

 

 

첫 번째, 정적 컨텐츠.

파일 그대로 웹 브라우저에 내려줍니다.

웹 브라우저로부터 내장 톰캣 서버가 먼저 요청을 받고,

(1) 스프링은 컨트롤러가 우선순위가 더 높기 때문에 컨트롤러에서 먼저 찾아봅니다. 

(2) 맵핑된 컨트롤러가 없다면 resources:static/ 폴더를 탐색합니다.

해당 폴더에 맵핑된 html이 있다면 반환합니다.

 

정적 컨텐츠는 이런 식으로 진행됩니다.

 

 

두 번째, MVC와 템플릿 엔진.

MVC란 Model-View-Controller의 약자로, 여기서 각각의 역할은 다음과 같습니다.

 

Model (모델):

- Controller에서 처리된 비즈니스 로직 결과 보유

- 데이터베이스와의 상호 작용 & 데이터 조작을 담당

 

View (뷰):

- 사용자에게 보이는 부분, 화면과 관련된 작업을 담당

- Controller나 Model의 변화를 감지하고 화면을 업데이트

 

Controller (컨트롤러):

- 사용자 입력을 받아 Model을 업데이트하고, 그 결과를 View에 반영

- 서버 뒷단에서 비즈니스 로직을 처리하며, Model과 View 간의 상호 작용을 관리

 

이런 식으로 MVC 패턴을 적용하면, 각각의 부분이 독립적으로 변화할 수 있어 유지보수와 확장성이 향상됩니다.

 

그림만 봐서는 정적 컨텐츠와 비슷해 보입니다. 하나씩 볼까요?

 

내장 톰캣 서버는 "/hello-mvc" 요청을 받았고, 이를 스프링 컨테이너로 전달합니다. 

해당 요청은 helloController에서 매핑되어 있는 메서드를 호출하게 됩니다. 

Controller는 Model에 값을 넘겨주고,

viewResolver는 Controller에서 반환된 문자열과 일치하는 뷰를 찾아주는 역할을 합니다. 

 

Thymeleaf 템플릿 엔진은 받은 데이터를 사용하여 HTML을 렌더링 하고, 이를 웹 브라우저에 반환합니다. 

이 과정에서 동적으로 생성된 HTML이 웹 브라우저에 표시되게 됩니다. 

 

이것이 정적 컨텐츠와의 차이점 중 하나인데, 정적 컨텐츠는 이미 서버에 저장된 그대로의 내용을 제공하는 반면, 템플릿 엔진은 서버에서 동적으로 HTML을 생성하여 제공한다는 특징이 있습니다.

 

 

세 번째, API.

사실 정적 컨텐츠를 제외하면 두 가지만 기억하면 됩니다.

데이터를 내려줄 때 HTML로 내려주냐, API방식으로 데이터를 바로 내리냐. 

 

 

API 방식 코드 작성 시 @ResponseBody를 추가하는데요.

여기서 body는 HTML의 body가 아니라 HTTP 통신 프로토콜의 body를 말합니다.

@ResponseBody는 응답 body 쪽에 내가 직접 데이터를 넣어준다는 뜻입니다.

 

템플릿 엔진과의 차이는 View가 없다는 점입니다.

View 없이 데이터를 그대로 내려주는 방식에서는 템플릿 변환이 필요하지 않고, 데이터 그대로를 클라이언트로 보냅니다.

 

그런데 위 방식은 return 방식이 객체입니다.

문자가 왔다면 문자를 바로 HTTP 응답 body에 보내주면 될 텐데 객체로 넘어오면 어떻게 보내줄까요?

 

스프링 부트에서는 객체가 오면 기본적으로 JSON 형식으로 데이터를 만들어 HTTP 응답에 반환하는 것이 기본 정책입니다. 

 

스프링 부트에서는 @ResponseBody가 붙은 객체를 받으면 내부적으로 HTTP 메시지 컨버터가 동작하여 해당 객체를 JSON으로 변환하여 클라이언트에게 반환합니다. 

 

 

 

정리해 보겠습니다.

 

정적 컨텐츠:
- 파일을 그대로 내려준다.
- 서버에서 가공 없이 클라이언트로 직접 전송

 

MVC와 템플릿 엔진:

- Model-View-Controller 아키텍처를 기반

- 템플릿 엔진을 사용하여 동적인 HTML을 생성

- 서버에서 렌더링한 HTML을 클라이언트에게 제공

 

API 방식:

- 객체는 HTTP 메시지 컨버터를 통해 JSON 형식으로 변환
- View 없이 직접 HTTP Response의 본문에 데이터를 넣어 클라이언트에게 반환
- 주로 @ResponseBody 어노테이션을 사용하여 처리

 

 

 

 

 

다음시간에는 이 세 가지 방법 중 웹 MVC에 대해서 더 알아보겠습니다.

 

 

 

 

 

Reference

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술