2022๋ 5์ 27์ผ
1. Spring Library๐
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
์ค์ ๋ก ๋ด๊ฐ ์ถ๊ฐํ๋ spring-boot-starter-web, thymeleaf ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ์์ฑ๋๋ spring-boot-starter-test ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์กด์ฑ์ ์ถ๊ฐ๋์ด ์๋ค.
ํ์ง๋ง! External Libraries์ ๋ค์ด๊ฐ๋ณด๋ฉด ์์ฒญ๋๊ฒ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋ค.
maven, build๊ณผ ๊ฐ์ ๋น๋ ํด๋ค์ ์์กด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋๋ฐ
์๋ฅผ ๋ค์ด ๋ด๊ฐ spring-boot-starter-web ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ทธ๊ฑฐ์ ๋ ์์กด ๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ tomcat, mvc์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ํจ๊ป ์๋ ๋ค์ด๋ก๋๋๋ค.
์ด๋ฐ์์ผ๋ก spring core๊น์ง ์ฐ๊ฒฐ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋จ
ํธ๋ฆฌ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐ!
(1) Embedded Server
tomcat์ด ๊ฐ์ด ์ค์น๋๋ฉด์ ์์ฒด์ ์ผ๋ก ๋ด์ฅ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ run์ ๋๋ฆฌ๋ฉด ์น ์๋ฒ๊ฐ ์๋ ์คํ๋๋ ๊ฒ์. ๋ฐ๋ผ์ ๋ฐ๋ก tomcat ์๋ฒ๋ฅผ ์ค์นํ๊ณ ์ค์ ํ๋ ๊ท์ฐฎ์ ์์ ์ ์ํด๋ ๋จ.
(2) Logging
์๋ฒ ๊ฐ๋ฐ์๋ผ๋ฉด System.out.print()๋ฅผ ์ง์ํ๊ณ Log๋ฅผ ์ฌ์ฉํจ. ์ํํ ์๋ฌ ๊ฐ์ ๊ฒ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค๊ณ ํจ.
thymeleaf๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด spring-boot-starter๊ฐ ์ค์น๋๊ณ ๊ทธ ์์๋ logging๊ณผ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์์กด๊ด๊ณ์ ์ํด ์ค์น๋๋ค. logback, log4j, slf4j๊ฐ ์๋๋ฐ ์์ฆ์๋ slf4j์ logback์ ์กฐํฉ์ ๋ง์ด ์ฌ์ฉํจ.
slf4j๋ ์ฝ๊ฒ ๋งํด์ interface์ด๊ณ logback์ ์ถ๋ ฅ ๊ตฌํ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ!(์ถ๊ฐ๋ก ์ฐพ์๋ณด๊ธฐ)
(3) Test
testCompileClassPath์ ๊ฐ๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ง ํ ์คํธ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์๋๋ฐ ์๋ฐ์ง์์์๋ ํ ์คํธํ ๋ junit์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํจ
(4) ์ ๋ฆฌ
A. ์คํ๋ง ๋ถํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
1. spring-boot-starter-web
- spring-boot-starter-tomcat: ํฐ์บฃ (์น์๋ฒ)
- spring-webmvc: ์คํ๋ง ์น MVC
2. spring-boot-starter-thymeleaf: ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง(View)
3. spring-boot-starter(๊ณตํต): ์คํ๋ง ๋ถํธ + ์คํ๋ง ์ฝ์ด + ๋ก๊น
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
B. ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
1. spring-boot-starter-test
- junit: ํ ์คํธ ํ๋ ์์ํฌ
- mockito: ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- assertj: ํ ์คํธ ์ฝ๋๋ฅผ ์ข ๋ ํธํ๊ฒ ์์ฑํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-test: ์คํ๋ง ํตํฉ ํ ์คํธ ์ง์
2. View ํ๊ฒฝ์ค์
์ฒ์ http://localhost:8080/ url๋ก ์ด๋ํด๋ดค์ ๋
์ ๊ฐ์ ์๋ฌ ํ์ด์ง๊ฐ ๋์ค๋๋ฐ ์ด๊ฑด ๋ด๊ฐ ์๋ฌด๊ฒ๋ ์ค์ ํ์ง ์์์ ๊ทธ๋ฐ ๊ฒ!
resources/static ํ์์ index.html ํ์ผ์ ๋ฃ์ด์ฃผ๋ฉด ์๋์ผ๋ก Spring Boot๊ฐ ์ง์ํ๋ Welcome Page ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅ
https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.spring-mvc.welcome-page
์๋ฃ๊ฐ ๋๋ฌด ๋ฐฉ๋ํ๋ ๋ค ์ธ์ธ์๋ ์๋ค! ๊ณต์ ์ฌ์ดํธ spring.io์ ๊ฐ์ ๋ฌธ์๋ฅผ ์ฐพ์๋ณผ ์ ์๋๋ก ํ์.
์์ ๊ณผ์ ์ ์งํํ๋ฉด ์ ์ ํ์ด์ง๋ฅผ ์์ฑํ๋ ๊ฒ์
(1) ํ ํ๋ฆฟ ์์ง
- ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด ๋์ ํ์ด์ง๋ก ๋์ํ๋๋ก ํ ์ ์์!
- ๋ด๊ฐ ์ฌ์ฉํ ํ ํ๋ฆฟ ์์ง์ ์์ ์ค์นํ๋ thymeleaf
- thymeleaf ๊ณต์ ์ฌ์ดํธ: https://www.thymeleaf.org/
- Spring ๊ณต์ tutorial: https://spring.io/guides/gs/serving-web-content/
- Spring Boot ๋งค๋ด์ผ: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-template-engines
(2) ์ฐ์ต ์์ !
- index.html ์์ฑ (resources/static/index.html)
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
- 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")
public String hello(Model model){
model.addAttribute("data", "hello!");
return "hello";
}
}
- thymeleaf๋ฅผ ์ด์ฉํ ๋์ ํ์ด์ง ์์ฑ(resources/templates/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>
(3) ๋์ ์๋ฆฌ
์ถ์ฒ: ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ (๊น์ํ)
๋ด๊ฐ controller์์ get๋ฉ์๋์์ ๋ฐํํ๋ hello๋ผ๋ String ๊ฐ์ viewResolver๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก resources:templates/ + {ViewName} + .html๋ก ๋งคํํด์ ์ด html์ ๋ ๋๋งํ๋๋ก ํจ.
<p th:text="'์๋
ํ์ธ์. ' + ${data}" >์๋
ํ์ธ์. ์๋</p>
์ฌ๊ธฐ์ th๋ thymeleaf๋ฅผ ์๋ฏธ ๊ทธ๋ฆฌ๊ณ ${data}๋ ๋ด๊ฐ controller์์ model์ ์ถ๊ฐํด์ค ์์ฑ "data"๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ฏ๋ก "hello!"๊ฐ ๋ค์ด๊ฐ๊ฒ ๋จ
์ฐธ๊ณ ) spring-boot-devtools ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ์, html ํ์ผ์ ์ปดํ์ผ๋ง ํด์ฃผ๋ฉด ์๋ฒ ์ฌ์์ ์์ด View ํ์ผ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํด์ง.
intellij์์ ์ปดํ์ผ ๋ฐฉ๋ฒ: build -> Recompile
3. ๋น๋ํ๊ณ ์คํํ๊ธฐ
(1) ./gradlew.bat build(MAC: ./gralew build)
ํ์ฌ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ ์งํํด์ผ ํจ
๊ทธ๋ฌ๋ฉด buildํด๋๊ฐ ์๊ธฐ๊ฒ ๋๊ณ ์๋์ ๊ฐ์ ํด๋ ๋ฐ ํ์ผ๋ค์ด ์๊น
(2) cd libs
libs ํด๋ ๋ด์ hello-spring-0.0.1-SNAPSHOT.jar, hello-spring-0.0.1-SNAPSHOT-plain.jar๊ฐ ์กด์ฌ
(3) java -jar {project name}-0.0.1-SNAPSHOT.jar
์ ์ ๋์ํ๊ณ localhost:8080๋ ์ ๋์๊ฐ!
๋ฐ๋ผ์ ์๋ฒ ๋ฐฐํฌํ ๋๋ ์ด jarํ์ผ๋ง ์๋ฒ์ ๋ฃ์ด์ฃผ๊ณ 3๋ฒ ๋ช ๋ น๋ฌธ์ ์คํ ํ๋ฉด ๋จ. ์ด๋ฌ๋ฉด ์๋ฒ์์๋ spring์ด ๋์ํ๊ฒ ๋จ!
๊ณผ๊ฑฐ์๋ ์๋ฒ์ tomcat ์ค์นํ๊ณ ์ด๋ฐ์ ๋ฐ ๋ณต์กํ ๊ณผ์ ์ด ์์๋๋ฐ ์ด์ ๋ jarํ์ผ๋ง ๋ฃ๊ณ ์คํ์ํค๋ฉด ๋๋ค๊ณ ํ๋ ์ฐธ ํธํด์ง ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ : ./gradlew.bat clean (MAC: ./gradlew clean)์ ์งํํ๋ฉด buildํด๋ ์ญ์
์ฐธ๊ณ
๊ถ๊ธํ์ : gradlew๊ฐ ๋ญ๊น?
- gradle wrapper์ ์ค์ธ๋ง!
- ์๋ก์ด ํ๊ฒฝ์์ ํ๋ก์ ํธ๋ฅผ ์ค์ ํ ๋ java๋ gradle์ ์ค์นํ์ง ์๊ณ ๋ฐ๋ก ๋น๋ํ๊ฒ ํด์ฃผ๋ ์ญํ
- gradlew๋ shell script(์์์ ์ฌ์ฉํ ์ ์๋ ๋ช ๋ น์ด๋ค์ ์กฐํฉ์ ๋ชจ์์ ๋ง๋ Batchํ์ผ)
์: OS์์์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋ช ๋ น์ ์ฝ๊ณ ํด์ํ์ฌ ๋์ ์คํํด์ฃผ๋ ํ๋ก๊ทธ๋จ.
(OS์ Kernel๊ณผ ์ฌ์ฉ์ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์ญํ )
๋ฌ๊ธ์์ง๋ง ์์ ์ ์ด์์ฒด์ ๊ณผ๋ชฉ์์ ๊ณต๋ถํ ๊ฐ๋ ๋ณต์ต..
- gradlew.bat๋ window batch script
์ฐธ๊ณ : https://docs.gradle.org/current/userguide/gradle_wrapper.html
gradle์ ์ด๋ป๊ฒ ๋ฐ๋ผ์๋ ์ฌ๋ฌ๋ฒ ์จ๋ดค๋๋ฐ ์ด๋ค ์๋ฆฌ์ธ์ง ์ด๋ค๊ฑด์ง๋ ๋ชจ๋ฅด๊ณ ์ผ๋ ๊ฒ ๊ฐ๋ค. ์์ง ๋ชจ๋ฅด์ง๋ง ์๊ฐ ๋๋ฉด ๋จผ์ ๊ณต๋ถํด๋ณด๊ณ ์ถ๋ค!
'๐ Backend > ๐ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
6. Spring Bean ๋ฑ๋ก (0) | 2022.07.02 |
---|---|
5. Spring ๊ฐ๋จํ ํ์๐โโ๏ธ ๊ด๋ฆฌ ์์ (0) | 2022.07.02 |
4. Spring Web ๊ฐ๋ฐ ๊ธฐ์ด ๊ฐ๋ (0) | 2022.07.01 |
2. Spring ํ๋ก์ ํธ ์์ฑํ๋๋ฒ (0) | 2022.07.01 |
1. Spring ๊ณต๋ถ ์์! (1) | 2022.07.01 |