์ด ์๋ฃ๋ "์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ ์
๋ฌธ" ์๋ฆฌ์ฆ์ ๋ง์ง๋ง ๋ถ๋ถ์
๋๋ค. ์ด์ ๊ธฐ์ฌ:
Spring-MVC๋ฅผ ์๋ก ๋ค์ด ๊ฐ์ฅ ๊ฐ๋จํ MVC ๊ตฌํ ์๋ฅผ ์ดํด๋ณด์. ์ด๋ฅผ ์ํด spring-boot์์ ์์ Hello World ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์ง์ ๋ฐ๋ณตํ ์ ์๋๋ก ๋จ๊ณ๋ณ ์ง์นจ์ ์ ๊ณตํ๊ฒ ์ต๋๋ค. ๋จผ์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ๋ค์ ์ด๋ฅผ ๋ถ์ํ๊ฒ ์ต๋๋ค.
1๋จ๊ณ: IntelliJ IDEA์์ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์์ฑ
ํ์ผ -> ์๋ก ๋ง๋ค๊ธฐ -> ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ... ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฆฌ๋ ์ฐฝ์ ์ผ์ชฝ ๋ฉ๋ด์์ Spring ์ด๊ธฐํ๋ฅผ ์ ํํ๊ณ ํ๋ก์ ํธ SDK๋ฅผ ์ ํํ ํ ์ด๊ธฐํ ์๋น์ค URL ์ต์
์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ก๋๋ค.
๋ค์ ๋ฒํผ์ ํด๋ฆญํ์ธ์. ๋ค์ ์ฐฝ์์๋ ํ๋ก์ ํธ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ Maven ํ๋ก์ ํธ๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ ํ - Maven ํ๋ก์ ํธ๋ฅผ ์ ํํ๊ณ ๊ทธ๋ฃน ๋ฐ ์ํฐํฉํธ๋ฅผ ์
๋ ฅํ ํ
๋ค์์ ํด๋ฆญํ์ญ์์ค. ๋ค์ ์ฐฝ์์๋ ์ฌ์ฉํ Spring Framework ๊ตฌ์ฑ ์์๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง๋ง ํ์ํฉ๋๋ค:
- Spring Web์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํฌ๋ํธ์
๋๋ค. ์ด ๊ตฌ์ฑ ์์์๋ Spring MVC๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- Thymeleaf - ์์ ํ
ํ๋ฆฟ ์์ง์
๋๋ค. Java์์ HTML ํ์ด์ง๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ
๋ค์ ์ฐฝ์์ ํ์ผ ์์คํ
์ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์์น๋ฅผ ์ ํํฉ๋๋ค.
๋ง์นจ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. ํ๋ก์ ํธ๊ฐ ์์ฑ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์์๋ pom.xml - ๋ฐฐํฌ ์ค๋ช
์๋ผ๋ ๋ ๊ฐ์ ํ์ผ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ค์ํ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ก์ ํธ๋ก ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ด์
๋ธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ฅ๋ ์์ต๋๋ค. ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ Maven์ ์ฌ์ฉํ์ฌ ๋น๋๋์์ผ๋ฉฐ pom.xml์ ์ด ๋น๋ ์์คํ
์ ๊ตฌ์ฑ ํ์ผ์
๋๋ค. Java ํด๋์ค - MvcDemoApplication. ์ด๊ฒ์ ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ํด๋์ค์
๋๋ค. ์์ํ๋ ค๋ฉด ์ด ํด๋์ค์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค. ๋ค์์ ์ด ํด๋์ค์ ์ฝ๋์ pom.xml ํ์ผ์
๋๋ค. MvcDemoApplication:
@SpringBootApplication
public class MvcDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MvcDemoApplication.class, args);
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.javarush</groupId>
<artifactId>mvc_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mvc_demo</name>
<description>Spring MVC Demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2๋จ๊ณ. ์นํ์ด์ง ์์ฑ
์ฐ๋ฆฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๊ธฐ๋ณธ ํ์ด์ง์ธ index.html์ด ์๊ณ ๊ทธ ์์ ํ์ ํ์ด์ง์ธ Greeting.html์ ๋ํ ๋งํฌ๊ฐ ์์ต๋๋ค. ์ธ์ฌ๋ง ํ์ด์ง์๋ ์ธ์ฌ๋ง์ด ํ์๋ฉ๋๋ค. URL ๋งค๊ฐ๋ณ์๋ฅผ ํตํด Greeting.html ํ์ด์ง์ ์ธ์ฌ๋ง ์ด๋ฆ์ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ํ์ด์ง์ธ index.html์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Main page</title>
</head>
<body>
<p>Get your greeting <a href="/greeting">here</a></p>
</body>
</html>
์ด์ Greeting.html ํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>
์ฌ๊ธฐ์๋ ๋น์ ํ HTML ํ์ด์ง์์ ํ๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํ๊ทธ
<p th:text="'Hello, ' + ${name} + '!'" />
์์ฑ์ Thymeleaf ํ
ํ๋ฆฟ ์์ง์ ๋๊ตฌ์
๋๋ค. ๋๋ถ์ ํ๊ทธ์ ๊ฐ์ "Hello"๋ผ๋ ํ
์คํธ + Java ์ฝ๋์์ ์ค์ ํ ๋ณ์์ ๊ฐ์ด ๋ฉ๋๋ค .
th
p
p
name
3๋จ๊ณ: ์ปจํธ๋กค๋ฌ ์์ฑ
mvc_demo ํจํค์ง ๋ด์์ ์ปจํธ๋กค๋ฌ ํจํค์ง๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ ์ปจํธ๋กค๋ฌ HelloWorldController๋ฅผ ์์ฑํฉ๋๋ค.
@Controller
public class HelloWorldController {
@RequestMapping(value = "/greeting")
public String helloWorldController(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
ํํธ์ผ๋ก๋ ์ฝ๋๊ฐ ๊ฑฐ์ ์์ง๋ง ๋ค๋ฅธ ํํธ์ผ๋ก๋ ๋ง์ ์ผ์ด ์งํ๋๊ณ ์์ต๋๋ค. ๋ถ์์ ์์ํ๊ฒ ์ต๋๋ค. @Controller ์ฃผ์์ ์ด ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ์์ ๋ํ๋
๋๋ค. Spring์ ์ปจํธ๋กค๋ฌ๋ ํน์ ์ฃผ์์ ๋ํ HTTP ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฐ๋ฆฌ ํด๋์ค์๋ @RequestMapping(value = "/greeting")์ด๋ผ๋ ์ฃผ์์ด ํ์๋ helloWorldController ๋ฉ์๋๊ฐ ์์ต๋๋ค. ์ด ์ฃผ์์ ์ด ๋ฉ์๋๊ฐ /greeting ์ฃผ์์ ๋ํ HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ์๋ ค์ค๋๋ค. ์ฆ, ๋๊ตฐ๊ฐ๊ฐ /greeting๋ก ์ด๋ํ๋ฉด ์ด ๋ฐฉ๋ฒ์ด ์๋ํฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. Spring-MVC์ ๋ฐ๋ฅด๋ฉด ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ ๋ทฐ์ ์ด๋ฆ์ ๋ฐํํด์ผ ํฉ๋๋ค. ๋ค์์ผ๋ก Spring์ HTTP ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ๋ฐํ๋ ๋์ผํ ์ด๋ฆ์ html ํ์ผ์ ์ฐพ์ต๋๋ค. ๋ณด์๋ค์ํผ, ์ฐ๋ฆฌ์ ๋ฉ์๋๋ ์ด์ ์ ๋ง๋ ์นํ์ด์ง์ ์ด๋ฆ์ธ Greeting์ ๋ฐํํฉ๋๋ค. ์ฐ๋ฆฌ์ ๋ฐฉ๋ฒ์ 2๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋งค๊ฐ๋ณ์ 1: @RequestParam(name = "name", ํ์ = false, defaultValue = "World") ๋ฌธ์์ด ์ด๋ฆ. @RequestParam ์ฃผ์์ String name ๋งค๊ฐ๋ณ์๊ฐ url ๋งค๊ฐ๋ณ์์์ ๋ช
์ํฉ๋๋ค. ์ฃผ์ ๊ดํธ๋ URL์์ ์ด ๋งค๊ฐ๋ณ์๊ฐ ์ ํ์ฌํญ(ํ์ = false)์์ ๋ํ๋
๋๋ค. ์ด ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ๋ฌธ์์ด ์ด๋ฆ ๋งค๊ฐ๋ณ์์ ๊ฐ์ World(defaultValue = "World")๊ฐ ๋๊ณ , ์กด์ฌํ๋ฉด ์ด ๋งค๊ฐ๋ณ์๋ URL์์๋ ์ด๋ฆ(name = "name")์ด ํธ์ถ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ช
ํํ์ง ์์ ๋ด์ฉ์ด ๋ง์ด ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์๋ ํ๋ /greeting ์ฃผ์์ ์ก์ธ์คํ๊ธฐ ์ํ ๋ค์ํ ์ต์
์ ๋ํ ๋ฌธ์์ด ์ด๋ฆ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ณด์ฌ์ค๋๋ค(URL์ ๋งค๊ฐ๋ณ์๊ฐ ์๊ฑฐ๋ ์์).
์์ URL |
๋ฌธ์์ด ์ด๋ฆ ๋งค๊ฐ๋ณ์ ๊ฐ |
/์ธ์ฌ |
์ธ๊ณ |
/greeting?name=์๋ฏธ๊ณ |
์๋ฏธ๊ณ |
/์ธ์ฌ๋ง?name=์กฐ๋ฅด |
์กฐ๋ฅด |
๋งค๊ฐ๋ณ์ 2: ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ชจ๋ธ ๋ชจ๋ธ์
๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ ๋ชจ๋ธ์
๋๋ค. ์ด ๋ชจ๋ธ์ ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ์์ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ ์์ฑ์๋ ์ด๋ฆ๊ณผ ๊ฐ์ด ์์ต๋๋ค. ํค-๊ฐ ์๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ Java ์ฝ๋์์ HTML ํ์ด์ง๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์์ต๋๋ค. ๋๋ MVC ์ฉ์ด๋ก ๋ชจ๋ธ์์ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค. ๋ง์ง๋ง ์ค์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ๋จ์ ์์ต๋๋ค. Java์์ html๋ก ๋๋ ๋ชจ๋ธ์์ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์
๋๋ค. ๋ฉ์๋์ ๋ณธ๋ฌธ์๋ ๋ค์ ํ์ด ํฌํจ๋ฉ๋๋ค.
model.addAttribute("name", name);
์ฌ๊ธฐ์๋ name์ด๋ผ๋ ์ ์์ฑ์ ์์ฑํ๊ณ ์ฌ๊ธฐ์ name ๋งค๊ฐ๋ณ์์ ๊ฐ์ ํ ๋นํฉ๋๋ค. ์ต๊ทผ์ ์ฐ๋ฆฌ๋ ํ๊ทธ์ ๋ํด ๋
ผ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.
<p th:text="'Hello, ' + ${name} + '!'" />
p ํ๊ทธ์ ๊ฐ์ "Hello"๋ผ๋ ํ
์คํธ + Java ์ฝ๋์์ ์ค์ ํ name ๋ณ์์ ๊ฐ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ค์ ๋ผ์ธ์ ์ฌ์ฉํ์ฌ ์ด ๊ฐ์ ์ค์ ํฉ๋๋ค.
model.addAttribute("name", name);
5๋จ๊ณ. ์คํ
์์ํ๋ ค๋ฉด MvcDemoApplication ํด๋์ค์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
์์ ๋ก๊ทธ์์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ํฌํธ 8080์์ ์์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์์
http:// ํ์ด์ง๋ก ์ด๋ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
localhost:8080 :
์ฌ๊ธฐ์ index.html ํ์ด์ง๊ฐ ํ์๋์์ต๋๋ค. ๋ค์ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ธ์.
์ด ์ ํ ์ค์ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ํ์ต๋๋ค. URL์ ํตํด ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ง ์์์ผ๋ฏ๋ก ์ฃผ์์ ๋ช
์๋ ๋๋ก name ์์ฑ์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ธ World๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด์ URL์ ํตํด ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด ๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ ๊ฒ์ด ์๋ํ ๋๋ก ์๋ํฉ๋๋ค. ์ด์ name ๋ณ์์ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํด ๋ณด์ญ์์ค.
- ์ฌ์ฉ์๊ฐ url์ ํตํด ๋งค๊ฐ๋ณ์ ์ด๋ฆ = Amigo -> ๊ฐ์ ์ ๋ฌํ์ต๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ ์ฐ๋ฆฌ์ ์์
์ ์ฒ๋ฆฌํ๊ณ , name ๋ณ์๋ฅผ ์๋ฝํ๊ณ , name ์ด๋ฆ๊ณผ ํ์ฉ๋ ๊ฐ์ผ๋ก ๋ชจ๋ธ ์์ฑ์ ์ค์ ํฉ๋๋ค. ->
- ๋ชจ๋ธ์์ ์ด ๋ฐ์ดํฐ๋ View, Greeting.html ํ์ด์ง๋ก ์ด๋ํ์ฌ ์ฌ์ฉ์์๊ฒ ํ์๋์์ต๋๋ค.
๊ทธ๊ฒ ๋ค์ผ!
์ค๋ ์ฐ๋ฆฌ๋ MVC(๋ชจ๋ธ - ๋ทฐ - ์ปจํธ๋กค๋ฌ)๋ผ๋ ๋ค์ ํฌ๊ณ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ฅผ ์๊ฐํ์ต๋๋ค. ์ด๊ฒ์ ์๋ฆฌ์ฆ์ ๋ง์ง๋ง์ด๋ฉฐ, ๊ทธ ๋ชฉ์ ์ ์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ์ ์์ํ๊ธฐ ์ ์ ์์์ผ ํ ์ฌํญ์ ์๊ฐํ๋ ๊ฒ์
๋๋ค.
๊ด์ฌ ์๋ ์ฃผ์ ๋ฅผ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์. ์ ํฌ๊ฐ ํด๋๋ฆฌ๊ฒ ์ต๋๋ค! |
GO TO FULL VERSION