๊ฐ์
ํ๋ก์ ํธ์ ๋ชจ๋ ์์ ์ฝ๋๋์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ก์ปฌ์์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ ๊ตฌ๋ํ๋ ๋ฐ ์์๋๋ ์๊ฐ์ด ์ง์์ ์ผ๋ก ๊ธธ์ด์ก๋ค. ์ด๋ก ์ธํด ๋ก์ปฌ์์ ์ฝ๋๋ฅผ ์์ ํ๊ณ ๋ค์ ๊ตฌ๋ํ์ฌ ํ ์คํธํ๋ ๊ณผ์ ์์ ๋ถํ์ํ ์๊ฐ์ด ๋์ด๋ฌ๊ณ , ๋น๋ ์๊ฐ๋ ์ฆ๊ฐํ๋ฉด์ CI ์ํ์๊ฐ์ด ๊ธธ์ด์ ธ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๊ณ์ ์ ํ๋์๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์๊ฐ๊ณผ ๋น๋ ์๊ฐ์ ๋จ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๊ณ ์ ์ฉํด ๋ณด์๋ค.(Spring Boot v3.2.7, Gradle v8.5 ์ฌ์ฉ ์ค)
1. ๋ถํ์ํ ์ปดํฌ๋ํธ ์ค์บ ๋ฒ์ ์ถ์ ๋ฐ ์ง์ฐ ์ด๊ธฐํ(lazy initialization) ์ค์
์ ์ฉ ์ดํ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์๊ฐ 47% ๋จ์ถ
- Mac(M4 Pro): 53์ด → 22์ด
- Windows(ASUS gu603): 90์ด → 48์ด
2. Gradle ๋ณ๋ ฌ ์ฒ๋ฆฌ(parallel execution) ๋ฐ ๋น๋ ์บ์(build cache) ํ์ฉ
์ ์ฉ ์ดํ ๋น๋ ์๊ฐ 91% ๋จ์ถ
- ์ ์ฒด ๋น๋ ๊ธฐ์ค: 3๋ถ 16์ด → 17์ด
1. ์ง์ฐ ์ด๊ธฐํ(lazy initialization) ์ค์
Spring์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์์ ์ ์ปจํ ์คํธ์ ๋ฑ๋ก๋ ๋ชจ๋ ์ฑ๊ธํค ๋น์ ์ฆ์ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ค. ๊ทธ๋ฌ๋ ์ค์ ๊ฐ๋ฐ ์์ ์์๋ ๋ชจ๋ ๋น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ฌ๋งํด์ ์ ์๋ค. ๋น์ฅ ๋ด๊ฐ ์ํ ํ๋ก์ ํธ๋ง ํ๋๋ผ๋ ์ฌ๋ฌ ์ค์ฟผ๋๊ฐ ๋์ผํ ๋ ํฌ์งํ ๋ฆฌ์์ ๋ชจ๋๋ณ๋ก ๋๋ ์ฌ์ฉํ๋๋ฐ ๋ค๋ฅธ ์ค์ฟผ๋์ ๋ชจ๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฌ์ฉํ์ง ์๊ณ , ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋์์๋ ์ง๊ธ ๊ฐ๋ฐํ๋ ๋ก์ง ๋ง๊ณ ๋ ์ฌ์ฉ๋์ง ์๋ ๋น๋ค์ด ๋๋ค์๋ค.
์ด๋ฌํ ์ํฉ์์ spring.main.lazy-initialization=true ์ค์ ์ ์ ์ฉํ๋ฉด, ๋ชจ๋ ๋น์ ์์ฑ์ ํ ๋ฒ์ ์ค์ ์ฌ์ฉ ์์ ๊น์ง ์ง์ฐ์ํฌ ์ ์๋ค.
์ฆ์ ์ด๊ธฐํ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ง์ฐ ์ด๊ธฐํ ๋ฐฉ์์์๋ ๋ถํ์ํ ๋น์ ์์ฑํ์ง ์์ผ๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์ ํ์ํ ํด๋์ค์ ๋น์ ์๊ฐ ๋ํญ ๊ฐ์ํ์ฌ ๋ก๋ฉ ์๊ฐ์ด ํฌ๊ฒ ๋จ์ถ๋ ์ ์๋ค.
์ค์ ๋ก ํ๋ก์ ํธ์์ Java Flight Recorder(JFR)๋ฅผ ํ์ฉํ์ฌ ์ง์ฐ ์ด๊ธฐํ ์ ์ฉ ์ ํ๋ก ๋ฉ์๋ ํธ์ถ ํ์๊ฐ ์ผ๋ง๋ ์ค์ด๋ค์๋์ง ๋น๊ตํด ๋ณด์๋ค.
-XX:StartFlightRecording=duration=60s,filename=boot.jfr,settings=profile
JFR์ VM options์ ์ ์ต์ ์ ์ฃผ๊ณ ์คํํ๋ฉด ์์ง์ด ๊ฐ๋ฅํ๊ณ , IntelliJ๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด ๋ณ๋๋ก JMC๋ฅผ ์ค์นํ์ง ์๊ณ ๋ JFR์ IntelliJ์์ ์ด์ด๋ณผ ์ ์๋ค.
Profiler ๊ฒฐ๊ณผ
์ด๊ธฐ ๋ก๋ฉ ์ ๋ฉ์๋ ํธ์ถ ํ์๊ฐ ์ ๋ฐ ์ด์ ๊ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ๋ฐ๋ผ ๋ก๋ฉ์ด ์๋ฃ๋๋ ์๊ฐ๋ ์ ๋ฐ ์ด์์ด ์ค์ด๋ค์๋ค.
์ฑ๋ฅ์ด ์ข์๋ฐ ์ ๊ธฐ๋ณธ ์ค์ ์ด ์๋๊น?
์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ค์ ํ๋ฉด ๋ถํธ ๋ก๋ฉ ์๋๊ฐ ๋์ ๋๊ฒ ๋นจ๋ผ์ง๋ค. ๊ทธ๋ฐ๋ฐ๋ ์คํ๋ง์ ๊ธฐ๋ณธ ์ค์ ์ ์ ์ฆ์ ์ด๊ธฐํ์ผ๊น?
์ง์ฐ ์ด๊ธฐํ๊ฐ ์ด๊ธฐ ๋ก๋ฉ ์ ์ฑ๋ฅ์ ์ผ๋ก ๋ฐ์ด๋๋ฐ๋ ๊ธฐ๋ณธ ์ค์ ์ด ์๋ ์ด์ ๋ ์ํ ์ฐธ์กฐ, ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ ๋ฑ์ ๋ฌธ์ ๋ฅผ ์ฆ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ ๋ฑ ์ ์ฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋ก์ปฌ์์ ๋์ธ ๋๋ง ์ ํ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด ์์ ํ๊ฒ ์ฑ๋ฅ์ ์ด์ ์ ๋๋ฆด ์ ์๋ค๊ณ ์๊ฐ๋๋ค.
๋ง์ฝ ๋ชจ๋ ๋น์ ์ง์ฐ ์ด๊ธฐํํ๋ ๊ฒ์ด ๋ถ๋ด์ค๋ฝ๊ฑฐ๋, ๋ฐฐํฌ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด @Lazy๋ฅผ ์ฌ์ฉํด ์ ํ์ ์ผ๋ก ํ ์คํธํด ๋ณด๊ณ ํ๋์ฉ ์ ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
2. Gradle ๋ณ๋ ฌ ์ฒ๋ฆฌ(parallel execution) ๋ฐ ๋น๋ ์บ์(build cache)
Gradle์ ๋น๋ ์ฑ๋ฅ์ ๊ฐ์ ์ ๋ํ ์์ธํ ๋ฌธ์๋ Gradle Performance ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค. ์ฑ๋ฅ๊ฐ์ ์ธ์๋ ๋ชจ๋ ์์ฑ์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด Gradle Properties๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
์ฑ๋ฅ ๊ฐ์ ๊ณผ ๊ด๋ จ๋ ์ฃผ์ ์์ฑ์ ์๋ ์ธ ๊ฐ์ง์ด๋ค.
1. org.gradle.daemon=true
Gradle ๋น๋๋ฅผ ์ํด JVM์ ๋งค๋ฒ ์๋ก ๋์ฐ๋ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํญ์ ์คํ๋๋ ๋ฐ๋ชฌ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๋ค. JVM ์ด๊ธฐํ ๋น์ฉ์ ์ ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๋ ์์์ด ํจ์ฌ ๋นจ๋ผ์ง๋ค. ๋ค๋ง Gradle v3.0๋ถํฐ๋ default๊ฐ true์ด๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์๋ ์๋ง ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
2. org.gradle.caching=true
์ด์ ๋น๋์์ ์์ฑ๋ task ๊ฒฐ๊ณผ(์ปดํ์ผ ๊ฒฐ๊ณผ, ๋ฆฌ์์ค ์ฒ๋ฆฌ ๋ฑ)๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ, ๋ค์ ๋น๋ ์ ์ ๋ ฅ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๋ค. ํนํ ๋ฉํฐ ๋ชจ๋๊ณผ ๊ฐ์ ํ๋ก์ ํธ์์ ๊ณตํต ๋ชจ๋์ด ์์ฃผ ์ฌ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์ ํฐ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
์ฐธ๊ณ ๋ก ./gradlew clean์ ์คํํ๋๋ผ๋ ์บ์๋ ์ญ์ ๋์ง ์๊ณ ์ ์ง๋๋ค. ๋ฐ๋ผ์ ๋ณ๋๋ก ์บ์๋ฅผ ์ง์ฐ์ง ์๋ ํ clean ํ build๋ฅผ ์ํํ๋๋ผ๋ ์บ์๋ ์ ์ฉ๋๋ค. ์บ์๋ฅผ ์ญ์ ํ๋ ค๋ฉด Gradle์ ์บ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ์ญ์ ํ๋ฉด ๋๋ค. (~/.gradle/)
3. org.gradle.parallel=true
์๋ก ์์กดํ์ง ์๋ task๋ค์ ๋์์ ๋ณ๋ ฌ๋ก ์ํํ์ฌ ๋น๋ ์๋๋ฅผ ๋์ธ๋ค. ์ด๋ '์์กด๊ด๊ณ์ ๋ฐ๋ฅธ ์์๋ฅผ ๋ฐ๋ก ์ง์ ํด์ฃผ์ด์ผ ํ๋?' ์ถ์ ์๋ ์์ง๋ง ์์กด ๊ด๊ณ์ ๋ฐ๋ฅธ ์คํ ์์๋ ๋ฐ๋ก ์ ์ํด์ฃผ์ง ์๋๋ผ๋ ๋ณด์ฅ๋๋ค. Gradle์ ๋น๋ ์คํ ์ ์ ํ์คํฌ ๊ฐ ์์กด ๊ด๊ณ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ์ด ๊ทธ๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์คํฌ์ ์คํ ์์๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์์กด์ฑ์ด ์๋ ํ์คํฌ๋ ๋ฐ๋์ ์ ํ ํ์คํฌ๊ฐ ์๋ฃ๋ ํ ์คํ๋๋ฉฐ, ์์กด์ฑ์ด ์๋ ํ์คํฌ๋ ๋ณ๋ ฌ๋ก ์คํ๋๋ค.
์ ์ฉ๋ฐฉ๋ฒ์ project root์ gradle.properties๋ฅผ ๋ง๋ค๊ณ ์์ฑ์ ํ์ฉํด ์ฃผ๋ฉด ๋๋ค.
# gradle.properties
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
์ ์ฉ ํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์
ํด๋น ์ค์ ๋ค์ ์ ์ฉํ ์ดํ ๋น๋ ์ค ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ์๋ ์์์ฒ๋ผ ๋ณธ์ธ ํ๊ฒฝ์ ๋ง๊ฒ JVM ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉํ์คํ์ด์ค ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ฃผ๋ฉด ๋๋ค.
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
Profiler ๊ฒฐ๊ณผ
./gradlew build --scan ๋ช ๋ น์ด๋ฅผ ํตํด ๋น๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ค.
๊ธฐ๋ณธ ์ค์ ์ผ๋ก ๋น๋๋ฅผ ์ํํ ๊ฒฐ๊ณผ ์ด 26๊ฐ์ ํ๋ก์ ํธ์์ 363๊ฐ์ ํ์คํฌ๊ฐ ์คํ๋์๊ณ , ์ ์ฒด ๋น๋ ์๊ฐ์ 3๋ถ 16์ด๊ฐ ์์๋์๋ค.
org.gradle.caching=true ์ต์ ์ ์ ์ฉํ ๊ฒฝ์ฐ, ๋์ผํ๊ฒ 363๊ฐ์ ํ์คํฌ๊ฐ ์คํ๋์์ง๋ง ์ด ์ค 70๊ฐ์ ํ์คํฌ๊ฐ ์บ์๋ก ์ฒ๋ฆฌ๋์๋ค. ๋๋ถ์ ์ฝ 1๋ถ 37์ด๋ฅผ ์ ์ฝํ์ฌ ์ ์ฒด ๋น๋ ์๊ฐ์ 1๋ถ 35์ด๋ก ๋จ์ถ๋์๋ค.
org.gradle.parallel=true ์ต์ ๊น์ง ์ถ๊ฐ ์ ์ฉํ ๊ฒฐ๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ด๋ค์ง ๊ฒ์ ํ์๋ผ์ธ์์ ํ์ธํ ์ ์๋ค. ์ ์ฒด ๋น๋ ์๊ฐ์ ๋จ 17์ด๋ก ์ฑ๋ฅ์ด ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ๋์๋ค.
์ ์์ฑ๋ค์ ์ถ๊ฐํจ์ผ๋ก์จ ๋ก์ปฌ๋ฟ๋ง ์๋๋ผ CI๋จ๊ณ์์๋ ๋น๋ ์๊ฐ์ ๋ํญ ์ค์ผ ์ ์์๋ค.
์ ๋ฆฌ
์ด๋ฒ ์ต์ ํ ์์ ์ ํตํด Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ฉ ์๊ฐ์ ์ต๋ 47%, ๋น๋ ์๊ฐ์ ์ต๋ 91%๊น์ง ๋จ์ถํ ์ ์์๋ค. ํนํ ์ง์ฐ ์ด๊ธฐํ์ Gradle์ ์บ์ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ค์ ์ ์ ์ฉ ๋ฐฉ๋ฒ์ด ๊ฐ๋จํ๋ฉด์๋ ๋์ ๋๋ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํ๊ธฐ์ ๋์ฒ๋ผ ๋ญ๋น๋๋ ์๊ฐ ์ค๋ฒํค๋์ ๋ํด ๊ฐ์ ๊ณ ๋ฏผ์ ํ๋ค๋ฉด ํ ๋ฒ์ฏค ์ ์ฉํด ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
'ํ๊ธฐ๐ฅ > ํ๊ณ ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์น ๊ธฐ๋ฐ์ DB ํ์ ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถ๊ธฐ(feat. Flyway) (0) | 2025.01.19 |
---|---|
NextStep DDD ์ธ๋ ๋๋ฐ ์๋ฃ ํ๊ธฐ (2) | 2024.07.15 |
AWS Solution Architect Associate(SAA-C03) ์ทจ๋ ํ๊ธฐ (9) | 2024.05.06 |
์ธ๋ถ API๋ฅผ ์ฐ๋ํ ๋ ๊ณ ๋ คํ๋ฉด ์ข์ ์ ๋ค (2) | 2024.02.24 |
[๋ญํน ์๊ณ ๋ฆฌ์ฆ] - Hacker News Algorithm (3) | 2024.01.16 |
2023๋ ํ๊ณ (10) | 2024.01.14 |
๋๊ธ