Study/Spring Framework

[Spring] Spring의 컨텐츠 제공 방식 (정적 컨텐츠, MVC와 템플릿 엔진, API )

jonghne 2023. 9. 28. 12:35

개요

이번 게시글에서는 Spring 서버가 웹브라우저에게 컨텐츠를 제공하는 방식에 대해 알아봅니다.

 

정적 컨텐츠 방식

정적인 HTML파일을 그대로 웹브라우저에 제공하는 방식으로 [resource/static] 폴더 하위의 HTML 파일을 보여준다. 

 

 

Spring 서버가 정적 컨텐츠를 제공하는 순서는 아래와 같다.

1. 웹브라우저 주소창에 서버 주소와 정적 html 파일명을 붙여서 입력한다. (localhost:8080/hello-static.html)

2. spring boot의 내장 톰캣 서버에서는 먼저 hello-static이라는 컨트롤러가 있는지 확인한다.

3. hello-static이라는 컨트롤러가 없다면, resources/static 폴더 하위에 hello-static.html 파일을 찾아서 웹 브라우저에 반환한다.

 

주의할 점으로 컨트롤러가 우선순위가 더 높기 때문에, 만약 hello-static이라는 주소의 컨트롤러가 존재한다면 정적 컨텐츠를 제공하지 않는다.

 

MVC & 템플릿 엔진 방식

1. MVC 란 ? 

MVC 는 Model-View-Controller 의 약자로 어플리케이션의 역할을 3가지로 구분하여 개발하는 소프트웨어 개발 방법론 이다.

 

과거에는 Controller-View단이 하나의 파일에 합쳐져서 개발하는 [모델 1] 방식을 주로 사용했는데, 이 방식은 HTML 코드와 Java 코드가 하나의 파일 안에 있어서 코드 가독성이 안좋고 유지보수가 어려웠다

 

현재는 소프트웨어 개발에 역할과 책임을 구분짓고 관심사 분리하여 개발하는 것이 중요해지면서, 어플리케이션을 Model-View-Controller 3가지의 영역으로 나누어서 개발하는 MVC 패턴을 주로 사용하고 있다.

 

2. 템플릿 엔진이란 ? 

템플릿 엔진은 HTML 파일의 지정된 템플릿 양식에 데이터 모델을 전달하여 동적 컨텐츠를 만들어주는 소프트웨어이다.

 

대표적인 Spring에서 사용하는 템플릿 엔진은 Thymeleaf가 있다.

 

3. MVC와 템플릿 엔진

MVC 패턴과 템플릿 엔진을 사용해서 웹브라우저에 동적 컨텐츠를 제공할 수 있다.

 

MVC의 Controller 단에서 웹브라우저의 요청에 맞는 로직을 수행한 뒤, 특정 HTML을 호출하여 템플릿 엔진으로 컨텐츠를 동적으로 변환한 뒤 웹브라우저에 반환하게 된다. 

 

동작 원리

 

자세한 동작 순서는 아래와 같다. 

1. 웹브라우저를 통해 스프링 서버에 hello-mvc 경로로 요청한다.

2. 내장 톰캣 서버가 hello-mvc에 해당되는 컨트롤러를 찾아서 요청을 전달한다.

3. 컨트롤러에서 model 객체에 값을 세팅한 뒤, html 파일명에 해당하는 문자열을 return한다.

4. View Resolver가 컨트롤러 리턴값의 문자열 해당하는 html파일을 resources/template 하위에서 찾아온다.

5. Thymeleaf 템플릿 엔진은 컨트롤러에서 받은 데이터 Model 을 통해 html 화면을 구성하고 웹브라우저에 리턴한다.

 

API 방식

MVC와 템플릿 엔진을 통한 컨텐츠 제공 방식과는 다르게 Controller의 비즈니스 로직 결과를 View 단을 통해 HTML을 반환하는 것이 아닌 결과 객체를 JSON 형태의 결과를 반환한다. (View단이 없다)

 

HTML 파일은 XML 방식을 사용하기 때문에 읽고 쓰기가 복잡하고 무겁다라는 단점이 있지만, API 방식은 key-value 형태인 JSON을 사용하기 때문에 가볍고 읽고 쓰기에 편하다.

 

동작 원리

API 방식을 사용하려면 컨트롤러단에 @ResponseBody라는 어노테이션을 붙이면 되는데 자세한 동작 원리는 아래와 같다

1. 웹브라우저의 요청을 받은 내장 톰캣 서버는 스프링 컨테이너에게 전달하고, 스프링 컨테이너는 해당되는 컨트롤러를 찾아서 요청을 전달한다.

2. 이때 컨트롤러가 @ResponseBody 를 사용하고 있다면 웹브라우저에게 HTTP BODY에 문자 내용을 직접 반환하는데,
반환하기 전 HttpMessageConverter라는 것을 통해 변환과정을 진행한다.

3. 만약 Controller의 결과가 String 타입이라면 StringConverter, 객체 타입이라면 JsonConverter를 통해 변환을 진행한다 (이 외에 byte 처리 등 여러 Converter가 등록되어 있음)

 

 

MVC & 템플릿 엔진 방식과 다른 점으로 @ResponseBody 어노테이션을 붙여 HTTP BODY로 리턴한다는 점과, ViewResolver가 강닌 HttpMessageConverter가 작동한다는 차이가 있다.

 

 

출처 : https://www.inflearn.com/course/스프링-입문-스프링부트/dashboard