๐Ÿ“บ ๊ณต๋ถ€ ์ค‘์ธ ๊ฐ•์˜: ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ (YouTube ์žฌ์ƒ๋ชฉ๋ก)

์ดˆ์••์ถ•

๋นŒ๋“œ ๋„๊ตฌ = ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ›์•„ ์˜ค๊ธฐ + ์ปดํŒŒ์ผ + ํ…Œ์ŠคํŠธ + ํฌ์žฅ(jar)์„ ์ž๋™์œผ๋กœ ํ•ด ์ฃผ๋Š” ๋„๊ตฌ
Maven = ์„ ๋ฐฐ. pom.xml (XML๋กœ ์”€)
Gradle = ํ›„๋ฐฐ. build.gradle (์ฝ”๋“œ์ฒ˜๋Ÿผ ์”€). ๋” ์งง๊ณ  ๋น ๋ฆ„
๋‘˜ ๋‹ค ํ•˜๋Š” ์ผ์€ ๋˜‘๊ฐ™์Œ

1. ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ๋ญ”๋ฐ?

๋‚ด๊ฐ€ ์“ด .java ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ โ€œ๋นŒ๋“œโ€๋ผ๊ณ  ํ•จ

1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋ฐ›๊ธฐ   (์Šคํ”„๋ง, ํ†ฐ์บฃ ...)
2. ์ปดํŒŒ์ผ              (.java โ†’ .class)
3. ํ…Œ์ŠคํŠธ ์‹คํ–‰
4. ํฌ์žฅ                (.jar ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ธฐ)

์ด๊ฑธ ์ž๋™์œผ๋กœ ํ•ด ์ฃผ๋Š” ๊ฒŒ ๋นŒ๋“œ ๋„๊ตฌ โ†’ Maven, Gradle

๋น„์œ 

build.gradle   = ๋ ˆ์‹œํ”ผ (์žฅ๋ณด๊ธฐ ๋ชฉ๋ก)
Gradle         = ์š”๋ฆฌ์‚ฌ
Maven Central  = ๋งˆํŠธ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฐฝ๊ณ )

JSP ํ•  ๋•Œ๋ž‘ ๋น„๊ต

JSP ๋•ŒGradle ์“ฐ๋ฉด
jar ์ง์ ‘ ๋‹ค์šด๋ฐ›์•„์„œ WEB-INF/lib์— ๋„ฃ์Œbuild.gradle์— ํ•œ ์ค„ ์ ์œผ๋ฉด ๋
๋ฒ„์ „ ์•ˆ ๋งž์œผ๋ฉด ์ง์ ‘ ์ฐพ์•„์„œ ๋ฐ”๊ฟˆ๋งž๋Š” ๋ฒ„์ „ ์•Œ์•„์„œ ๊ณจ๋ผ ์คŒ
๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋กœ ์˜ฎ๊ธฐ๋ฉด jar๋„ ๋‹ค ์ฑ™๊ฒจ์•ผ ํ•จbuild.gradle๋งŒ ์žˆ์œผ๋ฉด ์–ด๋””์„œ๋“  ๋˜‘๊ฐ™์ด ์žฌํ˜„

2. Maven vs Gradle

ํ•˜๋Š” ์ผ์€ ๋˜‘๊ฐ™์Œ. ์“ฐ๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ„

MavenGradle
์„ค์ • ํŒŒ์ผpom.xmlbuild.gradle
์“ฐ๋Š” ๋ฐฉ์‹XML (ํƒœ๊ทธ)์ฝ”๋“œ (Groovy ๋˜๋Š” Kotlin)
๊ธธ์ด๊ธธ๋‹ค์งง๋‹ค
์†๋„์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ๋น ๋ฆ„ (๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ ๋นŒ๋“œ, ์บ์‹œ ์‚ฌ์šฉ)
์ž์œ ๋„์ •ํ•ด์ง„ ํ‹€๋Œ€๋กœ์›ํ•˜๋Š” ๋Œ€๋กœ ์ปค์Šคํ…€ ์‰ฌ์›€
๋‚˜์˜จ ์ˆœ์„œ๋จผ์ € (2004)๋‚˜์ค‘ (2012)
์š”์ฆ˜์˜›๋‚  ํ”„๋กœ์ ํŠธ, ํšŒ์‚ฌ์— ์•„์ง ๋งŽ์Œ์Šคํ”„๋ง ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์ด ์”€

๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€๋ฅผ ๋น„๊ตํ•˜๋ฉด

Maven (pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>

Gradle (build.gradle)

implementation 'org.springframework.boot:spring-boot-starter-webmvc'

โ†’ ๋‚ด์šฉ์€ ๊ฐ™์€๋ฐ Gradle์ด ํ•œ ์ค„๋กœ ๋๋‚จ

๊ฒฐ๋ก 

  • ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๊ฑฐ๋ฉด ๊ฐ•์˜์—์„œ ์“ฐ๋Š” ๊ฑฐ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋จ
  • ํ•˜๋‚˜ ์•Œ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋„ ๊ธˆ๋ฐฉ ์ฝํž˜ (๊ฐœ๋…์ด ๊ฐ™์•„์„œ)

3. Gradle ์ž์„ธํžˆ

build.gradle ๊ตฌ์กฐ

plugins { ... }        // โ‘  Gradleํ•œํ…Œ ๊ธฐ๋Šฅ ๋ถ™์ด๊ธฐ
group / version        // โ‘ก ๋‚ด ํ”„๋กœ์ ํŠธ ์ •๋ณด
java { ... }           // โ‘ข ์ž๋ฐ” ๋ช‡ ๋ฒ„์ „ ์“ธ์ง€
repositories { ... }   // โ‘ฃ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์–ด๋””์„œ ๋ฐ›์„์ง€
dependencies { ... }   // โ‘ค ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ›์„์ง€ โ˜…
tasks.named('test')    // โ‘ฅ ํ…Œ์ŠคํŠธ ์„ค์ •

โ‘  plugins

plugins {
	id 'java'
	id 'org.springframework.boot' version '4.1.1'
	id 'io.spring.dependency-management' version '1.1.7'
}
  • Gradle์€ ์›๋ž˜ ๋นˆ ๋„๊ตฌ โ†’ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Šฅ๋ ฅ ์ถ”๊ฐ€
  • java โ†’ ์ž๋ฐ” ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ์•Œ๋ ค ์คŒ
  • org.springframework.boot โ†’ ์Šคํ”„๋ง๋ถ€ํŠธ ๊ธฐ๋Šฅ. ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „์ด ์—ฌ๊ธฐ์„œ ์ •ํ•ด์ง
  • dependency-management โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ž๋™์œผ๋กœ ๋งž์ถฐ ์คŒ

โ‘ก ํ”„๋กœ์ ํŠธ ์ •๋ณด

group = 'study'
version = '0.0.1-SNAPSHOT'
  • start.spring.io์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’. SNAPSHOT = ์•„์ง ๊ฐœ๋ฐœ ์ค‘
  • ๊ณต๋ถ€ํ•  ๋• ์‹ ๊ฒฝ ์•ˆ ์จ๋„ ๋จ

โ‘ข ์ž๋ฐ” ๋ฒ„์ „

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}
  • ์ž๋ฐ” 21๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ผ๋Š” ๋œป โ†’ ๊ทธ๋ž˜์„œ JDK 21 ์„ค์น˜๊ฐ€ ํ•„์š”ํ–ˆ์Œ

โ‘ฃ repositories

repositories {
	mavenCentral()
}
  • Maven Central = ์ „ ์„ธ๊ณ„ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฐฝ๊ณ 
  • ์ด๋ฆ„์— Maven์ด ๋“ค์–ด๊ฐ€์ง€๋งŒ Gradle๋„ ์—ฌ๊ธฐ์„œ ๋ฐ›์•„ ์˜ด

โ‘ค dependencies โ˜…

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-webmvc'
	testImplementation 'org.springframework.boot:spring-boot-starter-thymeleaf-test'
	testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

ํ•œ ์ค„ ์ฝ๋Š” ๋ฒ•

implementation  'org.springframework.boot : spring-boot-starter-webmvc'
  ์–ธ์ œ ์“ฐ๋Š”์ง€         ๋งŒ๋“  ๊ณณ(๊ทธ๋ฃน)             ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„
ํ‚ค์›Œ๋“œ๋œป
implementation๋‚ด ์ฝ”๋“œ์—์„œ ์“ฐ๊ณ  ์‹คํ–‰ํ•  ๋•Œ๋„ ํ•„์š” (์ œ์ผ ๋งŽ์ด ์”€)
testImplementationํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋งŒ ์”€
testRuntimeOnlyํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•  ๋•Œ๋งŒ ํ•„์š”

๊ฐ ์ค„ ์˜๋ฏธ

  • starter-webmvc โ†’ ์›น ์„œ๋ฒ„ ํ•ต์‹ฌ (์Šคํ”„๋ง MVC + ๋‚ด์žฅ ํ†ฐ์บฃ). ํ†ฐ์บฃ ๋”ฐ๋กœ ์•ˆ ๊น”์•„๋„ ๋˜๋Š” ์ด์œ 
  • starter-thymeleaf โ†’ html ํ™”๋ฉด ๋งŒ๋“œ๋Š” ๋„๊ตฌ (JSP ๋Œ€์‹ )
  • -test ๋‘ ์ค„ โ†’ ์œ„ ๋‘ ๊ฐœ ํ…Œ์ŠคํŠธ์šฉ
  • junit-platform-launcher โ†’ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์—”์ง„

starter๋ž€?

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์‹ญ ๊ฐœ๋ฅผ ๋ฌถ์€ ์„ธํŠธ
  • starter ํ•œ ์ค„ = ์Šคํ”„๋ง MVC + ํ†ฐ์บฃ + JSON ๋ณ€ํ™˜๊ธฐ โ€ฆ ๋‹ค ๋“ค์–ด์˜ด

๋ฒ„์ „์ด ์•ˆ ์ ํ˜€ ์žˆ๋Š” ์ด์œ 

  • dependency-management ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์Šคํ”„๋ง๋ถ€ํŠธ 4.1.1์— ๋งž๋Š” ๋ฒ„์ „์„ ์•Œ์•„์„œ ๊ณจ๋ผ ์คŒ

โ‘ฅ ํ…Œ์ŠคํŠธ ์„ค์ •

tasks.named('test') {
	useJUnitPlatform()
}
  • ํ…Œ์ŠคํŠธ๋Š” JUnit 5๋กœ ๋Œ๋ฆฌ๋ผ๋Š” ๋œป. ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ๋จ

ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” Gradle ๊ด€๋ จ ํŒŒ์ผ๋“ค

build.gradle      โ†’ ๋ ˆ์‹œํ”ผ (์œ„์—์„œ ๋ณธ ๊ฑฐ)
settings.gradle   โ†’ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ (rootProject.name = 'HelloSpring')
gradlew           โ†’ Gradle ๋ž˜ํผ (๋งฅ/๋ฆฌ๋ˆ…์Šค์šฉ)
gradlew.bat       โ†’ Gradle ๋ž˜ํผ (์œˆ๋„์šฐ์šฉ)
gradle/wrapper/   โ†’ ๋ž˜ํผ๊ฐ€ ์“ธ Gradle ๋ฒ„์ „ ์ •๋ณด (๋‚ด ํ”„๋กœ์ ํŠธ๋Š” 9.7.1)
build/            โ†’ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ (.class, .jar). ์ง€์›Œ๋„ ๋‹ค์‹œ ์ƒ๊น€
.gradle/          โ†’ Gradle ์บ์‹œ. ๋ฌด์‹œ

Gradle ๋ž˜ํผ(gradlew)๋ž€?

  • ์ปดํ“จํ„ฐ์— Gradle ์•ˆ ๊น”์•„๋„ ๋จ
  • gradlew๊ฐ€ ์ •ํ•ด์ง„ ๋ฒ„์ „์˜ Gradle์„ ์•Œ์•„์„œ ๋ฐ›์•„์„œ ์‹คํ–‰
  • โ†’ ๋ˆ„๊ฐ€ ๋ฐ›๋“  ๊ฐ™์€ ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œ๋จ

์ž์ฃผ ์“ฐ๋Š” Gradle ๋ช…๋ น์–ด

ํ„ฐ๋ฏธ๋„์—์„œ ํ”„๋กœ์ ํŠธ ํด๋” ๊ธฐ์ค€

./gradlew build      # ์ปดํŒŒ์ผ + ํ…Œ์ŠคํŠธ + jar ๋งŒ๋“ค๊ธฐ
./gradlew bootRun    # ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„ ์‹คํ–‰
./gradlew test       # ํ…Œ์ŠคํŠธ๋งŒ ์‹คํ–‰
./gradlew clean      # build ํด๋” ์ง€์šฐ๊ธฐ
  • ./gradlew build ํ•˜๋ฉด โ†’ build/libs/HelloSpring-0.0.1-SNAPSHOT.jar ์ƒ๊น€
  • ์ด jar๋Š” java -jar ํŒŒ์ผ์ด๋ฆ„.jar๋กœ ์–ด๋””์„œ๋“  ์‹คํ–‰ ๊ฐ€๋Šฅ (ํ†ฐ์บฃ์ด ์•ˆ์— ๋“ค์–ด ์žˆ์–ด์„œ)

IntelliJ์—์„œ ์“ธ ๋•Œ

  • build.gradle ๊ณ ์น˜๋ฉด โ†’ ์˜ค๋ฅธ์ชฝ ์œ„ ๐Ÿ˜ Load Gradle Changes ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ
  • ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ” ๐Ÿ˜ Gradle ํƒญ โ†’ ์œ„ ๋ช…๋ น์–ด๋“ค์„ ํด๋ฆญ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ์™ผ์ชฝ External Libraries ํŽผ์น˜๋ฉด โ†’ ์‹ค์ œ๋กœ ๋ฐ›์•„์ง„ jar ๋ชฉ๋ก ๋ณผ ์ˆ˜ ์žˆ์Œ