
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 ํ๋ก์ ํธ์ ๋น๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ ์ํ๊ณ ์คํํ๋ ์ผ๋ จ์ ์์ ๋ค์ ์งํฉ
ํ๋ก์ ํธ๋ฅผ ๋น๋, ํจํค์ง, ํ ์คํธ, ๋ฐฐํฌ ๋ฑ์ ์์ ์ ์๋ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ์ ์๋๋ก ๋์์ค๋ค.

๐ ๋ผ์ดํ ์ฌ์ดํด ์ข
๋ฅ
๐ Clean Lifecycle
๋น๋ ์ด์ ์ ํ๋ก์ ํธ๋ฅผ ์ ๋ฆฌํ๋ ์์ ์ ์ํ
clean ๋จ๊ณ๋ฅผ ์คํํ๋ฉด ์ด์ ๋น๋์์ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ(์ปดํ์ผ๋ ํด๋์ค, ํจํค์ง ๋ ํ์ผ ๋ฑ)์ ์ญ์ ํ๋ค.
๐ Default Lifecycle
Maven ํ๋ก์ ํธ์ ์ฃผ์ ๋น๋ ๊ณผ์ ์ ์ฒ๋ฆฌ
compile, test, package, install, deploy ๋ฑ์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๊ฐ ๋จ๊ณ๋ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฌผ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์ํํ๋ค.
๐ Site Lifecycle
ํ๋ก์ ํธ์ ๋ฌธ์ํ์ ์น ์ฌ์ดํธ ์์ฑ์ ์ํ ์์ ์ ์ํ
site ๋จ๊ณ์์๋ ํ๋ก์ ํธ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , deploy ๋จ๊ณ์์๋ ๋ฌธ์๋ฅผ ์น ์๋ฒ์ ๋ฐฐํฌํ๋ค.
์ด๋ฅผ ํตํด ํ๋ก์ ํธ ๋ฌธ์, API ๋ฌธ์, ๋ณด๊ณ ์ ๋ฑ์ ์์ฑํ๊ณ ๊ณต์ ํ ์ ์๋ค.
pom.xml ํ์ผ์์ ์ ์ธ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ๋น๋ ๊ณผ์ ์ ์๋ํํ๋ค.
Maven์ ๋น๋ ๋ผ์ดํ์ฌ์ดํด์ ์ ์๋ ๊ฐ ๋จ๊ณ์์ ํ์ํ ์์ ์ ์คํํ๊ณ , ์์กด์ฑ ๊ด๋ฆฌ์ ์ค์ ์ ๋ณด๋ฅผ ํตํด ๋น๋๋ฅผ ์ ์ดํ๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ณ , ํ์ํ ์์ ์ ์๋์ผ๋ก ์ํํ ์ ์๋ค.
๐ ๊ฐ ๋ผ์ดํ ์ฌ์ดํด ์ค๋ช

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๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ๋ก์ ํธ ๋ชฉ๋ก


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
'๐๏ธ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
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 |
๋๊ธ