[SpringBoot] 스프링 입문 - 스프링 웹 개발 기초(정적 컨텐츠, MVC, 템플릿 엔진, API)
* 정적 컨텐츠
: 파일을 그냥 그대로 웹 브라우저에 보여준다.
: url은 static 이후의 파일경로를 그대로 작성하면 된다. (ex. localhost:8080/hello.html)
※ url이 들어오면 먼저 1) 관련된 컨트롤러가 있는지 찾고, 없으면 2) static에서 보여줄 수 있는 파일이 있는지 찾는다.
만약 1)에 의해 찾은 파일들이라면 템플릿 엔진에 의해 가공된 후에 웹 브라우저에게 넘겨준다.
* MVC와 템플릿 엔진
: 서버에서 html을 바꿔서 보여준다.
◎ MVC (Model, View, Controller)
Model은 데이터와 비즈니스 로직을 관리한다.
View는 레이아웃과 화면을 처리한다. (많은걸 하려고 하지 말고 보여주는 역할에 충실히 하자!)
Controller는 명령을 모델과 뷰 부분으로 라우팅한다.
1
2
3
4
5
6
7
8
|
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
|
cs |
Line 4) @RequestParam([속성명]) [자료형] [매개변수명]
GET으로 데이터를 넘기는 방식과 같이, url에 [속성명]에 해당하는 값을 전달하면 helloMvc 메서드에서 그 값을 활용할 수 있다.
url에 값을 작성하는 방법은 ?를 붙이고 [속성명]=[속성값]으로 적어주면 된다. (ex. localhost:8080/hello-mvc?name=spring)
1
2
3
4
5
|
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
|
cs |
Line 3) 서버에서 전달받은 값은 ${[속성명]}을 통해 사용할 수 있다.
* API
: 서버,안드로이드에서 사용할 때 JSON 형태로 전달한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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; }
}
|
cs |
Line 2) @ResponseBody
html의 body부에 직접 데이터(반환값)를 넣는 것으로, 반환값 그대로 데이터를 만들어서 클라이언트에게 제공한다. (Json, String 형식)
HttpMessageConverter에 의해, 객체를 반환하면 JSON, 문자열을 반환하면 String으로 변환하여 클라이언트에게 넘겨준다.
helloApi 메소드에서 Hello라는 객체를 반환했으니 안에 있는 필드(name)와 그에 해당하는 값들을 JSON 형태로 전달한다.
?궁금증?
그럼 리스트같은 경우는 어떻게 반환할까?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
static class Hello {
private String name;
private int[] num = {1,2,3,4};
private double d = 2.5;
private char c = 'a';
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int[] getNum() { return num; }
public void setNum(int num) { this.num[0] = num; }
public double getD() { return d; }
public void setD(double d) { this.d = d; }
}
|
cs |
Line 5) setter, getter가 없으면 JSON으로 변환되지 않는다.
Line 10, 13) getter에 의한 값 그대로를 JSON에 나타낸다.