๊ฐœ๋ฐœ์ผ์ง€

[๋„์ปค] ๋„์ปค ์ตœ์ ํ™” - ๋„์ปค ๋ ˆ์ด์–ด ์บ์‹ฑ์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„ ์ค„์ด๊ธฐ! (Layered jar, bootjar, ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ) ๋ณธ๋ฌธ

Backend๐Ÿงฑ/์ธํ”„๋ผ

[๋„์ปค] ๋„์ปค ์ตœ์ ํ™” - ๋„์ปค ๋ ˆ์ด์–ด ์บ์‹ฑ์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„ ์ค„์ด๊ธฐ! (Layered jar, bootjar, ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ)

doublejune 2025. 4. 25. 16:22

 

ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ด ๋นŒ๋“œํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ด, EC2์— ๋ฐฐํฌํ•œ๋‹ค.
์•ž์œผ๋กœ ์ˆ˜์—†์ด ๋ฐฐํฌ๊ฐ€ ๋ฐ˜๋ณต๋ ํ…๋ฐ, ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ  ๋นŒ๋“œ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„๊ณผ ์ปดํ“จํŒ… ์ž์›์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ๊ฒƒ์ด๋‹ค!

 

ํ™˜๊ฒฝ: java 21, ์Šคํ”„๋ง๋ถ€ํŠธ3.4

 

๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š”,

๋„์ปค์˜ ์บ์‹ฑ์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„์„ 65์ดˆ->40์ดˆ๋กœ ์•ฝ 35%๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

 

1. ํ˜„์žฌ ๋„์ปคํŒŒ์ผ

# ๋นŒ๋“œ ๋‹จ๊ณ„
#๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ƒ์„ฑ. ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŠน์ • ์ดˆ๊ธฐ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธํŒ….
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /back
COPY . .
RUN ./gradlew clean build 

# ์‹คํ–‰ ๋‹จ๊ณ„ 
FROM eclipse-temurin:21-jre
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar /back/weddy.jar 
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์„ ์–ธ 
EXPOSE 8080 
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๊ธฐ๋ณธ ๋ช…๋ น์–ด
CMD ["java", "-Dspring.profiles.active=local", "-jar", "weddy.jar"]

 

์ง€๊ธˆ ๋„์ปคํŒŒ์ผ์„ ๋ณด๋ฉด ๋‹จ์ˆœํ•˜๋‹ค.

๋นŒ๋“œ ํ›„ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ 342MB์ •๋„ ๋๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„์ปค๋Š” ๋ ˆ์ด์–ด๋ณ„ ์บ์‹ฑ์„ ํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค.

 


 

2. ์šฐ์„  ํฌ๊ธฐ ์ค„์ด๊ธฐ

 

๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ 

FROM eclipse-temurin:21-jre

์—์„œ

FROM eclipse-temurin:21-jre-alpine

 

๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ 

์šฉ๋Ÿ‰์„ 342MB -> 260MB๋กœ ์ค„์˜€๋‹ค!

 

์ฐธ๊ณ : https://doublejune.tistory.com/77

 

[๋„์ปค] ๋„์ปค ์ตœ์ ํ™” - ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด ๋ฌด์กฐ๊ฑด ์ข‹์„๊นŒ?(alpine, musl libc, JNI)

ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์— ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ํ•˜๋ฉฐ, ๊ณผ์ •์„ ์ข€ ๋” ์ตœ์ ํ™”ํ•˜๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋„์ปค๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์ด ์ˆ˜ ์—†์ด ๋ฐ˜๋ณต๋ ํ…๋ฐ,

doublejune.tistory.com

 

 


 

3. ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ค„์ด๊ธฐ - ๋ ˆ์ด์–ด ๋ถ„๋ฆฌ

 

ํ˜„์žฌ๋Š” ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„๋งŒ ์ˆ˜์ •๋˜๋”๋ผ๋„ ์˜์กด์„ฑ์„ ๋‹ค์‹œ ๋ฐ›์•„์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ์˜ COPY . . ๋ถ€๋ถ„์€

ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ๋‚ด๊ฐ€ builder๋ผ ์ด๋ฆ„ ๋ถ™์ธ ์Šคํ…Œ์ด์ง€(ํ•˜๋‚˜์˜ ๋…๋ฆฝ๋œ ์ด๋ฏธ์ง€ ๋‹จ์œ„) ๋‚ด๋ถ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค.

 

๋ณต์‚ฌ๋ฅผ ํ•  ๋•Œ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ด์ „๊ณผ ๋‹ฌ๋ผ์ง„ ๋ถ€๋ถ„์ด ์—†๋‹ค๋ฉด ๋„์ปค ์บ์‹œ์— ์ €์žฅ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋œ๋‹ค.

ํ•˜์ง€๋งŒ, ์†Œ์Šค์ฝ”๋“œ ํ•œ ์ค„ ์ด๋ผ๋„ ์ˆ˜์ •์ด ๋œ๋‹ค๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์‚ฌํ•ด์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ , COPY . . ๋ ˆ์ด์–ด ์ดํ›„์˜ ๋ชจ๋“  ๋ ˆ์ด์–ด๋Š” ๋‹ค์‹œ ๋นŒ๋“œ๋œ๋‹ค.

 

์ฆ‰, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„๋งŒ ์ˆ˜์ •๋˜๋”๋ผ๋„ ์˜์กด์„ฑ์„ ๋‹ค์‹œ ๋ฐ›์•„์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ, ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

์ „:

#๋นŒ๋“œ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /back
COPY . .
RUN ./gradlew clean build

 

ํ›„ :

# ๋นŒ๋“œ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /back
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon

COPY src src
RUN ./gradlew clean bootJar --no-daemon

 

์˜์กด์„ฑ(gradle ๊ด€๋ จ ํŒŒ์ผ)์„ ๋จผ์ € COPYํ•˜๊ณ , ๋นŒ๋“œํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋„์ปค์—์„œ๋Š” ์†Œ์Šค์ฝ”๋“œ(src)๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋”๋ผ๋„, ์˜์กด์„ฑ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—

 

COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon

 

์—์„œ ๋ชจ๋‘ ๋„์ปค ์บ์‹œ HIT ํ•˜๊ฒŒ ๋œ๋‹ค.(=์˜์กด์„ฑ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•  ํ•„์š” ์—†๋‹ค. ๊ธฐ์กด์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.)

 


 

4. ์‹œ๊ฐ„ ์ข€ ๋” ์ค„์ด๊ธฐ - spring boot์˜ jar ๋ ˆ์ด์–ด ๋ถ„๋ฆฌ

 

์šฐ๋ฆฌ๋Š” ์œ„์—์„œ ๋ ˆ์ด์–ด๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐค ์ˆ˜๋ก, ๋„์ปค ์บ์‹ฑ์„ ํ†ตํ•ด ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ์„ ์•Œ์•˜๋‹ค. (์ž˜๊ฒŒ ์ชผ๊ฐœ๋ฉด, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ)

 

๊ทธ๋ž˜์„œ, Spring Boot ์„œ๋ฒ„๋ฅผ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ์ธ jarํŒŒ์ผ๋„ ์ชผ๊ฐœ๋ณธ๋‹ค.

 

Layered jar
: ๊ณ„์ธตํ˜• JAR. JAR ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ .

๊ณต์‹๋ฌธ์„œ 

 

Layerd jar๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์„ ๋” ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค๊ณ , ๋ฐฐํฌ ๋ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

 

*Layered JAR๋Š” Java 9๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ(Java Module System)์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด๋‹ค. ๋”ฐ๋ผ์„œ Layered JAR๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Java 9 ์ด์ƒ์˜ ๋ฒ„์ „์ด ํ•„์š”ํ•˜๋‹ค.
*๊ทธ๋ฆฌ๊ณ  spring boot 2.3.0 ์ด์ƒ๋ถ€ํ„ฐ layer ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

Layerd jar๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์žˆ๋‹ค.

 

- application: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ
- snapshot-dependencies: ํ”„๋กœ์ ํŠธ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ์Šค๋ƒ…์ƒท ์ข…์†์„ฑ jar ํŒŒ์ผ
- spring-boot-loader: jar ๋กœ๋”์™€ ๋Ÿฐ์ฒ˜
- dependencies: ํ”„๋กœ์ ํŠธ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ jar ํŒŒ์ผ

 

์œ„๋กœ ๊ฐˆ์ˆ˜๋ก ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋ ˆ์ด์–ด๋‹ค.

 

๋ณด๋ฉด, ๋„์ปค์˜ ๋ ˆ์ด์–ด๊ตฌ์กฐ๊ฐ€ ๋– ์˜ค๋ฅธ๋‹ค.

๋„์ปค๋Š” ๋ ˆ์ด์–ด๋ณ„๋กœ ์บ์‹œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. 

๊ทธ๋Ÿฌ๋‹ˆ ๋ณ€๊ฒฝ์ด ์•ˆ๋œ ๋ ˆ์ด์–ด๋Š” ์บ์‹ฑ์„ ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก Layered jar๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

# JAR ๋ ˆ์ด์–ด ์ถ”์ถœ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine AS extractor
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar weddy.jar
RUN java -Djarmode=layertools -jar weddy.jar extract


# ์‹คํ–‰ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine
WORKDIR /back
COPY --from=extractor /back/dependencies/ ./
COPY --from=extractor /back/spring-boot-loader/ ./
COPY --from=extractor /back/snapshot-dependencies/ ./
COPY --from=extractor /back/application/ ./

 

์œ„๋Š” ๋ณ€๊ฒฝ ํ›„ ์ฝ”๋“œ๋‹ค.

RUN java -Djarmode=layertools -jar weddy.jar extract

๋ฅผ ํ†ตํ•ด 4๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ๋ ˆ์ด์–ด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

๊ทธ ํ›„,

FROM eclipse-temurin:21-jre-alpine
WORKDIR /back
COPY --from=extractor /back/dependencies/ ./
COPY --from=extractor /back/spring-boot-loader/ ./
COPY --from=extractor /back/snapshot-dependencies/ ./
COPY --from=extractor /back/application/ ./

 

์ด๋ ‡๊ฒŒ ์ž˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ ˆ์ด์–ด ๋ถ€ํ„ฐ COPYํ•œ๋‹ค.

 

๋„์ปค๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ, ๊ทธ ์œ„์˜ ๋ ˆ์ด์–ด๋ถ€ํ„ฐ๋Š” ์ „๋ถ€ ๋‹ค์‹œ ์ƒ์„ฑ(์ดˆ๊ธฐํ™”)ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์ ์€ ๋ ˆ์ด์–ด๋ถ€ํ„ฐ ์Œ“์•„์•ผ ์บ์‹ฑ์„ ์ž˜ ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

5. ์ตœ์ข… ์™„์„ฑ๋ณธ

# ๋นŒ๋“œ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /back
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon

COPY src src
RUN ./gradlew clean bootJar --no-daemon

# JAR ๋ ˆ์ด์–ด ์ถ”์ถœ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine AS extractor
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar weddy.jar
RUN java -Djarmode=layertools -jar weddy.jar extract


# ์‹คํ–‰ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine
WORKDIR /back
COPY --from=extractor /back/dependencies/ ./
COPY --from=extractor /back/spring-boot-loader/ ./
COPY --from=extractor /back/snapshot-dependencies/ ./
COPY --from=extractor /back/application/ ./
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์„ ์–ธ
EXPOSE 8080
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๊ณ ์ • ๋ช…๋ น์–ด
ENTRYPOINT ["java", "-Dspring.profiles.active=local", "org.springframework.boot.loader.launch.JarLauncher"]

 


๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š”,

๋„์ปค์˜ ์บ์‹ฑ์„ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„์„ 65์ดˆ->40์ดˆ๋กœ ์•ฝ 35%๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

 

  • ๋ณ€๊ฒฝ ์ „
  • ๋ณ€๊ฒฝ ํ›„

 

 

์ถ”๊ฐ€๋กœ 

- gradle build ๋Œ€์‹  bootjar๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ–ˆ๋‹ค.

: build๋Š” ๋‚ด๋ถ€ ๋™์ž‘์ด ๋” ๋งŽ๋‹ค. test์ฝ”๋“œ ์‹คํ–‰, ํ”„๋กœ๋•์…˜ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ ๋ฐ ๋ฌธ์„œ ์ƒ์„ฑ์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋œ๋‹ค. bootjar๋Š” ๋‹จ์ˆœํžˆ ํ”„๋กœ์ ํŠธ์˜ jarํŒŒ์ผ๋งŒ์„ ๋งŒ๋“œ๋Š”๋ฐ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

- bootjar์‹œ clean bootjar๋ฅผ ํ–ˆ๋‹ค. ์‹œ๊ฐ„์€ ์ข€ ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ.

clean์€ /build์— ์žˆ๋Š”๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฌผ, ํด๋ž˜์ŠคํŒŒ์ผ๋“ฑ) ๋ชจ๋“  ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ์„ ์‚ญ์ œํ•œ๋‹ค. clean์„ ์‚ฌ์šฉํ•ด ํ˜น์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ex. ์˜ค๋ž˜๋œ ํด๋ž˜์ŠคํŒŒ์ผ ์œ ์ง€ ๋“ฑ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ.

 

 

 

์ฐธ์กฐ

https://velog.io/@ssol_916/Gradle-Layered-Jar-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Dockerbuild-%EC%B5%9C%EC%A0%81%ED%99%94

 

Gradle, Layered Jar ๊ทธ๋ฆฌ๊ณ  Dockerbuild ์ตœ์ ํ™”

ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์†๋„๊ฐ€ ๋‹ต๋‹ตํ•˜๋‹ค๋ฉด? Maven์—์„œ Gradle๋กœ ๋นŒ๋“œํˆด์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ข‹์€ ์ด์œ . ๊ทธ๋ฆฌ๊ณ  Docker build ์ตœ์ ํ™”ํ•˜๊ธฐ!

velog.io

https://velog.io/@noyohanx/Spring-bootjar%EA%B3%BC-%EA%B7%B8%EB%83%A5-build%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

[Spring] bootjar๊ณผ ๊ทธ๋ƒฅ build์˜ ์ฐจ์ด

ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์™€์ค‘ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋ฉฐ ๋นŒ๋“œ๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฑ์—”๋“œ ์ฑ•ํ„ฐ๋ฅผ ๋งก๊ณ ์žˆ๋Š” ํŒ€์›์—๊ฒŒ ๋ฌผ์–ด๋ณด๋‹ˆ ./gradlew bootjar ๋กœ ๋นŒ๋“œ๋ฅผ ํ•ด๋ณด๋ž€๋‹ค.

velog.io