[์คํ๋ง๋ถํธ ์ ๋ฌธ] 2. ์คํ๋ง ์น ๊ฐ๋ฐ ๊ธฐ์ด
๊ฐ๋ฐ์ ํ๊ธฐ ์ ์คํ๋ง์์ ์น์ ๊ฐ๋ฐํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ๋จํ ์ดํด๋ณด๋๋ก ํ์. ํฌ๊ฒ ์ ์ ์ปจํ ์ธ , MVC์ ํ ํ๋ฆฟ์์ง, API ๋ฐฉ์์ผ๋ก ๋๋๋ค.
์ ์ ์ปจํ ์ธ
์ค์ต
์ ์ ์ปจํ ์ธ ๋ ์๋ฒ์์ ๋ฐ๋ก ์์ ์ ํ์ง ์๊ณ ๊ทธ๋๋ก ํ์ผ์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ด๋ ค์ฃผ๋ ๊ฒ์ด๋ค. ์ ์ ์ด๋ผ๋ ๋ง ๊ทธ๋๋ก ๋ฐ๋์ง ์๋ ์ปจํ ์ธ ์ด๋ค.
main/resources/staticํด๋์ hello-static.htmlํ์ผ์ ์์ฑํ๊ณ (cmd+n) ์๋ ์ฝ๋๋ฅผ ๋ฃ์ด๋ณด์.
<!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์์ฒญ์ด ์จ ๊ฒ์ ๋ณด๊ณ ๋ด์ฅ๋ Tomcat์๋ฒ์์ ์คํ๋ง์๊ฒ hello-static.html์ด๋ผ๋ ์์ฒญ์ด ์์์ ์๋ ค์ค๋ค. ๊ทธ๋ฌ๋ฉด ์คํ๋ง์ ์ปจํธ๋กค๋ฌ์์ hello-static์ด ์๋์ง ๋จผ์ ์ดํด๋ณธ๋ค. ๋ ๋ค ์์ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง์ ์ ์ํ์. ๋งคํ๋ ์ปจํธ๋กค๋ฌ๊ฐ ์์ผ๋ ์คํ๋ง์ resourcesํด๋์์ hello-static.htmlํ์ผ์ ์ฐพ๋๋ค. ๊ทธ๋ ๊ฒํด์ ์์ผ๋ฉด ์ด ํ์ผ์ ๋ฆฌํดํด์ฃผ๋ ๊ฒ์ด๋ค.
ํ ํ๋ฆฟ ์์ง
์ค์ต
main/resources/templatesํด๋์ hello.htmlํ์ผ์ ํ๋ ์์ฑํ๊ณ (cmd+n) ์๋ ์ฝ๋๋ฅผ ๋ฃ๋๋ก ํ์.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'์๋
ํ์ธ์. ' + ${data}" >์๋
ํ์ธ์. ์๋</p>
</body>
</html>
๊ทธ๋ฆฌ๊ณ com.example.hello์ controller ํจํค์ง๋ฅผ ๋ง๋ค๊ณ HelloControllerํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์์ฑํ๋๋ก ํ์.
package com.example.hello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello");
return "hello";
}
}
๊ทธ๋ ๊ฒ ํ๊ณ localhost:8080/hello
๋ก ์ ์ํ๋ฉด ์๋
ํ์ธ์. hello๊ฐ ์ถ๋ ฅ๋๋ค. ์ด์ ์ด๋ ๊ฒ ์๋ํ ์๋ฆฌ๋ฅผ ํ์
ํด๋ณด๋๋ก ํ์.
๋์ ์๋ฆฌ
์น๋ธ๋ผ์ฐ์ ์์ localhost:8080/hello
๋ผ๋ ์์ฒญ์ด ์ค๋ฉด (๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์์ผ๋ ๋น์ฐํ GET์์ฒญ์ด๋ค.) Spring Boot์ ๋ด์ฅ๋ Tomcat์๋ฒ์์ Spring์๊ฒ ํด๋น ์์ฒญ๊ณผ ๋งคํ๋ ๋ฉ์๋๊ฐ ์๋์ง ๋ฌผ์ด๋ณธ๋ค. ์คํ๋ง์ @GetMapping(”hello”)
๋๋ถ์ hello์ ๋งคํ๋ hello๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์๊ณ , ์ด ๋ฉ์๋๋ฅผ ์คํํ๋ค.
public String hello(Model model){
model.addAttribute("data","hello");
return "hello";
}
๋ฉ์๋๊ฐ ์คํ๋๋ฉด์ model์ data๋ผ๋ ํค์ hello๋ผ๋ ๊ฐ์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ hello๋ฅผ ๋ฆฌํดํ๋ค. ์คํ๋ง๋ถํธ ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์ปจํธ๋กค๋ฌ์์ return๊ฐ์ผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ๋ฉด viewResolver๊ฐ ํ๋ฉด์ ์ฐพ์์ ์ฒ๋ฆฌํด์ค๋ค. ์ฆ templatesํด๋์์ hello.html์ ์ฐพ์ ํ๋ฉด์ ๋์์ฃผ๊ฒ ๋๋๋ฐ, ๊ทธ ์ ์ Thymeleaf๊ฐ ${data}๋ถ๋ถ์ ์์ ์ ์ฅํ hello๋ผ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด๋ค.
API
์ค์ต
์์ ๋ง๋ HelloController์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋๋ก ํ์.
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam(value = "name", required = false)String name){
return "hello " + name;
}
@GetMapping("hello-object")
@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;
}
}
๊ทธ๋ฆฌ๊ณ http://localhost:8080/hello-string?name=kite
๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๊ฒ์ํ๋ฉด ๊ธฐ๋ํ๋๋๋ก hello kite๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ http://localhost:8080/hello-object?name=kite
๋ผ๊ณ ์น๋ฉด{"name":"kite"}
์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ๋ด๋ถ์ ์ผ๋ก ์ผ์ด๋๋ ์ผ์ ์ดํด๋ณด๋๋ก ํ์.
๋์ ์๋ฆฌ
๋จผ์ ์ฃผ๋ชฉํด์ผ ํ ์ ์ @ResponseBody
๋ผ๋ ์ด๋
ธํ
์ด์
์ด๋ค. hello-string์์ฒญ์ด ์์์ ํฐ์บฃ ์๋ฒ๊ฐ ์คํ๋ง์๊ฒ ์๋ ค์ฃผ๋ฉด ์์ ๋ดค๋๋๋ก ์คํ๋ง์ Controller์ hello-string์ด ์๋์ง๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฐ๋ฐ ํด๋น ์ปจํธ๋กค๋ฌ์๋ @ResponseBody
์ด๋
ธํ
์ด์
์ด ๋ถ์ด์๋ค. ์ฌ๊ธฐ์์ body๋ http ํค๋-๋ฐ๋ ํ ๋ ๊ทธ body์ด๋ค. ๊ทธ body๊ฐ์ ์กฐ์ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋ด๋ถ์ ์ผ๋ก HttpMessageConverter์ด ๋์ํ๋ค. ์ด๋ ๋ฆฌํด๊ฐ์ด ๋ฌธ์๋ผ๋ฉด StringConverter์ด ๋์ํ๊ณ ๊ฐ์ฒด๋ฉด JsonConverter๊ฐ ๋์ํ๋ค.
์ฐธ๊ณ ๋ก httpํค๋์๋ Accept๋ผ๋ ํ๋๊ฐ ์๋๋ฐ ๊ทธ๊ณณ์์ json์ด๋ผ๋ ์์ฒญ์ด ์ค๋ฉด json์ด๋ผ๊ณ ๋ณด๋ด๊ณ xml๋ก ๋ณด๋ด๋ฉด xml๋ก ๋ณํํด์ ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์คํ๋ง์ด ์์์ ๋ณํํด์ ๋ณด๋ธ๋ค. ์ฆ HTTP acceptํ๋์ ์๋ฒ ์ปจํธ๋กค๋ฌ ๋ฐํ ํ์ ์ ์ ๋ณด๋ฅผ ์กฐํฉํด์ ์ ์ ํ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ์ ํ๋๊ณ , ์ปจํธ๋กค๋ฌ ๊ฐ์ ๋ณํํด์ ๋ฐํํ๋ ๊ฒ์ด๋ค.