[Quarkus] ์๊ฐ
Quarkus๋ ์ต๊ทผ์ ๋์จ ์๋ฐ ๊ธฐ๋ฐ์ ์๋ฒ ํ๋ ์์ํฌ๋ค. ๋ ๋ํ์์ ๋ง๋ค์๊ณ , ์์ ํ ์คํ์์ค๋ค.
2019๋
์ ์์๋์์ผ๋ฉฐ, ์ํ์น ๋ผ์ด์ผ์ค๋ก ๊ด๋ฆฌ๋๋ค.
๋ฌด๊ฒ๊ณ ๋๋ฆฐ Java Spring ๋์ , ์ปจํ
์ด๋์ ์๋ฒ๋ฅผ ๋น ๋ฅด๊ฒ ๋์ฐ๊ธฐ ์ํ ๋ชฉ์ ์์ ๋์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋น ๋ฅธ ๋ก๋ฉ์ ์ํด graalvm ๊ธฐ๋ฐ์ผ๋ก ์ปดํ์ผ๋๋ค.
vs Spring
์์งํ ๋งํด์ Spring์ด ํ์ง ๋ชปํ๋ ๊ฒ์ Quarkus๊ฐ ๋ ์ํ๋ค๊ณ ๋งํ ์๋ ์๋ค.
์ด๊ฑด ์ทจํฅ์ ๋ฌธ์ ๋ ์๊ณ , ์ ํ์ ์ฌ์ง๊ฐ ์ข ํฌ๋ค.
Quarkus์ ์ฅ์ ์ผ๋ก ๊ผฝ์ ์ ์๋ ๊ฒ์, ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ์ ์ฝ๋๋ก ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ณ , ๋ฌธ์ํ ์์ค์ด ๋์ผ๋ฉฐ, ๋ฆด๋ฆฌ์ฆ๋ ์ ๋ฒ ํ๋ฐํ๊ฒ ์ด๋ค์ง๋ค๋ ๊ฒ์ด๋ค.
๊ฒ๋ค๊ฐ GraalVM๊ณผ์ ํตํฉ์ด ์ ๋์ด์๊ณ , ์ปจํ
์ด๋ ํ๊ฒฝ์ ๊ณ ๋ คํ ์ฃผ๋ณ ๋๊ตฌ๋ค์ด ์ ๋ฒ ์ ๊ฐ์ถฐ์ ธ์๋ค.
์ผ๋ฐ์ ์ธ ์ํ๊ณ์ ํฌ๊ธฐ๋ ํ๊ฒฉํ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค. Spring์ ๋ชจ๋๋ค์ด ๋ฐ๋์ ๋ฐ์ด๋ค๋ ๊ฒ์ ์๋์ง๋ง.
์ค์น
๋จผ์ ์ ์ฉ CLI๋ถํฐ ์ค์นํด์ผ ํ๋ค. ์ ๋์ค ๊ณ์ด์ด๋ฉด curl ๋ช ๋ น์ ํตํด ์ค์นํ ์ ์๋ค.
curl -Ls https://sh.jbang.dev | bash -s - trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio

์ค์นํ๊ณ ๋๋ฉด quarkus๋ผ๋ ํ๋ก๊ทธ๋จ์ด ์คํ ๊ฐ๋ฅํด์ ธ์ผ ํ๋ค.
Hello World ์์ํด๋ณด๊ธฐ
๋ฐฉ๊ธ ์ค์นํ quarkus CLI๋ก ํ๋ก์ ํธ๋ฅผ ๋ถํธ์คํธ๋ํํด๋ณด๊ฒ ๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ๋ก์ ํธ๋ช
๊ณผ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ๋ช
์ ์ง์ ํด์ create app ๋ช
๋ น์ ๋ ๋ฆฌ๋ฉด ๋๋ค.
๋ณดํต ๋ค๋ฅธ ๋๊ตฌ๋ค์ ํ๋ก์ ํธ๋ช
์ง์ ํ๋ฉด ๊ทธ๊ฑฐ๋ ๋์ผํ๊ฒ ๋๋ ํฐ๋ฆฌ๋ช
๋ ์์ฑํด์ฃผ๋๋ฐ, ์ด๊ฑด ์๋๋๋ผ.
์๋ฐ ์๋๋๊น๋ด UX๊ฐ ์๊ทผํ ์ข ๋ฉ์ฒญํ๊ณ ๊ตฌ๋ฆฌ๋ค.
quarkus create app --name quarkus_start -o quarkus_start

์๋ฌดํผ ๋ง๋ค๋ฉด ์ด๋ฐ ์์ผ๋ก ํ๋ก์ ํธ๊ฐ ์ด๊ธฐํ๋์ด์์ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ๊ฐ์ maven์ด๋ค.
์ฝ๋ ํํ๋ ๋๋ต ์คํ๋ง๊ณผ ๋น์ค๋ฌด๋ฆฌํ๊ธด ํ๋ค.
๊ทธ๋ฌ๋ฉด CLI์ dev ๋ช ๋ น์ ํตํด ์ฆ์ dev ์๋ฒ๋ฅผ ๋น๋ํด๋ณผ ์ ์๋ค.

๋ญ ์๋ฉ ๋ค์ด๋ฐ๊ณ ์คํ์ ํ๊ฒ ๋๋ค. ํจํค์ง๋ฅผ ์๋ฉ ๋ฐ์์ ์ต์ด ๋ถํ
์ ์ข ๋๋ฆฌ๋ค.
์๋ฌดํผ ์คํ์ด ๋๋ค๋ฉด 8080 ํฌํธ๋ฅผ ํตํด ์ ์๋ API๋ฅผ ์ฆ์ ์ฌ์ฉํด๋ณผ ์ ์๋ค.

๊ทธ๋ฆฌ๊ณ dev ๋ชจ๋๋ก ์คํํ ๊ฒฝ์ฐ์๋ ๋ฃจํธ ๊ฒฝ๋ก๋ก ์ง์ ์์ dev UI๊ฐ ๋ฌ๋ค.
๋ณ๋ก ๋๋จํ ๊ฒ์ ์๋๊ณ , ์ด๋ค API๊ฐ ์๊ณ ์ด๋ค ๊ฒ๋ค๋ก ๊ตฌ์ฑ๋์ด์๋์ง๋ฅผ ๊ฐ๋จํ ๋ณด์ฌ์ฃผ๋ ๋์๋ณด๋๋ค.
๋ํ๋์ ๊ทธ๋ํ๋ ์๋๋ฐ, ์ด๊ฑด ๊ตณ์ด ์ ๋ฃ์๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ฐ๋ ์ฌ๋์ด ์๋?
์ปจํ ์ด๋ ๋ฐฐํฌ
์์ฑ๋ ํ๋ก์ ํธ๋ฅผ ๊น๋ณด๋ฉด dockerfile๋ค์ด ๋ช๊ฐ ์๋ค. ์ด๊ฑฐ ๊ทธ๋๋ก ๋ง์์ ์ฐ๋ฉด ๋๋ค.

# JVM ๋ฒ์ ์ผ๋ก ์คํ
./mvnw package -DskipTests
docker build -f src/main/docker/Dockerfile.jvm -t quarkus-jvm:latest .
docker run --name quarkus-jvm -p 8080:8080 --rm quarkus-jvm:latest
# GraalVM ๋ฒ์ ์ผ๋ก ์คํ
./mvnw package -Dnative
docker build -f src/main/docker/Dockerfile.native -t quarkus-graal:latest .
docker run --name quarkus-graal -p 8081:8080 --rm quarkus-graal:latest
# GraalVM ๊ฒฝ๋ ๋ฒ์ ์ผ๋ก ์คํ
./mvnw package -Dnative
docker build -f src/main/docker/Dockerfile.native-micro -t quarkus-micro:latest .
docker run --name quarkus-micro -p 8082:8080 --rm quarkus-micro:latest
๊ทผ๋ฐ ๋ ๊ท์ฐฎ๊ฒ, docker build๋ง์ผ๋ก ๋๋๊ฒ ์๋๋ผ ์ฌ์ ์ ๋ช ๋ น ํ๋ ์จ์ target์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฌ์ผ ํ๋ค. ๋ฒ์ก์ค๋ฝ๋ค.
์๋ฌดํผ ์ ๋นํ ๋น๋ํ๋ฉด, ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค๊ฐ ์คํํด์ ์ฐ๋ฉด ๋๋ค.

๊ทธ๋ฌ๋ฉด ๊ฐ ๋ฒ์ ๋ณ๋ก ๋ฆฌ์์ค ์ฐจ์ด๊ฐ ์ด๋ป๊ฒ ๋ ๊น?
docker image์ ๊ฒฝ์ฐ์๋ ํฌ๊ธฐ ์ฐจ์ด๊ฐ ์ ๋ฒ ๋๋ค.
๋ฑ ๊ธฐ๋ณธ์ ์ธ hello world ์ฝ๋๋ง ์๋ ๊ฒ์ธ๋ฐ๋ JVM ๋ฒ์ ์ 400MB๊ฐ ๋๊ณ , graal ๋ฒ์ ์ 150MB ์ ๋๋ค. graal ๋ฒ์ ์ด ์ต์ 2.5๋ฐฐ ์ ๋๋ ๊ฐ๋ฒผ์ด ๊ฒ์ด๋ค.
๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์๋ ์ฐจ์ด๊ฐ ์๋ค.
JVM ๋ฒ์ ์ 200MB ๊ฐ๊น์ด ๋จน์ง๋ง, graal ๋ฒ์ ๋ค์ 10MB๋ ๋จน์ง ์๋๋ค. ํ์คํ ๊ฐ๋ณ๊ธด ๊ฐ๋ณ๋ค.
๋ ์์ธํ ๋ด์ฉ๋ค์ ์ ์ฉ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ค.
https://quarkus.io/guides/#