spring

3. 스프링 웹 개발 기초 (정적 컨텐츠, MVC와 템플릿 엔진, API)

희구 2021. 7. 22. 00:58

스프링 웹 개발 기초

  • 정적컨텐츠 : 파일을 웹브라우저에 그대로 내려주는 것
  • MVC와 템플릿 엔진 : 예를 들어 과거의 JSP같은 것..                                                                              (이런게 소위 말하는 템플릿 엔진. HTML을 동적으로 바꿔 내림)
    [정적컨텐츠와의 차이 ] 
    - 정적컨텐츠: 파일을 그대로 고객에게 보여줌
    - MVC와 템플릿 엔진 : 서버에서 HTML을 조금 바꿔서 내려주는 방식
  • API : JSON형식으로 클라이언트에게 데이터를 전해줌 서버끼리 통신할때 --> API방식 많이 씀

 


1) 정적컨텐츠

: 스프링부트는 기본적으로 정적컨텐츠를 제공한다.

resources -> static 폴더에 hello-static.html 파일 생성

html 코드 입력후 실행.

결과창

주소창에 localhost:8080 + 파일명 그대로 입력하면 내가 작성한 대로 글씨가 뜬다.

 

 

--->원하는 파일을 그대로 넣으면 정적컨텐츠가 그대로 화면에 출력됨!

 

정적컨텐츠의 원리

1. 웹브라우저에 주소를 친다. (localhost:8080/hello-static.html)

2. 내장 톰켓서버가 요청을 받음

3. 스프링에게 요청을 보냄

4. 컨트롤러쪽에서 먼저 hello-static 관련 파일을 찾아본다. 

5. 컨트롤러에 이와 관련된 파일이 없으면 resources안에 있는  hello-static.html을 찾는다

6. 파일을 발견하면 웹브라우저로 hello-static을 반환해준다.

 

 

 

 

2) MVC와 템플릿 엔진

-MVC : Model, View, Controller

필요한건 컨트롤러에서 처리하고 모델에 담아서 뷰에 보냄?

 

관심사를 분리해야한다!

  • Mode, Controllerl : 비지니스 로직과 관련, 내부적인걸 처리할때!
  •  View: 화면을 그리는데에 모든 역량을 집중!

 

Controller

@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
 	model.addAttribute("name", name);
 	return "hello-template";
   }
}

 

View

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

그냥 주소창에 치면 에러가 뜬다.

에러메세지

에러내용: "name"값이 없다. name값을 넣어라

여기선 required 기본값이 true이기 때문에 무조건 값을 넘겨야한다.

 

어떻게 넘기느냐?

이렇게 get방식으로 주소창에 직접! ?name=~~~라고 친다.

그러면 그대로 나옴.

 

HelloController.java

1.name이 spring이 됨.

2. spring이란 name이 model에 담겨

3. hello-template으로 리턴됨.

 

hello-template.html

템플릿파일에서 ${name}값이 spring으로 ..

모델에서 값을 꺼냄! 모델안의 spring이란 네임값을 꺼냄.

 

MVC/템플릿엔진의 원리

1.웹브라우저에서 localhost:8080/hello-mvc를 넘긴다.

2.스프링부트에서 내장톰켓서버를 먼저 거친다.

3.내장 톰켓서버는 받은 mvc를 스프링에게 던진다.

4.스프링은 컨트롤러에 매핑되어있는 메소드를 매칭해줌.

5.스프링이 viewResolver가 동작 (템플릿엔진 처리)

6. 뷰리졸버가 템플릿츠에 헬로-템플릿을 찾아서 템플릿 엔진에게 처리하라고 넘기면

7.템플릿 엔진에 변환한 html을 웹 브라우저에 넘긴다.

 

 

 

3)API

 

주소창에 "http://localhost:8080/hello-string?name=spring!!!" 검색

 

결과화면
페이지 소스보기

페이지 소스에 html코드 하나 없이 데이터가 그대로 나옴.

 

 

 

 

주소창에 "http://localhost:8080/hello-api?name=spring!!!"  검색

결과화면

{"name" : "spring!!!"} --> json형식으로 출력됨

  { key  : value }

 

 

html은 태그를 열고 닫고 해야하는데 json은 { key  : value } 로 간단하다.

그래서 요즘은 json방식을 많이 선호한다.

 

 

 

@ResponseBody 를 사용원리

 : 문자열이라면 그대로 넘기겠지만 객체가 오면 기본 디폴트가 제이슨방식으로 데이터를 만들어서 반환한다.

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter (Jackson이라는 라이브러리로 Json형식으로 바꾼다)
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

 

 


[정리]

  • 정적컨텐츠: 그냥 파일을 그대로 내려준다.
  • MVC와 템플릿 엔진 : 템플릿 엔진을 모델 뷰 컨트롤러 방식으로 쪼개서 뷰를 템플릿 엔진으로 렌더링한 후 렌더링 된 html을 고객에게 전달
  • API: 뷰 없이 제이슨 형식으로 객체반환