๐Ÿ—จ๏ธ Backend/Java

[Spring]ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •

Kyle99 2022. 10. 17. 19:46

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

Spring์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Java๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, Java๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ธํ”„๋Ÿฐ์˜ Spring์ž…๋ฌธ๊ฐ•์˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Java 11 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 11 ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

IDE(ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ)๋Š” IntelliJ ๋˜๋Š” Eclipse๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

์˜›๋‚  ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Springํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๋งŒ๋“ค์—ˆ๋˜ ๋ฐ˜๋ฉด์—,

์š”์ฆ˜์—๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

* ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•ด์„œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ *

https://start.spring.io

 

์œ„ ์‚ฌ์ง„์€ ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ์‚ฌ์ดํŠธ์˜ ํŽ˜์ด์ง€ ์‚ฌ์ง„์ด๋‹ค.

์ œ์ผ ์ฒ˜์Œ์— Project์•ˆ์˜ Maven๊ณผ Gradle์€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ 

๋นŒ๋“œํ•˜๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด๊นŒ์ง€ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ํˆด์ด๋‹ค.

๊ณผ๊ฑฐ์—๋Š” Maven์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” Greadle์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

Language ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Java๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

Spring Boot๋Š” ๋ฒ„์ „ ์˜†์— SNAPSHOT์€ ์•„์ง ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๋ฒ„์ „์ด๊ณ ,

M5๋Š” ์•„์ง ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ ๋œ ๋ฒ„์ „์ด ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฒ„์ „๋งŒ ํ‘œ์‹œ๋œ ๋ฒ„์ „ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Project Metadata์˜ Group์€ ๋ณดํ†ต์—๋Š” ๊ธฐ์—…๋ช…์„ ์ ๋Š”๋‹ค. ์ง€๊ธˆ์€ Spring๊ณต๋ถ€๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ˆ hello๋ฅผ ๊ธฐ์žฌํ•œ๋‹ค.

Artifact๋Š” ํ”„๋กœ์ ํŠธ๋ช… ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. hello-spring์„ ๊ธฐ์žฌํ•œ๋‹ค.

Dependencies๋Š” ์ง€๊ธˆ ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

web ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ˆ spring web๊ณผ html์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ํ•„์š”ํ•˜๋‹ˆ thymeleaf๋ฅผ ์„ ํƒํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  GENERATE๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ์••์ถ•์„ ํ•ด์ œํ•˜๊ณ 

IntelliJ์—์„œ hello-spring> build.gradle์„ open ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ํ™”๋ฉด์— ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๊ฒŒ ๋˜๋ฉด ์™ธ๋ถ€์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์ง„ํ–‰์ด ๋œ๋‹ค.

srcํด๋”๋ฅผ ํ™•์ธํ•˜๋ฉด main๊ณผ test๊ฐ€ ์žˆ๋‹ค. ์š”์ฆ˜ ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ์—์„œ๋Š” test code๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ , build.gradle์„ ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

plugins {
	id 'org.springframework.boot' version '2.7.4' → ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id 'java'
}

group = 'hello' → Group ๋ช…
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11' → Java ๋ฒ„์ „

repositories {
	mavenCentral()
}

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'
}

tasks.named('test') {
	useJUnitPlatform()

build.gradle์˜ dependencies๋ฅผ ํ™•์ธํ•˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์„ ํƒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, ์–ด๋””์„œ ๋‹ค์šด๋กœ๋“œํ• ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์ด repositories์˜ mavenCentral()์ด๋‹ค.

ํ•„์š”ํ•˜๋‹ค๋ฉด ํŠน์ • ์‚ฌ์ดํŠธ์˜ url์„ ๊ธฐ์žฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด์ œ main์˜ HelloSpringApplication์˜ main ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด Spring์ด๋ผ๋Š” ๊ธ€์ž๊ฐ€ ํฌ๊ฒŒ ์ฝ˜์†”์— ์ถœ๋ ฅ์ด ๋˜๋ฉฐ,

Tomcat์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  localhost:8080์„ ๋„๋ฉ”์ธ์— ์ž…๋ ฅ์„ ํ•˜๋ฉด Error page๊ฐ€ ๋œฌ๋‹ค.

ErrorํŽ˜์ด์ง€๊ฐ€ ๋œฌ๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ, ์‹คํ–‰์„ ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰์ด ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” File> Settings์—์„œ gradle์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ Build and run์—์„œ

Gradle๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ IntelliJ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด Run ํ–ˆ์„ ๋•Œ Gradle์„ ํ†ตํ•˜์ง€ ์•Š๊ณ , ๋ฐ”๋กœ IntelliJ๋กœ ์ถœ๋ ฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰์ด ๋œ๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ

External Libraries๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋‚˜๋Š” thymeleaf์™€ spring web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 2๊ฐœ๋ฅผ ๊ฐ€์ ธ์™”์ง€๋งŒ,

์ˆ˜๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜์กด๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

spring web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

spring web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ชจ๋‘ ๋‹ค ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์˜์กด๊ด€๊ณ„๋Š” IntelliJ์˜ ๋งจ ์˜ค๋ฅธ์ชฝ Gradle์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ์˜ˆ์ „์—๋Š” Tomcat์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ  ํ•  ํ•„์š” ์—†์ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•ด๋„ ๋ชจ๋“ ๊ฒŒ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Gradle์€ ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

→ spring-boot-starter-web
   → spring-boot-starter-tomcat: ํ†ฐ์บฃ (์›น์„œ๋ฒ„)
   → spring-webmvc: ์Šคํ”„๋ง ์›น MVC
→ spring-boot-starter-thymeleaf: ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ ์—”์ง„(View)
→ spring-boot-starter(๊ณตํ†ต): ์Šคํ”„๋ง ๋ถ€ํŠธ + ์Šคํ”„๋ง ์ฝ”์–ด + ๋กœ๊น…
   → spring-boot
      → spring-core
   → spring-boot-starter-logging
      → logback, slf4j

ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

→ spring-boot-starter-test
   → junit: ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ
   → mockito: ๋ชฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
   → assertj: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
   → spring-test:์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง€์›

View ํ™˜๊ฒฝ์„ค์ •

localhost:8080์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, Error ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด์ œ๋Š” Errorํ™”๋ฉด์ด ์•„๋‹Œ, WelcomeํŽ˜์ด์ง€์— ๋ฌธ์ž๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•ด๋ณด์ž.

welcomeํŽ˜์ด์ง€๋Š” ๋„๋ฉ”์ธ์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ œ์ผ ์ฒซ ํ™”๋ฉด์ด๋‹ค.

src> main> 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>

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ html ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด hello๋ฌธ์ž์™€ hello๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ด๋ ‡๊ฒŒ Errorํ™”๋ฉด์ด ์•„๋‹Œ, Hello๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” static/index.html์„ ์˜ฌ๋ ค๋‘๋ฉด Welcome page๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์Šคํ”„๋ง์€ ๋งค์šฐ๋งค์šฐ ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ฐฉ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ์— ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

spring.io์—์„œ spring์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์œ„ index.html์€ ์ •์  ํŽ˜์ด์ง€์ด๋‹ค. ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ์›น์„œ๋ฒ„์—๊ฒŒ html ํŒŒ์ผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ ์ธ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” thymeleaf๋ผ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

thymeleaf ํ…œํ”Œ๋ฆฟ ์—”์ง„

→ thymeleaf ๊ณต์‹ ์‚ฌ์ดํŠธ: https://www.thymeleaf.org/
→ ์Šคํ”„๋ง ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ: https://spring.io/guides/gs/serving-web-content/
→ ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฉ”๋‰ด์–ผ: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-template-engines

์ด์ œ thymeleaf๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•œ ์›นํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฒซ๋ฒˆ์งธ ์ง„์ž…์ ์€ ์ปจํŠธ๋กค๋Ÿฌ(controller)์ด๋‹ค.

hello.hellospring๋ฐ‘์— controller๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

controller์•ˆ์— HelloController Class๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

HelloController์•ˆ์˜ Class๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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";
    }
}

์—ฌ๊ธฐ์„œ @GetMapping์˜ ("hello")๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ /hello๋กœ ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

hello ๋ฉ”์„œ๋“œ์˜ model์€ MVC์˜ Model์˜ ๊ทธ Model์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ , templates์—์„œ hello.html ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. 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์˜ ${data}๋Š” HelloController์˜ data์˜ value๊ฐ’์ธ hello!๋กœ ์น˜ํ™˜์ด ๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์‹คํ–‰์„ ํ•ด์„œ ํ™•์ธ์„ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์ด๋ ‡๊ฒŒ /helloํŽ˜์ด์ง€์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š”. hello! ๊ฐ€ ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์€ ์•„๋ž˜์˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๊ณผ์ •์ด๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ„(viewResolver)๊ฐ€ ํ™”๋ฉด์„ ์ฐพ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

   → ์Šคํ”„๋ง ๋ถ€ํŠธ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ๊ธฐ๋ณธ viewName ๋งคํ•‘

   → resources:templates/ + {ViewName} + .html

์ฐธ๊ณ  : spring-boot-devtools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, html ํŒŒ์ผ์„ ์ปดํŒŒ์ผ๋งŒ ํ•ด์ฃผ๋ฉด
์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์—†์ด View ํŒŒ์ผ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ธํ…”๋ฆฌJ ์ปดํŒŒ์ผ ๋ฐฉ๋ฒ•: ๋ฉ”๋‰ด build → Recompile

๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

์ด์ œ IntelliJ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์„ ํ•ด๋ณด์ž.

๋จผ์ € IntelliJ์—์„œ ์‹คํ–‰ ์ค‘์ด๋˜ ๊ฒƒ์„ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค. ( ๊ฐ™์€ ์„œ๋ฒ„๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. )

๋จผ์ € ํ„ฐ๋ฏธ๋„์—์„œ hello-spring ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™์„ ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  gradlew build๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›์œผ๋ฉด์„œ ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„, hello-spring/build/libs ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  java -jar hello-spring-0.0.1-SNAPSHOT.jar์„ ์‹คํ–‰ํ•˜๋ฉด, Spring์ด ์ถœ๋ ฅ๋˜๋ฉด์„œ

ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.