정적 컨텐츠
section1 때 welcome page처럼 어떠한 변형없이 파일을 그대로 전달
resources/static/hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
서버 가동 후 localhost:8080/hello-static.html 접속하면 어떠한 변형 없이 화면 실행
동작 환경 그림
- 웹 브라우저가 localhost:8080/hello-static.html을 스프링 부트 내장 톰켓 서버에게 전달
- 톰켓 서버는 스프링 컨테이너에 hello-static 관련 controller가 있는 지 확인
- 관련 consroller가 없으면 resources/static 폴더에 hello-static 이름에 html 파일이 있는 지 확인
- 해당 html 파일을 웹 브라우저에게 전달
MVC와 템플릿 엔진
그대로 전달하는 것이 아닌 원하는 모형대로 변형 후 전달
Model, View, Controller로 구성
Controller
src/main/java/hello.hellospring/controller/HelloController
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
View
src/main/resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
thymeleaf의 장점은 서버 없이도 html 코드를 어느 정도 볼 수 있다는 점이다.
html 파일 우클릭 -> copy Path/reference -> Absolute path 후 접속하면 hello! empty가 나온다.
서버를 통해 열면 hello! empty가 나오지 않고 그 대신 thymeleaf를 통한 th: 관련 문구가 나온다.
즉, hello! empty를 작성한 이유는 서버 없이 파일을 확인할 때를 위한 것이다!
서버를 킨 후 localhost:8080/hello-mvc?name=spring 으로 접속
?name=spring을 넘겨줘야 하는 이유는
RequestParam은 required=true를 기본값으로 가지고 있기 때문에 값을 무조건 넘겨주어야 한다.
값을 넘기고 싶지 않다면 required=false를 작성해주면 된다
동작 환경 그림
- 웹 브라우저가 localhost:8080/hello-mvc을 스프링 부트 내장 톰켓 서버에게 전달
- 톰켓 서버는 스프링 컨테이너에 hello-mvc 관련 controller가 있는 지 확인
- hello-mvc를 받은 경우 GetMapping 밑에 코드가 실행
- 파라미터 name 값을 name으로 담은 model을 생성해서 hello-template에 return
- viewResolver가 templates 안에 hello-template.html을 읽음
- model 안에 name 값을 가져와서 html 변환 후 웹 브라우저에게 전달
API
JSON 데이터 구조로 클라이언트에게 데이터 전달
@ResponseBody 문자 반환
- viewResolver를 사용하지 않는 대신 http의 body에 문자 내용을 직접 반환
src/main/java/hello.hellospring/controller/HelloController
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
서버 가동 후 localhost:8080/hello-spring?name=spring
템플릿 엔진과의 차이점
- 템플릿 엔진으로 로컬 서버 접속 후 코드 확인(F12)
- API로 로컬 서버 접속 후 코드 확인
@ResponseBody 객체 반환
src/main/java/hello.hellospring/controller/HelloController
@Controller
public class HelloController {
@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-spring?name=spring 하면 아래와 같이 나온다.
@ResponseBody를 사용하고 객체를 반환하면 객체가 JSON으로 변환된다.
XML도 과거에 많이 사용됐다. ex) <html></html>
하지만 JSON은 {key:value}로 심플한 구조라서 현재는 기본인 JSON
Getter, Setter
변수가 private이니까 외부에서 바로 사용하지 못한다.
그래서 getter, setter 메소드를 통해서 접근해야한다.
프로퍼티 접근 방식, 자바빈(javabeans) 규약이라고도 불린다.
동작 환경 그림
- 웹 브라우저가 localhost:8080/hello-api을 스프링 부트 내장 톰켓 서버에게 요청
- 톰켓 서버는 스프링 컨테이너에 hello-api 관련 controller가 있는 지 확인
- @ResponseBody가 붙어있어서 http의 body에 문자 내용을 직접 반환
- 반환값이 문자가 아닌 객체라서 HttpMessageConverter가 동작. 단순 문자면 StringConverter, 객체면 JsonConverter가 동작
- JsonConverter로 JSON 형태로 데이터를 만들어서 반환. 이게 기본 정책임.
'JAVA > [인프런] 스프링 강의들' 카테고리의 다른 글
[인프런] 스프링 입문 강의 Section4. 스프링 빈과 의존관계 (0) | 2023.07.04 |
---|---|
[인프런] 스프링 입문 강의 Section3. 회원 관리 예제 - 백엔드 개발 (1) | 2023.07.03 |
[인프런] 스프링 입문 강의 Section1. 프로젝트 환경 설정 (0) | 2023.07.03 |
[서버 개발 올인원 패키지] 7. 생애 최초 배포하기 (0) | 2023.04.16 |
[ 서버 개발 올인원 패키지] 6. 생애 최초 배포 준비하기 (0) | 2023.03.09 |