Spring - 2 웹개발 기초
해당 자료는 인프런 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹MVC, DB 접근 기술 강의 노트입니다.
1. 스프링 부트의 정적 컨텐츠
정적컨텐츠는 파일을 웹브라우저에 그대로 내려주는 형식을 말합니다.
요즘은 mvc방식을 사용하는데, html을 서버에서 데이터 처리 후 웹브라우저에 내려주는 형식입니다.
정적컨테츠를 사용하는 방식은 다음과 같습니다.
경로에 들어간 뒤 hello-static.html을 만들어줍니다.
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
코드를 작성해줍니다. http://localhost:8080/hello-static.html에 들어가시면 확인하실 수 있습니다.
스프링에서 동작하는 방식은 먼저 hello-static을 스프링에 넘기고 컨트롤러에서 먼저 hello-static이란 컨트롤러를 찾습니다.
컨트롤러가 없으면 resources에 있는 hello-static을 찾고 정적컨텐츠를 뿌려줍니다.
위의 코드에서는 hello-static이란 controller가 없기때문에 정적컨텐츠를 뿌려준 방식입니다.
2. MVC와 컨트롤 엔진
MVC란 Model, View, Controller입니다.
View란 홈페이지를 그리는데에 집중합니다.
Model과 Controller는 데이터 처리 등 비즈니스에 집중합니다.
간단한 예제를 만들어보겠습니다.
에 들어가 HelloController 파일에 다음과 같이 코드를 쳐줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name",required = true) String name,Model model){
model.addAttribute("name",name);
return "hello-template";
}
}
이제 View를 작성해야합니다. /resources/templates에 들어가 hello-template.html을 만들어줍니다.
코드를 작성해줍니다.
1
2
3
4
5
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
http://localhost:8080/hello-mvc로 들어가면 오류가 뜹니다.
왜냐하면 위에서 작성한 Controller에 helloMvc 파라미터를 보시면 ‘required = true’라고 되어있습니다.
이 뜻은 뒤에 작성한 name에 대한 요청값을 무조건 받아야한다고 명시한 것입니다. 때문에 http://localhost:8080/hello-mvc?name=spring이런식으로 작성하셔야합니다.
‘spring’ 말고도 ‘hello’ 등 이런식으로 바꾸셔도 됩니다.
3. API
위에서 작성한 controller에서 다음 코드를 추가햊부니다.
1
2
3
4
5
6
7
8
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
이렇게 작성하시면 return으로 본인이 작성한 ‘내용’인 hello’내용’이 출력됩니다.
ex)http://localhost:8080/hello-string?name=sentences
@ResponseBody를 사용하면 위에서 호출되는 viewResolver가 호출되지 않으며 HTTP의 BODY에 문자 내용을 직접 반환하는 형식으로 됩니다.
좀 더 직관적인 객체를 넘겨주는 예제를 들겠습니다. 똑같은 controller에 다음 코드를 추가해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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;
//get
public String getName() {
return name;
}
//set
public void setName(String name) {
this.name = name;
}
}
}
객체를 넘겨줄 땐 JSON형식과 XML형식으로 넘겨주는데, 별다른 지시가 없으면 JSON형태로 넘겨줍니다.
JSON은 키와 값을 가진 데이터형식이라 생각하시면 편합니다.
ex)http://localhost:8080/hello-api?name=Spring!
동작 방식을 설명하겠습니다. @ResponseBody를 사용하면 ‘ViewResolver’ 대신에 ‘httpMessageConverter’가 동작합니다.
문자열을 넘기면 ‘httpMessageConverter’속에 있는 ‘StringConverter’가 객체를 넘기면 ‘JsonConverter’가 호출됩니다. 해당 데이터에 맞게 알아서 호출되는 식입니다.
자세한 내용은 추후 다루겠습니다.