백엔드/스프링

[SpringBoot] 스프링 입문 - 스프링 웹 개발 기초(정적 컨텐츠, MVC, 템플릿 엔진, API)

soeunkk 2021. 7. 25. 02:22

* 정적 컨텐츠

: 파일을 그냥 그대로 웹 브라우저에 보여준다.

: 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으로 변환하여 클라이언트에게 넘겨준다.

 

hello-api 결과

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에 나타낸다.

 

Hello 객체를 변경한 후 hello-api 결과