정적 컨텐츠
: 파일을 그대로 웹브라우저에 내려주는 것
원하는 파일을 그대로 내려주면 됨.
다만, 따로 파일에 프로그래밍 할 수 없음.
http://localhost:8080/hello-static.html 가 들어오면
톰캣은 hello-static.html이 왔다고 스프링으로 넘기고
스프링은 컨트롤러에서 hello-static이 있는지 확인. -> 우선 순위가 Controller
없으면 resources : static/hello-static.html을 찾아서 반환해줌
MVC와 템플릿 엔진
:서버에서 프로그래밍해서 html을 동적으로 바꿔서 내림
!템플릿엔진을 Model View Controller 방식으로 쪼개서
View를 템플릿엔진으로 html을 프로그래밍 한걸로 랜더링해서
클라이언트에게 html을 전달해준다.
Model View Controller
View : 화면에 관련된 일만 한다
Model에 , 필요한것을 담아서 화면쪽으로 넘겨준다.
Controller : 비즈니스 로직, 서버 뒷단 관련된 일을 함
타임리프 템플릿의 장점 : copy path - absolute path를 통해 서버 없이 해당 파일을 열어볼 수 있다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
타임리프 템플릿 엔진이 작동하면 hello! empty 부분이
'hello ' + ${name}
로 치환된다.
그럼 왜 hello! empty는 왜 적어둔거냐?
서버 없이 html 마크업 해주시는 분들이 볼 수 있게.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {//외부에서 받을거임
model.addAttribute("name", name);
return "hello-template";
}
위 상태로 바로 서버를 돌리게 되면
Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]
에러가 난다.
Required string paramer name이 없다 ->
^+P : 옵션 추가 단축키
옵션 required default는 true이다. 따라서 무조건 값을 넘겨야한다.( false로 하고싶다면 따로 적어줘야한다.)
?name= 을 통해 파라미터를 넘겨줄 수 있다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(name = "name") String name, Model model) {
model.addAttribute("name",name);
return "hello-template";
}
name은 spring!으로 바뀌고 모델에 담겨서 템플릿으로 넘어가서
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
${name} 또한 spring!으로 치환해준다.
엔진 동작 이미지 설명
: 웹 브라우저가 localhost:8080/hello-mvc 를 내장 톰캣 서버에 넘기면 톰캣이 hello-mvc 가 왔다고 스프링에 던진다.
스프링은 helloController에 hello-mvc가 매핑된것을 확인 -> 해당 메소드 호출
model은 아까 name:String 으로 넣어주었고, hello-template을 리턴하게 된다.
이 사항을 스프링에 넘겨줌.
viewResolver (화면과 관련된 해결자)가 동작하게 됨
:View(여기서는 hello-template)을 찾아서 템플릿 엔진을 연결해줌
템플릿 엔진이 렌더링을 해서 변환 한 html을 웹 브라우저에 반환을 해준다.
API
: 데이터로 바로 내려줌.
ex) 서버끼리 통신할 때
@ResponseBody 사용
: http에는 헤더부와 바디부가 있다.
http 바디부에 이 데이터를 직접 넣어 주겠다는 것.
* 문자를 반환
@GetMapping("hello-string")
@ResponseBody
public String hellostring(@RequestParam("name") String name){
return "hello" + name; //"hello spring"
}
* 객체를 반환
@ResponseBody를 사용하고, 객체를 반환하면객체가 JSON으로변환된다.
json : key , value로 이루어진 구조이다.
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
웹브라우저에서 localhost:8080/hello-api를 톰캣 서버에 던진다.
톰캣을 스프링에 hello-api가 왔다고 던짐.
스프링은 controller에서 hello-api를 찾게 되고
근데 @ResponseBody가 붙어 있는것을 확인
안붙어 있으면 ViewResolver에게 던졌는데
http 응답에 데이터를 그대로 던져줌
하지만 객체가 왔으므로
객체가 오면 default : json 방식으로 데이터를 만들어서 http 응답에 반환.
HttpMessageConverter가 동작한다.
단순 문자 : StringConverter가 동작
객체 : JsonConverter 가 동작
-> hello 객체를 Json 스타일로 바꾼다
바꾼것을 웹브라우저로 보내준다
-Jackson 라이브러리 : 객체를 Json으로 바꿔준다.
'스프링 > 스프링 입문' 카테고리의 다른 글
6/30 스프링 DB 접근 기술(1) (0) | 2022.07.02 |
---|---|
6/30 스프링 입문 - 웹 MVC 개발 (0) | 2022.06.30 |
6/30 스프링 입문 - 스프링 빈과 의존관계 (0) | 2022.06.30 |
6/29 스프링 입문 - 회원관리 예제 (0) | 2022.06.29 |
6/29 프로젝트 환경설정 (0) | 2022.06.29 |