Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 02:09
Archives
Today
Total
관리 메뉴

Developer_Neo

[Spring] - 프로젝트 폴더 안의 static폴더와 templates 폴더, MVC와 탬플릿 엔진, API 본문

Spring

[Spring] - 프로젝트 폴더 안의 static폴더와 templates 폴더, MVC와 탬플릿 엔진, API

_Neo_ 2022. 8. 2. 21:32
반응형

프로젝트 폴더 안의 static폴더와 templates 폴더

프로젝트를 생성하고, 위의 폴더로 들어가보면 
resources/static과 resources/templates에 해당하는 폴더가 각각 존재하게 된다
static폴더에는 정적인 콘텐츠가 들어간다. 즉, 정적인 콘텐츠로 HTML자체를 브라우저에게 준다
templates에는 View로써 동적으로?  Controller에 의해 불려지는 것들이 들어가게 된다. 즉, 동적인 컨텐츠로 우리가 코드로 적은 Data값들이 가공되어 들어간다음 이 가공된 HTML을 브라우저에게 준다.(SSR인 서버 사이드 랜더링이라고 할 수 있다.)

  

눈으로 보이는 차이점은 URI를 입력할 때 보인다.
templates에 있는 것은 URI 입력 시 http://localhost:8080/hello로써 뒤에 html을 안붙여도 되지만
static에 있는 파일은 URI 입력 시 http://localhost:8080/hello-static.html로써 뒤에 .html을 붙여주어야한다 (.html을 안붙여주면 해당 HTML로 작성한 것이 보이지 않는다.)
밑에서 더 정확하게 설명합니다.

정리,
확장자가 없는 요청일 경우 

요청 처리 핸들러를 탐색하여 return "html이름" templates/ 하위에 존재하는 "html이름" 을 찾아갑니다.

 

정적 콘텐츠는 hello-static.html을 뜻하고,  MVC방식이용한 것은 hello.html이다

위의 설명의 직접적인 예

 

위에서 설명한 확장자 관련해서 더 자세히 정확하게 이야기하자면,
확장자가 붙어 있든, 안 붙어 있든 스프링 컨테이너내에 있는 컨트롤러에서 먼저 찾아봅니다. 이때 @GetMapping(______) 에 해당하는 ____에 만약 hello-static.html이 있다면 Controller가 동작하여 templates 하위에 있는 hello-static.html을 찾아가고, 
만약 컨트롤러에 hello-static-html이 없다면
static 하위에 있는 hello-static.html을 찾아가게 됩니다.
즉, Controller가 우선순위를 가지게 됩니다.

 


정적 콘텐츠 방식을 제외하면 
1. MVC방식에서 View를 찾아 템플릿 엔진을 통해 화면을 랜더링하여 HTML을 브라우저에 넘겨주는 방식
2. API쓰는 방식

즉, 정적인 콘텐츠 방식을 제외하면,
랜더링한 HTML을 넘겨주냐 Data를 직접 넘겨주느냐로 나뉜다.

 

이제 위에서 말한 2가지를 살펴보자.


MVC와 탬플릿 엔진

 

MVC란?

MVC패턴이라고도 합니다. 이것은 디자인 패턴 중 하나입니다.
Model, View, Controller의 약자로 하나의 애플리케이션(예) 카카오톡), 프로젝트를 구성할 때 그 구성 요소를 세가지의 역할로 구분한 패턴입니다.

 

https://m.blog.naver.com/sejun3278/221575009683

사용자가 Controller를 조작하면 Controller는 Model을 통해서 
데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 됩니다.

Model : 어플리케이션의 정보나 데이터, DB 등을 말합니다. - view에 랜더링할 때 사용
View : 사용자에게 보여지는 화면, UI를 말합니다. 모델로부터 정보를 얻고 표시합니다.
Controller : 데이터와 비즈니스 로직 사이의 상호 동작을 관리합니다. 즉, 모델과 뷰를 통제합니다. MVC 패턴에서 View와 Model이 직접적인 상호 소통을 하지 않도록 관리합니다.

 

위의 코드를 보면 @RequestParam을 보면 URI로써  http://localhost:8080/hello-mvc 뒤에 ?name=아무거나11 로 덧붙여서 보내지 않는다면 error가 나게 된다. 왜냐하면 위의 코드처럼 기본적으로 required가 ture이기 때문에 name에 해당하는 요청 파라미터가 들어오지 않는다면 error가 나는 것이기 때문이다.

자세히 보면 Controller에서 name이 아무거나11로 되고 Model의 키 ,value로 name과 아무거나11으로 viewResolver에 전달해준다, html코드를 보면 이것이 View에 해당하는 것으로 Model을 가지고선 정보를 얻어내어 viewResolver가 name에 아무거나11로 변환해 브라우저에 띄어준다.


정적인 콘텐츠와 다른점!
정적인 콘텐츠는 변환을 하지 않는다
MVC패턴은 viewResolver를 통해 변환 후 HTML을 넘겨준다.

 

템플린 엔진이란?

지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어입니다. 웹사이트 화면을 어떤 형태로 만들지 도와주는 양식
스프링은 거의 SSR방식으로 서버에서 DB 혹은 API에서 가져온 데이터를 미리 정의된 Template에 넣어 Html을 그려서 클라이언트에 전달해주는 역할을 한다.

 


API방식

@ResponseBody

이 어노테이션을 쓰면 ViewResolver를 사용하지 않습니다.
이것은 브라우저에서 요청 받은 URI로 response할때 HTTP의 body에 이 어노테이션을 사용하는 메서드의 return값에 해당하는 것을 넣어 줍니다.

그래서 이것은 GetMapping으로 들어온 URI-path를 기준으로 static폴더에 존재하는 파일을 전달하거나, templates폴더에 존재하는 파일에 Model의 데이터를 넣어 변환해주지 않습니다.

하지만, 브라우저에서 볼때에는 마치 HTML처럼 보일 수 있습니다. 알아서 HTML형식으로 변환하여 보내주는 것 같다..?

위의 코드를 쓸일은 거의 없다.

 

밑의 코드로 많이 사용한다고 한다.

위와 같이 되는데 객체를 반환하면서 @ResponseBody설정이 되어 있다면 json으로 반환하는 것으로 스프링에 기본으로 설정되어 있다.

 

정리하면,
@ResponseBody라는 어노테이션이 설정되어 있다면, viewResolver를 사용하는 것이 아닌 HTTP response의 바디에 return값을 그냥 넘겨야겠구나하며 작동된다.
그런데 return값이 문자 또는 객체가 될 수 있다.
return이 되면 HttpMessageConverter라는 것이 동작된다.(@ResponseBody이 설정되어 있기 때문에)
HttpMessageConverter는 JsonConverter와 StringConverter 두종류로 나뉘는데 return값이 객체인 경우, 문자인 경우에 각각 동작한다.
문자인 경우에는 StringConverter로 HTTP reponse의 바디에 그냥 넣어서 주었는데
객체인 경우에는 규약으로 정해놓았다. 객체 인 경우  JsonConverter로 json방식으로 data를 만들어서 HTTP Response의 바디에 넣는다.

즉, @ResponseBody사용시, viewResolver 대신 HttpMessageConverter가 동작되고,
return값이 기본 문자이면 StringHttpMessageConverter가 동작하고,
기본 객체이면  MappingJackson2HttpMessageConverter가 동작된다.

 

객체를 json으로 바꾸어주는 라이브러리 - Jackson, GSON

 

출처 : 김영한 스프링 입문 강의

반응형
Comments