ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ์ ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ ์ฒ(MSA)๊ฐ ์ฃผ๋ฅ๊ฐ ๋ ์ง๊ธ, ์๋ฐ๋ ์ฌ์ ํ ‘๋ฌด๊ฒ๊ณ ๋๋ฆฌ๋ค’๋ ํธ๊ฒฌ์ด ์๋ ๊ฒ์ ์ฌ์ค์ด๋ค. Quarkus๋ ์ด๋ฌํ ํธ๊ฒฌ์ ์ ๋ฉด์ผ๋ก ๋ํํ๋ฉฐ “Supersonic Subatomic Java“๋ผ๋ ์ฌ๋ก๊ฑด๊ณผ ํจ๊ป ๋ฑ์ฅํ๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Quarkus๊ฐ ๋ฌด์์ธ์ง ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง์ ๋ํด์ ๊ฐ๋จํ ์๊ฐํ๊ณ ์ ํ๋ค.
Quarkus๊ฐ ๋ญ์์?
Quarkus๋ Red Hat์์ ์ฃผ๋ํ์ฌ ๊ฐ๋ฐํ ์คํ ์์ค ์๋ฐ ํ๋ ์์ํฌ๋ก ์ฟ ๋ฒ๋คํฐ์ค ํน์ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ ์ต์ ํ๋ ์คํ์ ์งํฅํ๋ค.
Spring Boot์ ๊ฐ์ ์ ํต์ ์ธ ์๋ฐ ํ๋ ์์ํฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๋ฐํ์ ์์ ์ ํด๋์ค๋ฅผ ์ค์บํ๊ณ ๋น(Bean)์ ์์ฑํ๋ฉฐ ์ค์ ์ ์ ์ฉํ๋ค. ์ด ๊ณผ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์๋ชจํ๊ณ ๋ถํ
์๋๋ฅผ ๋ฆ์ถ๋ ์์ธ์ด ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ๋จํ REST ์๋ฒ๋ฅผ ๊ธฐ๋ํ ๋๋ ์ต์ ๋ช์ด์ ๊ธฐ๋ ์๊ฐ์ด ์์๋๋ ๊ฒ์ ์ด๊ธฐ ๋ฐํ์์ ์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ด๋ค.
Quarkus๋ ์ด ํจ๋ฌ๋ค์์ ์์ ํ ๋ฐ๊ฟง๋ค. “Build-time First” ์ ๋ต์ ์ฌ์ฉํ์ฌ ๋ฐํ์์ ํ๋ ์์ ์ 80%์ด์์ ๋น๋ ์์ ์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฐ๋ฆฌ๋ ์๋ฐ๋ก๋ Go ์ธ์ด๋ Node.js์ ๋ฒ๊ธ๊ฐ๋ ๊ฐ๋ฒผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.

๊ทธ๋ฆผ์์ ๋ณด๋ฏ์ด Quarkus์ ๊ธฐ๋ณธ ์ปจ์ ์ ‘๋น๋ ํ์์ ํ ์ ์๋ ๊ฒ์ ๋ฏธ๋ฆฌ ๋ค ํด๋ฒ๋ฆฌ์’๋ค. ๋ฐํ์์ ์ํ ํ๋ ๊ฒ๋ค์ ๋น๋ ํ์์ ๋ฏธ๋ฆฌ ์ํํด ๋์์ผ๋ก์จ ๋ฐํ์ ์ด๊ธฐ์ ๋ฐ์ํ๋ ์๋ชจ ์๊ฐ์ ๋ํญ ์ค์ด๋๋ก ํ ๊ฒ์ด๋ค.
JAX-RS: Quarkus์ ํต์ฌ ์ปค๋ฎค๋์ผ์ด์ ๋๊ตฌ
Quarkus์์ RESTful API๋ฅผ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ๋จผ์ ๋ง์ฃผํ๊ฒ ๋๋ ๊ฒ์ด ๋ฐ๋ก JAX-RS(Jakarta RESTful Web Service) ์ธ๋ฐ Spring์ @RestController์ ์ต์ํ๊ฒ ์ง๋ง, Quarkus๋ ์๋ฐ ํ์ค ๊ท๊ฒฉ์ธ JAX-RS๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค.
JAX-RS์ ๋ํ ์์ธ ๋ด์ฉ์ https://jakarta.ee/specifications/ ์์ ํ์ธํ๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
JAX-RS ํ์ค์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ํน์ ๋ฐด๋์ ์ข
์๋์ง ์๊ณ ์ค๋ ์๊ฐ ๊ฒ์ฆ๋ ์์ ์ ์ธ API ๊ตฌ์ฑ์ ์ ๊ณตํ๋ค๋๋ฐ ์ฅ์ ์ด ์๋ค.
์๋ฅผ ๋ค์ด REST API๋ฅผ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ด๋ ธํ ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฒฝ๋ก ๋ฐ ๋ฉ์๋ ์ ์
- @Path: ๋ฆฌ์์ค์ URI๋ฅผ ๊ฒฐ์ ํ๋ค.
- ํด๋์ค ์๋จ์ @Path(“/items”)๋ผ๊ณ ์ ์ธํ๋ฉด ํด๋น ํด๋์ค ๋ด๋ถ์ ๋ชจ๋ ๋ฉ์๋๋ /items ๋ก ์์ํ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๋ค.
Spring์ ํด๋์ค์ @RequestMapping(“/items”)๋ฅผ ์ง์ ํ ๊ฒ๊ณผ ๋์ผํ๋ค.
- ํด๋์ค ์๋จ์ @Path(“/items”)๋ผ๊ณ ์ ์ธํ๋ฉด ํด๋น ํด๋์ค ๋ด๋ถ์ ๋ชจ๋ ๋ฉ์๋๋ /items ๋ก ์์ํ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๋ค.
- @GET, @POST, @PUT, @DELETE, @PATCH: HTTP ๋ฉ์๋๋ฅผ ๋ช
์ํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์๋๋ก ์์ฒญ์ ๋ณด๋ด๋์ง (์กฐํ, ์์ฑ, ์์ , ์ญ์ )๋ฅผ ๋ช ์ํ๋ค.
- @Path: ๋ฆฌ์์ค์ URI๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๋ฐ์ดํฐ ํ์ ์ง์
- @Produces: ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ ๋ฐ์ดํฐ ํ์
์ ์ ์ํ๋ค.
- @Produces(MediaType.APPLICATION_JSON)๊ณผ ๊ฐ์ด application/json ์๋ต ํ์์ ์ง์ ํ๋ ์ญํ ์ ํ๋ค.
- @Consumes: ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ ํ์
์ ์ ์ํ๋ค.
- @Consumes(MediaType.APPLICATION_JSON)๊ณผ ๊ฐ์ด ์์ฒญ payload๋ฅผ application/json์ผ๋ก ๋ฐ๊ฒ ๋ค๋ ํ์์ ์ง์ ํ๋ค.
- @Produces: ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ ๋ฐ์ดํฐ ํ์
์ ์ ์ํ๋ค.
- ํ๋ผ๋ฏธํฐ ํธ๋ค๋ง (Data Injection)
- @PathParam: URL ๊ฒฝ๋ก์ ํฌํจ๋ ๋ณ์๊ฐ์ ๊ฐ์ ธ์จ๋ค. Spring์ @PathVariable๊ณผ ๋์ผ
- ๊ฒฝ๋ก: /users/{id} -> ๋ฉ์๋: public User get(@PathParam(“id”) Long id)
- @QueryParam: URL๋ค์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ๊ฐ์ ธ์จ๋ค.
- ๊ฒฝ๋ก: /search?name=kim -> ๋ฉ์๋ public List<User> search(@QueryParam(“name”) String name)
- @HeaderParam: HTTP ์์ฒญ ํค๋์ ๋ด๊ธด ํน์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- @Context: HTTP ์์ฒญ ์์ฒด์ ๋ํ ์ ๋ณด(UriInfo, HttpHeaders๋ฑ)๋ฅผ ์ฃผ์ ๋ฐ์ ๋ ์ฌ์ฉํ๋ค.
- @PathParam: URL ๊ฒฝ๋ก์ ํฌํจ๋ ๋ณ์๊ฐ์ ๊ฐ์ ธ์จ๋ค. Spring์ @PathVariable๊ณผ ๋์ผ
Quarkus Dev Mode
์๋ฐ ๊ฐ๋ฐ์๋ค์ ๊ฐ์ฅ ํฐ ๊ณ ์ถฉ ์ค ํ๋๋ ‘์์ ํ ์ฌ์์ ๊ธฐ๋ค๋ฆฌ๊ธฐ‘๋ค. ์ฝ๋ ํ ์ค ๊ณ ์น๊ณ 10~20์ด์ฉ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ง๋ฃจํ ์ผ์ด ์๋ ์ ์๋ค. Quarkus์ Dev Mode๋ ์ด๋ฌํ ๋ถํธํจ์ ์์ ํ ํด๊ฒฐํ๋ค. (๋ฌผ๋ก ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ๋ค.)
Dev Mode๋?
./mvnw quarkus:devPlaintext๋ช ๋ น์ด๋ก ์คํ๋๋ ์ด ๋ชจ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์ค์ธ ์ํ์์ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์๋ฒ ์ฌ์์ ์์ด ์ฆ์ ๋ฐ์๋๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์๋ ์๋ฆฌ
๋จ์ํ ์ฝ๋๋ฅผ ๊ต์ฒดํ๋ ์์ค์ด ์๋ Quarkus Dev Mode์ ๋ด๋ถ ๋์์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ฅธ๋ค.
- ์์ฒญ ๊ฐ๋ก์ฑํค (Request Interception)
- ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ‘์๋ก๊ณ ์นจ’์ ๋๋ฅด๋ฉด Quarkus๋ ์์ฒญ์ ์ ์ ๋ฉ์ถ๋ค. (Pause)
- ๋ณ๊ฒฝ ์ฌํญ ์ค์บ
- ๋ง์ง๋ง ์์ฒญ ์ดํ ์์ค ํ์ผ (.java, .properties ๋ฑ)์ ๋ณํ๊ฐ ์๋์ง ํ์ธํ๋ค.
- ์ฆ๋ถ ์ปดํ์ผ: ๋ณ๊ฒฝ๋ ํ์ผ๋ง ๊ณจ๋ผ๋ด์ ์ปดํ์ผ์ ์ํํ๋ค.
- ๊ฒฉ๋ฆฌ๋ ํด๋์ค๋ก๋ ์ฌ์์
- Quarkus๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ถ๋ถ๊ณผ ํ๋ ์์ํฌ ์ฝ์ด๋ฅผ ๋ถ๋ฆฌํด ๋์๋ค. ๋ณ๊ฒฝ๋ ํด๋์ค๋ฅผ ํฌํจํ ์ฌ์ฉ์ ์์ญ์ ํด๋์ค๋ก๋๋ง ์์๊ฐ์ ์ฌ์์ํ๋ค.
- ์์ฒญ ์ฌ๊ฐ
- ๋ชจ๋ ์ค๋น๊ฐ ๋๋๋ฉด ๋ฉ์ท๋ HTTP ์์ฒญ์ ๋ค์ ์งํํ๋ค.
Dev Mode๋ฅผ ํตํด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋น ๋ฅด๊ฒ ์์ ๋ ๋ด์ฉ์ ๋ฐ์ํ ์ ์๋ ์ด์ ์ด ์๋ค.
Quarkus์ ์ฐจ๋ณ์
- Static Analysis vs Dynamic Reflection
- ์ ํต์ ์ธ ํ๋ ์์ํฌ๋ ์คํ ์์ ์ ๋ฆฌํ๋ ์ ์ ํตํด ํด๋์ค๋ฅผ ๋ถ์ํ๋ค. ์ด๋ CPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋๋ฐ Quarkus๋ ๋น๋ ์์ ์ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ์ํ๊ณ ํ์ํ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด ๋๋ค. ๋๋ถ์ ๋ฐํ์์๋ ์๋ฌด๋ฐ ๋ถํ ์์ด ๋ฐ๋ก ๋ก์ง์ ์ํํ ์ ์๋ค.
- Native Image (GraalVM)
- Quarkus๋ GraalVM๊ณผ ์๋ฒฝํ ํธํ๋๋ค. ์๋ฐ ์ฝ๋๋ฅผ JVM์์์ ๋์๊ฐ๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ์๋ OS์์ ์ง์ ์คํ๋๋ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ(Binary)๋ก ์ปดํ์ผ ํ ์ ์๋ค.
Quarkus Extension
Spring Boot์๋ ๋ชจ๋๋ณ ๋ํ๋์๋ฅผ ๊ด๋ฆฌํ๋ starter๊ฐ ์ ๊ณต๋๋๋ฐ Quarkus๋ Extension์ ํตํด์ ์ด์๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Quarkus์ Extension์ Spring Boot Starter์ ๋ง์ฐฌ๊ฐ์ง๋ก ํน์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ํ์ํ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ์ ํ๋๋ก ๋ฌถ์ด๋์ ๋จ์๋ค. ํ์ง๋ง ๋จ์ํ ๋ํ๋์์ ๋ฌถ์์ ๋์ด์์ ์ค์ํ ์ญํ ์ ์ํํ๋ค.
Spring Boot Starter vs Quarkus Extension
| Sring Boot Starter | Quarkus Extension | |
| ๋ช ์นญ | Starter | Extension |
| ์ฃผ์ ์ญํ | ์์กด์ฑ ๊ด๋ฆฌ + ์๋ ์ค์ (Auto Config) | ์์กด์ฑ ๊ด๋ฆฌ + ๋น๋ ํ์ ์ต์ ํ |
| ์คํ ์์ | ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ค์บ | ์ ํ๋ฆฌ์ผ์ด์ ๋น๋์ ๋ถ์ |
| ์ค์ ๋ฐฉ์ | application.properties / yml | application.properties / yml |
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ธ์ ์ผ์ ํ๋๊ฐ ์ด๋ค. Spring Boot Starter๋ ์๋ฒ๊ฐ ์คํ๋ ๋ ์ค์ ์ ์ฝ๊ณ ๋น์ ์์ฑํ์ง๋ง, Quarkus Extesion์ ์ฝ๋๋ฅผ ๋น๋ํ๋ ์์ ์ ์ด๋ฏธ ์ค์ ์ ๋ค ์ฝ์ด์ ์ต์ ํ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์์ฃผ ์ฌ์ฉํ๋ Extension ๋งคํ (Spring vs Quarkus)
Spring Boot์์ ๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ starter์ ๋งคํ๋๋ Quarkus Extension์ ์ ๋ฆฌํด ๋ณด์๋ค.
| Spring Boot Starter | Quarkus Extension | |
| REST API | spring-boot-starter-web | quarkus-reateasy-jackson |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค (JPA) | spring-boot-starter-data-jpa | quarkus-hibernate-orm-panache |
| ๋ณด์ (security) | spring-boot-starter-security | quarkus-security / quarkus-oidc |
| ์ ํจ์ฑ ๊ฒ์ฆ | spring-boot-starter-validation | quarkus-hibernate-validator |
| ๋ฉ์์ง (kafka) | spring-cloud-starter-stream-kafka | quarkus-messaging-kafka |
| ๋ชจ๋ํฐ๋ง | spring-boot-starter-actuator | quarkus-smallrye-health / metrics |
Extension์ ์ฐพ๊ณ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
Quarkus๋ ๊ฐ๋ฐ์๊ฐ Extension์ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค.
- ์น UI ํ์ฉ
- Spring์ start.spring.io์ ๊ฐ์ด code.quarkus.io๋ฅผ ์ ๊ณตํ๋ค. ์ํ๋ ๊ธฐ๋ฅ์ ๊ฒ์ํด์ ์ฒดํฌ๋ง ํ๋ฉด ํ๋ก์ ํธ ๊ตฌ์กฐ์ ํ์ํ Extension์ด ํฌํจ๋ ์์ถ ํ์ผ์ ์์ฑํด ์ค๋ค.

- CLI ๋ช
๋ น ํ์ฉ
- Quarkus์ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ quarkus CLI๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฐ ๋์ค์ ๋ฐ๋ก Extension์ ์ถ๊ฐํ ์ ์๋ค.
$> quarkus extension add hibernate-orm-panache jdbc-postgresqlBash์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด pom.xml ์ด๋ build.gradle์ ์๋์ผ๋ก ์์กด์ฑ์ด ์ถ๊ฐ๋๋ค. ์๋์ผ๋ก ๋ฒ์ ์ ๋ง์ถ ํ์๊ฐ ์์ด์ ๋งค์ฐ ํธ๋ฆฌํ๋ค.
quarkus CLI๋ SKDMAN์ ์ด์ฉํ์ฌ ์ฝ๊ฒ ์ค์นํ ์ ์๋ค.
SDKMAN ๊ด๋ จ ๋ด์ฉ์ SDKMAN์ผ๋ก ๊ฐ๋ฐ๋๊ตฌ ๋ฒ์ ์ฝ๊ฒ ๊ด๋ฆฌํ์ ํฌ์คํ
์ ์ฐธ๊ณ ํ๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
# ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ์ ํ์ธ
$> sdk list quarkus
# quarkus 3.30.4 ์ค์น
$> sdk install quarkus 3.30.4
Downloading: quarkus 3.30.4
In progress...
#################################################################################################################################### 100.0%
Installing: quarkus 3.30.4
Done installing!
Setting quarkus 3.30.4 as default.Bash- Maven/Gradle ๋ช
๋ น ํ์ฉ
- CLI๋ฅผ ์ค์นํ์ง ์์๋๋ผ๋ Maven ๋ช ๋ น์ด๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค.
$> ./mvnw quarkus:list-extensionsBash$> ./gradlew listExtensionsBash๋ชฉ๋ก ๋ฆฌ์คํธ์ ๋ณด๋ฉด ๋ณํ(*)๊ฐ ์๋ ๊ฒ๊ณผ ์๋ ๊ฒ๋ค์ด ์๋๋ฐ ๋ณํ๊ฐ ์๋ ๊ฒ์ Quarkus ์ปค๋ฎค๋ํฐ๋ Red Hat์์ ๊ณต์์ ์ผ๋ก ๊ถ์ฅํ๊ฑฐ๋ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ Extension์ด๋ค. ์ด์ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๋ฉฐ ๋ฌธ์ํ๊ฐ ์ ๋์ด ์๊ณ Quarkus์ ์ต์ ๋ฒ์ ๊ณผ๋ ํธํ์ฑ์ด ๋๋ค. ๋ณํ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๋น๊ต์ ์ต์ ์ด๊ฑฐ๋ ์คํ์ ์ธ ๋จ๊ณ ๋๋ ์๋ํํฐ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ ์ ์๋ค.
Quarkus Extension ๊ณต์ ๋ฌธ์๋ ์ด๋์ ์๋?
Quarkus์ ์ฅ์ ์ค ํ๋๋ Spring๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌธ์ํ๊ฐ ๋งค์ฐ ์ ๋์ด ์๋ค๋ ์ ์ด๋ค. ํ์ง๋ง ํ์ฅ์ด ์๋ ๋ง๋ค ๋ณด๋ “๋ด๊ฐ ์ง๊ธ ์ค์นํ ์ด ํ์ฅ์ ์ฌ์ฉ๋ฒ์ ์ด๋์ ์์ง” ๋ผ๊ณ ํค๋งฌ ์ ์์ผ๋ ๋ฌธ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์.
- ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ: code.quarkus.io
- ํ๋ก์ ํธ๋ฅผ ์ฒ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ code.quarkus.io์์ ์ฝ๊ฒ ์ฐพ์๋ณผ ์ ์๋ค.
- ๊ฒ์ ์ฐฝ์ ์ํ๋ extension์ ๊ฒ์ ํ ์ฐ์ธก์ ์๋ ํ์ดํ ๋ชจ์์ ํด๋ฆญํ๋ฉด ‘See the extension guide’๋ฅผ ๋ณผ ์ ์๋ค.

- Quarkus ๊ณต์ ๊ฐ์ด๋ ํ์ด์ง
- https://quarkus.io/guides/ ์์ ์ํ๋ extension ์ด๋ฆ์ ๊ฒ์ํ์ฌ ๋ฐ๋ก ์ฐพ์ ์ ์๋ค.
- ๊ฐ๋ฐ ์ค์ ํ์ธ (Dev UI)
- Dev Mode๊ฐ ์คํ ์ค์ด๋ผ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ ํด๋น ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ณ ์๋ ํ์ฅ์ ๋ฌธ์ ๋งํฌ๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋ค.
- http://localhost:8080/q/dev/ ์ ์ (ํฌํธ๋ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํธ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ค)
- Dev Mode๊ฐ ์คํ ์ค์ด๋ผ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ ํด๋น ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ณ ์๋ ํ์ฅ์ ๋ฌธ์ ๋งํฌ๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋ค.

Quarkus Extension์ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ๊ฐ์ ธ์ค๋๊ฒ ์๋๋ค. ๊ฐ Extension์๋ Deployment ๋ชจ๋์ด ํฌํจ๋์ด ์์ด ๋น๋ ๋จ๊ณ์์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
- ๋ฆฌํ๋ ์ ์ ๊ฑฐ: ๋ฐํ์์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ์ฐพ๋ ๋์ ๋น๋ ์์ ์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐ์ ๋๋ธ๋ค.
- ํ๋ก์ ์์ฑ: ํ์ด๋ฒ๋ค์ดํธ๋ ์์กด์ฑ ์ฃผ์ ์ ์ํ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋น๋ ์์ ์ ๋ฏธ๋ฆฌ ๊ตฌ์๋ธ๋ค.
- ๋ถํ์ํ ์ฝ๋ ์ ๊ฑฐ: ์ค์ ์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ํ๋จ๋ ๊ธฐ๋ฅ์ ์ต์ข ๋ฐ์ด๋๋ฆฌ์์ ์ ์ธํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ธ๋ค.
Quarkus๋ ์๋ ๊ตฌ์ฑ์ ์ ๊ณตํ๋?
Spring Boot์ ๊ฐ์ฅ ํฐ ๋งค๋ ฅ์ spring boot starter ์์กด์ฑ ์ถ๊ฐ๋ก ๊ด๋ จ ๋ชจ๋์ ๋ํ ๋น ์์ฑ์ด๋ properties๋ฅผ ํตํ ์ฌ๋ฌ๊ฐ์ง ๊ตฌ์ฑ๋ค์ ์๋์ผ๋ก ํด์ฃผ๋ Auto Configuration ์ ๊ณต์ ์๋ค. Quarkus ์ญ์ ๊ฐ๋ฐ์๊ฐ ๋ณ๋์ ๋ณต์กํ ์ค์ ์ ํ์ง ์์๋ ํ์ฅ์ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก ์๋ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ด ๋์ํ๋ค. ํ์ง๋ง ๋ด๋ถ ๋์ ๋ฐฉ์์ Spring Boot์๋ ๋ค๋ฅธ ์ ์ ๋ณด์ด๋๋ฐ ๊ทธ ์ฐจ์ด๋ฅผ ์ง์ด๋ณด์.
Spring Boot vs Quarkus Auto Configuration
Spring Boot์ Quarkus์ ์๋ ๊ตฌ์ฑ ๋์ ๋ฐฉ์์ ์ดํด๋ณด์.
Spring Boot: ๋ฐํ์ ์๋ ์ค์
Spring Boot๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ์ํํ๋ค.
- ํด๋์คํจ์ค ์ค์บ: ํ์ฌ ๋ก๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ๋ฌด์์ด ์๋์ง ํ์ธํ๋ค.
- ์กฐ๊ฑด๋ถ ํ๊ฐ(@Conditional): ํด๋์คํจ์ค์ MySQL ๋๋ผ์ด๋ฒ๊ฐ ์๋? DataSource ๋น์ด ์์ง ๋ฑ๋ก ์๋๋? ๋ฑ์ ์ฒดํฌํ๋ค.
- ๋น(Bean) ๋ฑ๋ก: ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ๊ทธ์ ์ผ ๊ด๋ จ๋ ์ค์ ํด๋์ค๋ฅผ ์คํํ์ฌ ๋น์ ์์ฑํ๊ณ ์์กด์ฑ์ ์ฃผ์ ํ๋ค.
์ด ๋ชจ๋ ๊ณผ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ๋๋๋ ์์ ์ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์์ง์๋ก ๋ถํ ๋๋ ์๋๊ฐ ๋๋ ค์ง๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋๋ค.
Quarkus: ๋น๋ ํ์ ํ์ฅ
Quarkus๋ Spring์ @EnableAutoConfiguration ๊ฐ์ ๊ฐ๋ ์ด ๋ฐํ์์ ์กด์ฌํ์ง ์๋๋ค. ๋์ Augmentation(์ฆ๊ฐ) ์ด๋ผ๋ ๋น๋ ๋จ๊ณ์์ ๋ชจ๋ ์๋ ์ค์ ์ด ๋๋๋ค.
- ๋น๋ ์์ ๋ถ์: ํ๋ก์ ํธ๋ฅผ ๋น๋(Maven/Gradle)ํ ๋ Quarkus Extension์ ์ด๋ฏธ ์ด๋ค ์ค์ ์ด ํ์ํ์ง ๋ถ์์ ์์ํ๋ค.
- ๋ฐฐํฌ ๊ธฐ๋ก: ๋ฐํ์์ ์คํ๋์ด์ผ ํ ์ค์ ๋ก์ง(์: DB ์ปค๋ฅ์ ํ ์์ฑ ์ฝ๋)์ ๋ถ์ํ์ฌ ์ด๋ฅผ ์ต์ ํ๋ ๋ฐ์ดํธ์ฝ๋๋ก ๋ฏธ๋ฆฌ ์์ฑํ๋ค.
- ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ: ์ฌ์ฉ๋์ง ์๋ ์ค์ ์ด๋ ๊ฒฝ๋ก๋ ๋น๋ ๋จ๊ณ์์ ์์ ์ญ์ ํ์ฌ ์ต์ข ๋ฐ์ด๋๋ฆฌ์ ํฌํจํ์ง ์๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ฒ๊ฐ ๊ตฌ๋ ๋ ๋ “์ด๋ค ์ค์ ์ ํด์ผ ํ์ง?”๋ผ๊ณ ๋ฌผ์ด๋ณด์ง ์๋๋ค. ์ด๋ฏธ ๋น๋ ๋ ์ด๋ฐ ๊ณ ๋ฏผ์ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ด๋ค. “์ต์ ํ๋ ์คํ ๊ณํ”์ ๊ทธ๋๋ก ์ํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ถํ ์ด ์์๊ฐ์ ๋๋๋ค.
์ค์ ์ ์ด์ํ: Build-time vs Runtime properties
๋์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค ๋ณด๋ ์ค์ ํ์ผ(application.properties (yml))์ ๋ค๋ฃจ๋ ๋ฐฉ์์๋ ์ฐจ์ด๊ฐ ์๋ค. Quarkus๋ ์ค์ ์ ๋ ๊ฐ์ง๋ก ์๊ฒฉํ๊ฒ ๊ตฌ๋ถํ๋ค.
- ๋น๋ ํ์ ๊ณ ์ ์ค์ (Build-time fixed properties)
- ๋น๋ ํ ๋๋ง ์ ํจํ๋ฉฐ, ํ ๋ฒ ๋น๋๋๋ฉด ๋ฐํ์์ ๋ฐ๊ฟ ์ ์๋ค.
- ์์: ์ฌ์ฉํ DB ์ข ๋ฅ, ๋ฐ์ดํธ์ฝ๋ ์ต์ ํ ์ต์ ๋ฑ
- ๋ฐํ์ ์ค๋ฒ๋ผ์ด๋ ์ค์ (Runtime Override properties)
- ์๋ฒ๋ฅผ ์คํํ ๋ ํ๊ฒฝ ๋ณ์๋ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์๋ก ๋ฐ๊ฟ ์ ์๋ค.
- ์์: DB ์ ์ ์ฃผ์ (JDBC URL), ๋น๋ฐ๋ฒํธ, ๋ก๊ทธ๋ ๋ฒจ ๋ฑ
Spring Boot๋ ๋ชจ๋ ์ค์ ์ ์คํ ์์ ์ ๋ฐ๊ฟ ์ ์์ง๋ง, Quarkus๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ผ๋ถ ์ค์ ์ ๋น๋ ์์ ์ ๊ณ ์ ํ๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
| Spring Boot | Quarkus | |
| ํต์ฌ ๋ฉ์ปค๋์ฆ | ๋ฆฌํ๋ ์ ๊ณผ ์กฐ๊ฑด๋ถ ์ด๋ ธํ ์ด์ ์ค์บ | ๋น๋ ํ์ ๋ฐ์ดํธ์ฝ๋ ์์ฑ |
| ์คํ ์์ | ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์ | ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ์ |
| ์ ์ฐ์ฑ | ๋งค์ฐ ๋์ (์คํ ์ค ๋ชจ๋ ์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅ) | ๋์(๋จ, ๋น๋์ ๊ณ ์ ๋๋ ์ค์ ์กด์ฌ) |
| ์ฑ๋ฅ ์ํฅ | starter๊ฐ ๋ง์ ์๋ก ๋ถํ ์ง์ฐ | extension์ด ๋ง์๋ ๋ถํ ์๋์ ์ํฅ ๋ฏธ๋ฏธ |
Spring Boot๋ Quarkus์์ ์ ๊ณตํ๋ ์๋ ์ค์ ์ ๋ํ ํธ๋ฆฌํจ์ ๋ ํ๋ ์์ํฌ๊ฐ ๋น์ทํ๋ค. ํ์ง๋ง ์ด์ ํ๊ฒฝ์์์ ์ฐจ์ด๋ ๋ฌด์ํ ์ ์๋ค. ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ, ํนํ ์์ฒญ์ด ์ฌ ๋๋ง ์๋ฒ๋ฅผ ๋์ฐ๋ ์๋ฒ๋ฆฌ์ค(Serverless) ํ๊ฒฝ์์ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋ Code Start ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์์ด์ Quarkus์ ์ด๋ฌํ ๋ฐฉ์์ด ์๋์ ์ธ ์ฐ์๋ฅผ ์ฐจ์งํ๋ค.
์ต๊ทผ์ Quarkus์ ๋ํ ๊ด์ฌ์ ๊ฐ๊ฒ ๋๋ฉด์ MSA ํ๊ฒฝ์ด๋ AWS ๋๋ค์ ๊ฐ์ Serverless ํ๊ฒฝ์์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ์ด๋ฒ ํฌ์คํ ์ Quarkus์ ๋ํ ๊ฐ๋จํ ์๊ฐ์ ํจ๊ป ๋ช๊ฐ์ง ํน์ง๋ค์ ์ดํด๋ดค๋๋ฐ ์์ผ๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ํ์ตํ ๋ด์ฉ๋ค์ ํ ๋๋ก ํฌ์คํ ์ ์ด์ด๋๊ฐ ์์ ์ด๋ค.
Quarkus ๋ง๋ณด๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.
https://quarkus.io/get-started
https://quarkus.io/guides/cli-tooling
์ฐธ๊ณ ํ๋ฉด ์ข์ ๋งํฌ
https://quarkus.io/guides/
https://code.quarkus.io/
