์น์ 1 ๋ชฉ์ฐจ
์๊ฐ ์ฝ์ค๋ ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ต๋๋ค.
ํ๋ก์ ํธ ์์ฑ
ํ๊ฒฝ
- Java 11 ์ค์น
- IDE: IntelliJ ์ค์น (์ค๋ฌด์์๋ ์ฃผ๋ก ์ธํ ๋ฆฌ์ ์ด๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์, ์ดํด๋ฆฝ์ค๋ณด๋จ ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ด๋๋ผ๋ ์ธํ ๋ฆฌ์ ์ด๋ฅผ ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ์ฌ. ์ธํ ๋ฆฌ์ ์ด๊ฐ ๋จ์ถํค ๋ฑ๋ ํจ์ฌ ํธํ๋ค๊ณ ํ์ฌ)
Spring starter
- main ๋ด๋ถ์ java์ test๊ฐ ์๋ค. - test์๋ ํ ์คํธ ๊ด๋ จ๋ ์์ค๋ค์ด ๋ค์ด๊ฐ๋ค. test code๋ ์ต๊ทผ ๊ฐ๋ฐ ํธ๋ ๋์์ ๊ต์ฅํ ์ค์ํ๊ธฐ ๋๋ฌธ์, ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ณธ ์ ํ ์ผ๋ก ๋ค์ด๊ฐ์๋ค.
- build.gradle : ๊ฐ๋ฐ์ ์นํ์ ์ธ ์คํ๋ง๋ถํธ๊ฐ ๋์ค๋ฉด์, ์ค์ ํ์ผ๊น์ง ๋ค ์ ๊ณต์ด ๋๋ค. gradle์ ๋ํ๊ฑด ์ง๊ธ์ ๊น๊ฒ ๊ณต๋ถํ์ง ์์๋ ๊ด์ฐฎ๋ค. gradle์ด ๋ฒ์ ์ค์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๊ฒจ์จ๋ค ์ ๋๊น์ง๋ง ์๋ฉด ๋๋ค.
- sourceCampatibility = โ11โ์ Java 11๋ฒ์ ๊ณผ ๋ง์์ ์๋ฏธํจ.
- dependencies ๋ณด๋ฉด, ํ์๋ฆฌํthymeleaf์ starter-web, ๊ทธ๋ฆฌ๊ณ junit5๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด๊ฐ๋ค. ์ด๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ repositories์ mavenCentral()์์ ๋ค์ด๋ก๋๋ฐ์์ค๊ฒ ๋๋ค.
- gitignore๋ ๊น์ ์์คํ์ผ๋ง ๋ค์ด๊ฐ๊ณ build ํ์ผ ๋ฑ์ ์ฌ๋ผ๊ฐ๋ฉด ์๋๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๊ด๋ฆฌ๋ฅผ ํด์ค๋ค.
HelloSpringApplication
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
- ๋ฉ์ธ ๋ฉ์๋๋ฅผ ๊ทธ๋ฅ ์คํํ๋ฉด ๋๋ค.
- ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๋ฉด Tomcat started on port(s):8080์ด ๋ ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด์ localhost:8080์ผ๋ก ๋ค์ด๊ฐ๋ฉด ์๋ฌํ์ด์ง๊ฐ ๋จ๋ฉฐ ์คํ๋ง์ด ์ ์์๋ํ๋ค. => ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์คํํ๋ฉด ๋ด์ฅ๋ Tomcat ์น์๋ฒ๋ฅผ ์์ฒด์ ์ผ๋ก ๋์ฐ๋ฉด์ ์คํ๋ง๋ถํธ๋ ๊ทธ ์์ ๊ฐ์ด ์ฌ๋ผ๊ฐ๊ฒ ๋๋ ๊ฒ.
- ์ธํ
๋ฆฌ์ ์ด๋ฅผ ์ฐ๋ค๋ณด๋ฉด ๊ทธ๋ ์ด๋ค์ด ์ง์ ์คํ๋์ด ๋๋ฆด ๋๊ฐ ์๋๋ฐ,
Preference > Build Tools
์์Build and run using
๊ณผRun tests using
์ __์ธํ ๋ฆฌ์ ์ด__๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ.
๋ผ์ด๋ธ๋ฌ๋ฆฌ
build.gradle
build.gradle์ ์ด์ด๋ณด๋ฉด, ์ต์ด์ ์ ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋
- ํ์๋ฆฌํ(html ๋ง๋ค์ด์ฃผ๋ ํ ํ๋ฆฟ ์์ง)
- ์คํํฐ์น
- (์๋์ผ๋ก ๋ง๋ค์ด์ง๋) ์คํํฐํ ์คํธ
๋ฐ์ ์๋ค.
External Libraries
๊ทธ๋ฌ๋ External Libraries๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด, ๋ก๊ฒจ์จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ณ ๋ณด๋ฉด ๊ต์ฅํ ๋ง์. junit๊ด๋ จ๋ ๊ฒ๋ ์๊ณ , spring-boot์ ๊ด๋ จ๋ ๊ฒ๋ ๊ต์ฅํ ๋ง๋ค. ์ง์ ๋ก๊ธด ์ ์ด ์๋๋ฐ? ์์ฆ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ํด์, ์คํ๋ง์์ ์๋์ผ๋ก ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊น๋ญ์ ์๋์ผ๋ก ๋น๊ฒจ์ง๋ค. ์ด๋ฏธ starter-web์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ์ํ๋, ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์น ๋ค ์๋์ผ๋ก ์คํ๋ง์์ ๊ฐ์ ธ์ค๋ ๊ฒ์.
์ผ์ชฝ ํ๋จ ๋ค๋ชจ๋๊ฐ๋ฅผ ๋๋ฅด๋ฉด ์ค๋ฅธ์ชฝ์ Gradle
์ด ๋ฌ๋ค. ์ด๊ฑธ ๋๋ฌ๋ณด๋ฉด Dependencies
๋ค์ ํ์ธํ ์ ์๋ค. ๋์ (*)์ด๋ผ๊ณ ๋ถ์ด์๋๊ฑด ํํ์ ์ค๋ณต์ ์ ์ธํด์ค ๊ฒ์.
๊ฐ์ฌ๋์ ์ฌ๋ฏธ์๋ ์ด์ผ๊ธฐ : ๊ณ ๋์ ๊ฐ๋ฐ์๋ค์(ใ
ใ
ใ
) ์น ์๋ฒ์ ๊ฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ถ๋ฆฌ๋์ด ์์ด์, ํฐ์บฃ ์๋ฒ ๋ค์ด๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง ์ค์นํ๊ณ ํ์๋๋ฐ, ์ด์ ๋ ๊ทธ๋ฅ ๋ด์ฅํ(์๋ฒ ๋๋) ์น์๋ฒ๋ฅผ ๊ฐ๊ณ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋๋ฅผ ๋น๋ํด์ ์น์๋ฒ์ ์ฌ๋ฆฌ๋ฉด ๋๋ ๊ฒ์ด๋ค.
Logging
External Libraries์์ ํฐ์บฃ์ ๋๋ฌ๋ณด๋ฉด embed-core๋ ํ์ธํ ์ ์๊ณ , ํ์๋ฆฌํ๋ฅผ ๋๋ฌ๋ณด๋ฉด org.thymeleaf ๋ฑ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ๊ณ ์๋๊ฒ ๋ณด์ธ๋ค. ์คํ๋ง๋ถํธ๋ฅผ ๋๋ฌ๋ณด๋ฉด autoconfigure
, logging
, spring-core
๊น์ง ์น ์ธํ
์ด ๋์ด์ ๋์๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- logging : ํ์
์์ ์ผํ๋ ๋ถ๋ค์ system.out.println์ ์์ฐ๊ณ ๊ผญ log๋ก ์ถ๋ ฅ์ ํด์ผํ๋ค. ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ์ฌ๊ฐํ ์๋ฌ๋ง ๋ฐ๋ก ๋ชจ์๋ณผ ์ ์๊ฑฐ๋, ๋ก๊ทธํ์ผ๋ค์ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ์์์๋ system.out.println๋ ๋ง์ด ์ฐ๊ฒ ๋ค. logging์ ๋ค์ด๊ฐ๋ณด๋ฉด
slf4j
๊ณผlogback
์ด ์๋ค. ์๋์ ๋ฐ๋ผ ํธ๋ ๋๊ฐ ๋ฐ๋๊ธด ํ๋๋ฐ,slf4j
๋ ์ธํฐํ์ด์ค์ด๊ณ , ๋ก๊ทธ ๊ตฌํ์ฒด๋logback
์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์์ฆ์๋ ์ด ๋๊ฐ์ง ์กฐํฉ์ ๋ง์ด ์ฐ๋๊น, ์คํ๋ง์์๋ logging์ ๋น๊ธฐ๋ฉด ์๋์ผ๋ก ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๊ฒจ์จ๋ค. logging์ ๊ด๋ จํด์๋slf4j
๊ณผlogback
์ ๊ฒ์ํด๋ณด์๋ฉด ๋๋ค.
Logging
External Libraries์์ test๋ฅผ ์ดํด๋ณด๋ฉด, ์๋ฐ ์ง์์์๋ junit์ ์ฃผ๋ก ์ด๋ค. ์ต๊ทผ์ junit5
๋ก ๋์ด๊ฐ๋ ์ถ์ธ์ด๋ค. mockito
๋ผ๋๊ฐ, assertj
๋ผ๋๊ฐ๊ฐ ์๋๋ฐ ์ด๋ test๋ฅผ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด,
- ์คํ๋ง ๋ถํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - spring-boot-start-web - ํฐ์บฃ, ์คํ๋ง ์น MVC
- ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง(view)
- ์คํ๋ง๋ถํธ์คํํฐ(boot + core + logging)๊ฐ ์๋ค.
- ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ -
junit
์ด ๊ธฐ๋ณธ์ด๊ณ ,mockito
(๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ),assertj
(ํ ์คํธ ์ฝ๋ ์์ฑ์ ์ข ๋ ํธํ๊ฒ ํ๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ),spring-test
(์คํ๋ง ํตํฉ ํ ์คํธ ์ง์)๊ฐ ์๋ค. โView ํ๊ฒฝ์ค์
Welcome Page ๋ง๋ค๊ธฐ
index.html๋ง ๋ฃ์ผ๋ฉด ์์์ ์ฐ์ปดํ์ด์ง๊ฐ ๋๋ค.
resources -> static์index.html
์์ฑํด์ค๋ค. - ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ Welcome Page ๊ธฐ๋ฅ
-
- Welcome page์ ๋ํด ์ฐพ๋ ๋ฒ
- spring.io์ ์ ์, Projects ์นดํ
๊ณ ๋ฆฌ ->
Learn
์ ํด๋ฆญํ๋ฉด ๋ค์ํ ์น์ ์ด ๋์ค๋ฏ๋ก, ๊ฒ์ํด์ ์ฐพ์ผ๋ฉด ๋จ. index.html์ ์ฐพ๊ณ , ๋ง์ฝ ๋ชป์ฐพ์ผ๋ฉด index ํ ํ๋ฆฟ์ ์ฐพ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ์ด๋ ๊ฒ ๋ฉ๋ด์ผ์์ ์ฌ์ฉ๋ฒ์ ๊ฒ์์ ํ ์ค ์์์ผ ํ๋ค.
-
- ํ
ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ index.html์ ๊พธ๋ฐ ์ ์๋๋ฐ, ํด๋น ๊ฐ์์์ Thymeleaf๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์คํ๋ง๋ถํธ ๋ฉ๋ด์ผ์์ Template Engines๋ฅผ ๊ฒ์ํด๋ ๋์จ๋ค. ์ฝ์ด๋ณด๋ฉด,
FreeMarker
,Groovy
,Thymeleaf
,Musacho
๋ผ๋๊ฑธ ๋ง์ด ์ด๋ค๊ณ ๋์ด.
์ปจํธ๋กค๋ฌ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒซ ๋ฒ์งธ ์ง์ ์ ์ด __์ปจํธ๋กค๋ฌ__์ด๋ค. hello.hellospring > controller ์ Controller ํจํค์ง๋ฅผ ๋ง๋ค๊ณ , ์๋ฐ ํด๋์ค๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ํ๋ ์์ฑํด์ค๋ค.
-
@Controller
๋ฅผ ๋ง๋ค์ด์ค์ผํ๋ค.
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello") // ์น ์ดํ๋ฆฌ์ผ์ด์
์์ '/hello'๊ฐ ๋ค์ด์ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด์ค๋ค.
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
@GetMapping(โhelloโ)๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ /hello ๊ฐ ๋ค์ด์ค๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋๋ค. model.addAttribute์์ ์ฒซ๋ฒ์งธ ์ธ์๋ attributeName, ๋๋ฒ์งธ ์ธ์๋ attributeValue๊ฐ ๋๋ค.
- Template>hello.html
<!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>
- ์ด์ hello.html์์ ๋์ด์จ attributeDate๋
${data}
๋ก ๋์ด์จ๋ค. p ํ๊ทธ์ ๋ถ์ด์๋ th๋ ํ์๋ฆฌํ๋ฅผ ์๋ฏธํจ.
์ฌ์์ ํ ๋ก์ปฌํธ์คํธ 8080์ ๋ค์ด๊ฐ๋ฉด ์๋ ํ์ธ์. hello!! ๊ฐ ๋ฌ๋ค. ์ ๊ทธ๋ ๊ฒ ๋๋๊ฑธ๊น?
ํ์๋ฆฌํ ํ ํ๋ฆฟ์์ง์ ๋์
- ์น ๋ธ๋ผ์ฐ์ ์์ ๋ก์ปฌํธ์คํธ๋ฅผ ํตํด /hello๋ฅผ ๋์ง๋ฉด, ์คํ๋ง ๋ด์ฅ ํฐ์บฃ ์๋ฒ๊ฐ ์คํ๋ง์๊ฒ /hello๊ฐ ์๋์ง๋ฅผ ๋ฌผ์ด๋ณธ๋ค.
- [์คํ๋ง] ์คํ๋ง์ @GetMapping(โhelloโ)๊ฐ ์์ผ๋ helloController๋ก ๋์ด๊ฐ๋ค. ํด๋น ๋ฉ์๋๊ฐ ์คํ์ด ๋๋๋ฐ, ์ธ์์ธ Model model์ ์คํ๋ง์ด ๋ชจ๋ธ์ด๋ ๊ฑธ ๋ง๋ค์ด์ ๋ฃ์ด์ค๋๋ค.
- ์ด๋ ํด๋น ๋ฉ์๋ ๋ด์์ __key๋ โdataโ๊ณ value๋ โhelloโ__์ด๋ฏ๋ก, ์คํ๋ง์ ๋ชจ๋ธ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค๋ค. => model(data:hello!!)
- ๋ฉ์๋ ๋ง์ง๋ง์ ๋ฆฌํด๊ฐ์ผ๋ก โhelloโ๋ฅผ ๋๊ฒจ์ค๋ค. ์ด๋ __ํ
ํ๋ฆฟ์์ hello.html์ ์ฐพ์์ ๋ ๋๋งํ๋ผ๋ ์๋ฏธ__์ด๋ค. ์ด๋ ๋ชจ๋ธ(Model model)๋ ๊ฐ์ด ํ๋ฉด์ผ๋ก ๋์ด๊ฐ๋ค.
- ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํด ๊ฐ์ผ๋ก __๋ฌธ์__๋ฅผ ๋ฐํํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ(
viewResolver
)๊ฐ ํ๋ฉด์ ์ฐพ์์ ์ฒ๋ฆฌํ๋๋ฐ, ๊ธฐ๋ณธ viewName ๋งคํ์resources:templates/
+{ViewName}+.html
์ด๋ค. ์ด์ ํ ํ๋ฆฟ hello.html์ ์ฐพ์์ ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง์ด ์ฒ๋ฆฌํด์ค๋ค.
- ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํด ๊ฐ์ผ๋ก __๋ฌธ์__๋ฅผ ๋ฐํํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ(
๋น๋ํ๊ณ ์คํํ๊ธฐ
- Windows์ ๊ฒฝ์ฐ, ํ๋ก์ ํธ ํด๋์
gradlew.bat
์ ํด๋ฆญํ๋ฉด ๋น๋๊ฐ ๋์ดbuild
ํด๋๊ฐ ์์ฑ๋๋ค. (ํน์ cmd์์gradlew build
๋ฅผ ์ ๋ ฅ) - ์ดํ build>libs์์ jarํ์ผ์ ์คํ(
java -jar hello-spring-0.0.1-SNAPSHOT.jar
)์ํค๋ฉด ๋๋ค. ์ค๋ฌด์์๋ ํด๋น jar ํ์ผ์ ์๋ฒ์ ๋ฃ๊ณ ์คํ์์ผ spring ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ค! - ๋น๋๋ฅผ ์ญ์ ํ๋ ค๋ฉด
./gradlew clean build
์ ๋ ฅ.
[์งํ๋ด์ญ]
12.06 ~๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ ์ ๋ฆฌ
12.07 ~๋น๋์ ์คํ ์ ๋ฆฌ