✓ 정적 컨텐츠: 서버에서 다른 특별한 동작 없이 html 파일 그대로 웹 브라우저(고객)로 전달하는 방식
스프링 부트는 정적 컨텐츠 기능을 자동제공 (static 폴더에서 찾아서 제공)
static 폴더 하위에 있는 파일들 == 정적 컨텐츠
→ 서버에서 웹 브라우저에게 hello-static.html , index.html 파일 자체를 단순하게 전달함.
URL) localhost:8080/"파일명".html 로 직접 접속 가능하다. (100% 동일한 파일 그대로 반환)
대신 별도의 추가적인 프로그래밍 불가능 (정적 컨텐츠니까...)
원리
웹 브라우저 → localhost:8080/hello-static.html 요청
톰켓 서버) (스프링 부트의) 내장 톰켓 서버가 요청 받아서 → 스프링에게 넘김
스프링 부트) "hello-static"과 mapping 된 컨트롤러가 있는지 스프링 컨테이너에서 찾음 → 없다
내부 resources 안 static폴더에서 해당 파일 찾아서 반환
즉 , (1) 동적 컨텐츠인지 먼저 확인 (관련 controller 존재하는지) 확인 하고 (2) 없을 경우 → (static 폴더 하위의) 정적 컨텐츠 찾아 반환.
2. MVC와 템플릿 엔진
MVC: Model, View, Controller [동적 문서를 제공하기 위해 필요한 3가지 요소]
- 이때 view는 템플릿 엔진 화면
템플릿 엔진 (jsp, php...) : 서버에서 별도의 프로그래밍 →동적 문서 제공
- view는 화면을 그리는데 초점이 맞춰져 있음 ⇔ controller, model은 비지니스 로직, 내부 처리에 초점
HelloController에 control 생성하기
* thymeleaf의 장점: 파일 경로를 그대로 열면 서버 없이도 브라우저로 확인 가능
- name이 입력 될 경우, hello! empty 부분이 hello + name으로 바꿔서 출력됨 (by 서버)
- 따라서 hello! empty 이부분은 빈 자리를 채워주는 땜빵이라고 보면 된다.
이후, localhost:8080/hello-mvc에 접속하면, 에러페이지 나옴. 왜?
name이 없어서 발생하는 오류
Ctrl + P 로 파라미터 옵션을 확인 가능하다.
→ default 값이 true인 required 옵션... 따라서 값을 아래와 같이 넘겨줘야 함
/hello-mvc?name="넘겨줄 값"
name = spring!으로 값이 넘어갔으므로 ${name} → spring! 으로 변경 돼서 출력됨
name = spring! 으로 controller 에 넘어감
→ hellomvc라는 controller에서 요청받은 param인 spring!으로 name 자리가 대체되어 model에 담김
- 정리하자면... 1. 웹브라우저에서 url로 입력한 값 (=/= html 이름) 2. 입력(url)을 통해 받아오는 값을 가리키는 키 (/hello-mvc?name=~~ 요거) → ?name뒤에 오는 값을 받아온다. 3-1. 서버 내에서 requestParam으로 받아온 값에 매핑되는 key ( ${ name} 에서 호출용으로 사용) 3-2. 동적 페이지에서 입력받은 값으로 대체될 값 (key가 자리채움) 4. 입력받은 값이 넘어갈 것 (String name; string형으로 받아온 변수 name의 값이 넘어감) 5. html 문서 반환할 때, 반환할 html 명
원리
웹 브라우저 → localhost:8080/hello-mvc?name=spring 요청
톰켓 서버] (스프링 부트의) 내장 톰켓 서버가 요청 받아서 → hello-mvc를 스프링에게 넘김
스프링 부트] "hello-static"과 mapping 된 컨트롤러가 있는지 스프링 컨테이너에서 찾음 → 있음!
helloController의 method에 mapping 되어 있음 (helloMvc) →해당 method 호출
model에게 key = name, value = spring으로 짝지은 값을 넣음
return할 때 hello-spring이란 이름을 스프링 부트에 넘겨줌
viewResolver(view를 찾아주고, 템플릿 엔진 연결해줌)가 templates 폴더 밑에, return 값으로 받아온 파일명과 동일한 html 파일을 찾아 thymeleaf 템플릿 엔진에게 넘김
템플릿엔진이 랜더링 후 변환한 html을 웹브라우저(고객)에게 넘김 (⇔ 정적일때는 변환 X)
자체적으로 변환 해 넘겼기 때문에 페이지 소스보기 하면 변환된 값으로 나옴
동적 컨텐츠 (templates/)에서는 변환이 필요하지만 (템플릿 엔진이 처리함) 정적 페이지 (static/) 는 변환 없이 바로 html 파일을 넘긴다.