๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค

SpringBoot Part 1-1

by hyeon-z 2023. 6. 21.

 

SpringBoot Part 1-1

1. Maven์ด๋ž€

 

Build Tool

- Gradle

- Maven

 

Build๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

- ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  classpath์— ์ถ”๊ฐ€ํ•œ๋‹ค.

- ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ

- ํ…Œ์ŠคํŠธ ์‹คํ–‰ (์ฝ”๋“œ์— ๋ฌธ์ œ ์—†๋Š” ์ง€ ํ™•์ธ)

- ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ๋ฅผ packaging ํ•œ๋‹ค. -> jar, war, zip..

- packing ๋œ ํŒŒ์ผ์„ ์ฃผ๋กœ artifacts๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์„œ๋ฒ„๋‚˜ ๋ ˆํฌ์ง€์ฝ”๋ฆฌ์— ๋ฐฐํฌํ•œ๋‹ค.

 

Maven

 

- ๋นŒ๋“œ ๋„๊ตฌ

- XML ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ • ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๊ณ  pom.xmlํŒŒ์ผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

* POM(Project Object Model)

 

Maven์˜ ์‚ฌ์šฉ ์ด์œ 

 

- archetypes๋ผ๋Š” ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ด์„œ ํ”„๋กœ์ ํŠธ ์„ค์ •์˜ ๋ฐ˜๋ณต์„ ์ค„์—ฌ์ค€๋‹ค.

-  ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ dependency๋ฅผ ๊ด€๋ฆฌํ•ด ์ค€๋‹ค.

- ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค.

-  dependency๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” repository๊ฐ€ ๋กœ์ปฌ์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  Maven Central๊ณผ ๊ฐ™์€ ๊ณต๊ฐœ๋œ Repository๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

Maven Coordinates

 

Maven ํ”„๋กœ์ ํŠธ์—์„œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ์ •๋ณด

 

Group Id: ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์กฐ์ง ๋˜๋Š” ๊ทธ๋ฃน์„ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž. ์ฃผ๋กœ ํšŒ์‚ฌ๋ช…, ๋‹จ์ฒด๋ช…์„ ์ž‘์„ฑ

ex) org.springframework, org.prgms

 

Artifact Id: Maven ํ”„๋กœ์ ํŠธ์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž. ์ฃผ๋กœ ํ”„๋กœ์ ํŠธ ๋ช… ์‚ฌ์šฉ

ex) my-project, customer-service

 

Version: ์•„ํ‹ฐํŒฉํŠธ์˜ ํŠน์ • ๋ฒ„์ „์„ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž. ํ”„๋กœ์ ํŠธ์˜ ๋ฒ„์ „ ์ž‘์„ฑ. ์•„ํ‹ฐํŒฉํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ˜ธํ™˜์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

ex) 0.0.1-RELEASE(๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „), 1.0-SNAPSHOT

 

โœ…์ •๋ฆฌ

Maven Coordinates๋Š” Maven์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ pom.xml ํŒŒ์ผ์— ์ด๋Ÿฌํ•œ ์ขŒํ‘œ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์„ ์–ธํ•˜๊ณ , Maven์€ ํ•ด๋‹น ์˜์กด์„ฑ์„ ์ฐพ์•„์„œ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Maven Multiple Module

 

๋‹จ์ผ Maven ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ด€๋ จ๋œ ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹

=> ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ถ€๋ชจ(Parent) ํ”„๋กœ์ ํŠธ์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹(Child) ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๊ฐ ๋ชจ๋“ˆ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ปดํŒŒ์ผ, ํŒจํ‚ค์ง• ๋ฐ ํ…Œ์ŠคํŠธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ณตํ†ต๋œ ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •์„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ

<modules>
 <module>service-a</module>
 <module>service-b</module>
</modules>

 

Build Lifecycle

 

Maven ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…๋“ค์˜ ์ง‘ํ•ฉ

 

ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ, ํŒจํ‚ค์ง•, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋“ฑ์˜ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

Intellij

๐Ÿ“Œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ข…๋ฅ˜

๐Ÿ‘† Clean Lifecycle

๋นŒ๋“œ ์ด์ „์— ํ”„๋กœ์ ํŠธ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰

clean ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด์ „ ๋นŒ๋“œ์—์„œ ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ(์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค, ํŒจํ‚ค์ง• ๋œ ํŒŒ์ผ ๋“ฑ)์„ ์‚ญ์ œํ•œ๋‹ค.

๐Ÿ‘† Default Lifecycle

Maven ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋นŒ๋“œ ๊ณผ์ •์„ ์ฒ˜๋ฆฌ

compile, test, package, install, deploy ๋“ฑ์˜ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

๊ฐ ๋‹จ๊ณ„๋Š” ์ด์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.


๐Ÿ‘† Site Lifecycle

ํ”„๋กœ์ ํŠธ์˜ ๋ฌธ์„œํ™”์™€ ์›น ์‚ฌ์ดํŠธ ์ƒ์„ฑ์„ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰

site ๋‹จ๊ณ„์—์„œ๋Š” ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , deploy ๋‹จ๊ณ„์—์„œ๋Š” ๋ฌธ์„œ๋ฅผ ์›น ์„œ๋ฒ„์— ๋ฐฐํฌํ•œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ, API ๋ฌธ์„œ, ๋ณด๊ณ ์„œ ๋“ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

pom.xml ํŒŒ์ผ์—์„œ ์„ ์–ธ๋œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋นŒ๋“œ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•œ๋‹ค.

Maven์€ ๋นŒ๋“œ ๋ผ์ดํ”„์‚ฌ์ดํด์— ์ •์˜๋œ ๊ฐ ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ , ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ์„ค์ • ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ๋ฅผ ์ œ์–ดํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ , ํ•„์š”ํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ ๊ฐ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์„ค๋ช…

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

 

Transitive Dependencies

 

์ถ”์ด์  ์˜์กด์„ฑ, ์˜์กด์„ฑ์˜ ์˜์กด์„ฑ

์ง์ ‘์ ์œผ๋กœ ์„ ์–ธํ•œ ์˜์กด์„ฑ์ด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋ชจ๋“ˆ๋„ ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ์ ํŠธ A๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ B์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ B๊ฐ€ ๋‹ค์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ C์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ A๋Š” B์™€ C ๋ชจ๋‘์— ๋Œ€ํ•œ ์ถ”์ด์  ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

Maven์€ ์ด๋Ÿฌํ•œ ์ถ”์ด์  ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

๋˜ํ•œ ๋™์ผํ•œ groupId, artifactId์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ€์žฅ ์ตœ์‹ ์˜ version์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

โœ…์ •๋ฆฌ

- Transitive Dependencies๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์„ ์–ธํ•˜๊ณ , Maven์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

- ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด ์ฃผ๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„์˜ ์˜์กด์„ฑ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. (ํ•˜์ง€๋งŒ ๋•Œ๋ก  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค.)

- Maven์€ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ถ”์ด์  ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

 

์˜์กด ๋ฒ”์œ„ (Dependency Scope)

 

ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์ด ์ปดํŒŒ์ผ, ํ…Œ์ŠคํŠธ, ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐœ๋…

dependency๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์˜์กด์„ฑ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>${junit-version}</version>
    <scope>test</scope>
</dependency>

 

๐Ÿ‘† Compile 

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์˜์กด์„ฑ์€ ์ปดํŒŒ์ผ ๋ฒ”์œ„๋กœ ์„ค์ •๋œ๋‹ค. => <scope>๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •

์ปดํŒŒ์ผ ์˜์กด์„ฑ์€ ํ”„๋กœ์ ํŠธ์˜ ์ปดํŒŒ์ผ, ํ…Œ์ŠคํŠธ, ์‹คํ–‰(๋Ÿฐํƒ€์ž„)์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ‘† Provided

์ผ๋ฐ˜์ ์œผ๋กœ JDK ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์„ค์ •ํ•œ๋‹ค. 

์ฆ‰, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ JSP์™€ Servlet API ๋“ฑ์€ provided ์˜์กด์„ฑ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์ปดํŒŒ์ผ, ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค ๊ฒฝ๋กœ์—๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ‘† Runtime

์ปดํŒŒ์ผ ์‹œ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„๊ณผ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋œ๋‹ค.

ex) JDBC ๋“œ๋ผ์ด๋ฒ„

 

๐Ÿ‘† Test

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฒ”์œ„๋Š” JUnit ๋ฐ Mockito์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ‘† System

provided ์˜์กด์„ฑ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ jar ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

<systemPath>.. </systemPath> ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ jar ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. 

+) ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ jar ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


2. Gradle์ด๋ž€

 

Gradle

 

- Build Tool (๋นŒ๋“œ ๋„๊ตฌ)

Groovy, Kotlin๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑ

 

Maven vs Gradle

 

๐Ÿ‘† Maven

Maven์€ Java ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ, ๋นŒ๋“œ ๋„๊ตฌ์ด๋ฉด์„œ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.

Apache Ant์˜ ๋Œ€์•ˆ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, Apache ๋ผ์ด์„ ์Šค๋กœ ๋ฐฐํฌ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค.

๐Ÿ‘† Gradle

Gradle์€ Maven์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ๊ด€๋ฆฌ ๋ฐ ๋ฒ”์šฉ ๋นŒ๋“œ ๋„๊ตฌ์ด๋‹ค.

Ant Builder์™€ Groovy ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ๊ธฐ์กด Ant์˜ ์—ญํ• ๊ณผ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Gradle์€ ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.


3. Spring Framework

 

Spring์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์žˆ์–ด์„œ ๋ฐฉ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Framework๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก

https://spring.io/projects
https://spring.io/projects

 

Spring Boot์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

 

SpringApplication์„ ํ†ตํ•œ ์†์‰ฌ์šด ์‹คํ–‰

- Auto Configuration - ์ž๋™์œผ๋กœ ๋นˆ(bean)์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ

์‰ฌ์šด ์™ธ๋ถ€ ํ™˜๊ฒฝ ์„ค์ • - Properties, YAML, Command line ์„ค์ • ๋“ฑ

- ํ”„๋กœํŒŒ์ผ์„ ํ†ตํ•œ ์‹คํ–‰ํ™˜๊ฒฝ ๊ด€๋ฆฌ (ex. application.yml, application.properties)

Packaging Executable Jar (. jarํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•)

- Developer Tools


4. Spring Framework์˜ ํ•ต์‹ฌ ๊ฐœ๋…

 

Domain Driven Design

 

๐Ÿ’ก Domain

 

์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ƒ ์˜์—ญ

 

ex) ์ฃผ๋ฌธ ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„๋ฉ”์ธ์€ ์ฃผ๋ฌธ ๊ด€๋ฆฌ

 

๐Ÿ’ก Entity

 

- ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž(ID)๋ฅผ ๊ฐ€์ง„๋‹ค.

- ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋˜๋Š” ๊ฐ์ฒด

 

ex) ์ฃผ๋ฌธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋งค ์ฃผ๋ฌธ(์—”ํ‹ฐ) ๊ฐœ๋ณ„์„ฑ์„ ๊ฐ€์ง„๋‹ค. ๊ฐ ์ฃผ๋ฌธ์€ ๋…๋ฆฝ์ ์ด๋‹ค.

์ฃผ๋ฌธ์˜ ์ƒํƒœ๋กœ๋Š” ์ฃผ๋ฌธ ํ™•์ธ, ๋ฐฐ์†ก ์ค€๋น„, ๋ฐฐ์†ก ์ค‘, ๋ฐฐ์†ก ์™„๋ฃŒ๊ฐ€ ์žˆ๋‹ค. -> ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

 

๐Ÿ’ก Value Object

 

- ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(ID)๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ’์— ์˜ํ•ด ์‹๋ณ„๋œ๋‹ค.

- ๋ถˆ๋ณ€ํ•˜๋ฉฐ, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

ex) ์ฃผ๋ฌธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ์ฃผ์†Œ

์ฃผ์†Œ๋Š” ๋„์‹œ, ๊ฑฐ๋ฆฌ, ์šฐํŽธ๋ฒˆํ˜ธ ๋“ฑ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‘ ๊ฐœ์˜ ์ฃผ์†Œ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๋„์‹œ, ๊ฑฐ๋ฆฌ, ์šฐํŽธ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋ฉด ๊ฐ™์€ ์ฃผ์†Œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

 

์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ๋ฌธ๋ฒ• ์ •๋ฆฌ

 

๐Ÿ’กStream - reduce()

 

- ์ •์˜๋œ ์—ฐ์‚ฐ์ด ์•„๋‹Œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ์—ฐ์‚ฐ์„ ์ ์šฉํ•œ๋‹ค.

 

T reduce(T identity, BinaryOperator<T> accumulator);

- identity: ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ’. ์ŠคํŠธ๋ฆผ์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- accumulator: ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” BinaryOperator. ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ ์šฉ๋œ๋‹ค.

* BinaryOperator: Java์˜ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ๋‘ ๊ฐœ์˜ ๋™์ผํ•œ ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜.

 

ex) ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ

arr.stream().reduce(0L, Long::sum);
arr.stream().reduce(0L, (a, b) -> a + b);

์œ— ์ค„: BinaryOperator <Long> ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ (Long::sum)

* ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋Š” Java์—์„œ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋žŒ๋‹ค์‹์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ

์•„๋ž˜ ์ค„: BinaryOperator <Long> ํ˜•ํƒœ์˜ ๋žŒ๋‹ค์‹ ์‚ฌ์šฉ ((a, b) -> a + b)

 

 

๐Ÿ’ก record ํƒ€์ž…

 

Java 14๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ๋ถˆ๋ณ€(immutable)ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ํด๋ž˜์Šค

public record OrderItem(UUID productId,
                        long productPrice,
                        long quantity) {
}

 

 

๐Ÿ‘† ํŠน์ง•
ํ•„๋“œ ์„ ์–ธ: record ํด๋ž˜์Šค๋Š” ํ•„๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ํ•„๋“œ๋Š” final ๋ฐ private์œผ๋กœ ์•”๋ฌต์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค.
์ƒ์„ฑ์ž: record ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉฐ, ํ•„๋“œ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
ํ•„๋“œ ์ ‘๊ทผ ๋ฉ”์„œ๋“œ: record ํด๋ž˜์Šค๋Š” ์ž๋™์œผ๋กœ ํ•„๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ž(getter) ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํ•„๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
equals(), hashCode(), toString(): record ํด๋ž˜์Šค๋Š” ์ž๋™์œผ๋กœ equals(), hashCode(), toString() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋“ค ๋ฉ”์„œ๋“œ๋Š” ํ•„๋“œ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ ๋น„๊ต, ํ•ด์‹œ ์ฝ”๋“œ ์ƒ์„ฑ, ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ๋‹ด๋‹นํ•œ๋‹ค.

 

record ํƒ€์ž…์˜ ์‚ฌ์šฉ์€ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…๋ฃŒํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํŽธ๋ฆฌํ•˜๋‹ค.

์ฃผ๋กœ DTO(Data Transfer Object), VO(Value Object)๋“ฑ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•œ ๊ฐ์ฒด๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.


5. ์˜์กด์„ฑ ๊ด€๋ฆฌ

 

๊ฒฐํ•ฉ๋„๋ž€?

 

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์š”๊ตฌํ•˜๋Š” ์ •๋„

 

๋‘ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๋ฐ”๋žŒ์งํ•  ๋•Œ: ์•ฝํ•œ ๊ฒฐํ•ฉ๋„, ๋А์Šจํ•œ ๊ฒฐํ•ฉ๋„

๋‘ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•  ๋•Œ: ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„, ๋‹จ๋‹จํ•œ ๊ฒฐํ•ฉ๋„

 

์˜์กด์„ฑ์ด๋ž€?

 

์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ํ˜‘๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ, ๋‘ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

์˜์กด์„ฑ์€ ๊ตฌํ˜„ ์‹œ์ (์ปดํŒŒ์ผ ํƒ€์ž„)๊ณผ ์‹คํ–‰ ์‹œ์ (๋Ÿฐ ํƒ€์ž„)์— ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

- ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜์กด์„ฑ: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—์„œ ๋ฐœ์ƒ, ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์˜์กด์„ฑ

- ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์—์„œ ๋ฐœ์ƒ, ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ

 

๐Ÿ“ข ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜์กด์„ฑ => ๊ฐ•๋ ฅํ•œ ๊ฒฐํ•ฉ๋„

 

public class Order {
    private FixedAmountVoucher fixedAmountVoucher;
	
    public Order(long discountAmount) {
        this.fixedAmountVoucher = new FixedAmountVoucher(discountAmount);
    }  
}

Order์™€ FixedAmountVoucher(๊ณ ์ •๋œ ๊ธˆ์•ก์„ ํ• ์ธ)๋Š” ํด๋ž˜์Šค ํƒ€์ž…์—์„œ ๋‹จ๋‹จํ•œ ๊ฒฐํ•ฉ๋„ ์กด์žฌ

 

FixedAmountVoucher์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Order์—๋„ ํฐ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.

=> ๋‹ค๋ฅธ Voucher์˜ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งŽ์€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

 

๐Ÿ“ข  ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ => ๋А์Šจํ•œ ๊ฒฐํ•ฉ๋„

 

public interface Voucher {
    long discount(long beforeDiscount);
}
public class FixedAmountVoucher implements Voucher{
    private final long amount;

    public FixedAmountVoucher(long amount) {
        this.amount = amount;
    }

    public long discount(long beforeDiscount) {
        return beforeDiscount - amount;
    }
}
public class Order {
    private Voucher voucher;

    public Order(Voucher voucher) {
        this.voucher = voucher;
    }
}
public class Main {
    public static void main(String[] args) {
        FixedAmountVoucher fixedAmountVoucher = new FixedAmountVoucher(10L);
        Order order = new Order(fixedAmountVoucher);
    }
}

Order์—๊ฒŒ ๋Ÿฐํƒ€์ž„์— ํŠน์ •ํ•œ Voucher๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๋ฐฉ์‹

 

- Order๋Š” interface์™€ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์‹ค์ œ ๊ตฌํ˜„์ฒด์™€๋Š” ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

- FixedAmountVoucher์™€ PercentAmountVoucher๊ฐ€ Voucher ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Voucher๋ฐฉ์‹์ด ๋ฐ”๋€Œ์–ด๋„ Orderํด๋ž˜์Šค์—์„œ์˜ ๋ณ€๊ฒฝ์€ ์—†๋‹ค.

 

 

Reference

Java 14 Record Keyword

 

'๐Ÿ•Š๏ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SpringBoot Part1-5  (0) 2023.06.26
SpringBoot Part1-4  (0) 2023.06.23
SpringBoot Part1-3  (0) 2023.06.22
SpringBoot Part1-2  (0) 2023.06.21
ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ JAVA - OOP  (0) 2023.06.11

๋Œ“๊ธ€