Quarkus๋Š” ์ดˆ์Œ์† ์•„์›์ž ์ž๋ฐ”์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

Quarkus๋Š” ์ดˆ์Œ์† ์•„์›์ž ์ž๋ฐ”์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์†Œ๊ฐœ

XNUMX์›” XNUMX์ผ RedHat(๊ณง IBM) ์ œ์‹œ ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ - ์ฟผ์ฟ ์Šค. ๊ฐœ๋ฐœ์ž์— ๋”ฐ๋ฅด๋ฉด ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” GraalVM ๋ฐ OpenJDK HotSpot์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ Kubernetes์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Quarkus ์Šคํƒ์—๋Š” JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ๋Š” Java๋ฅผ Kubernetes ๋ฐฐํฌ ๋ฐ ์„œ๋ฒ„๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ตœ๊ณ ์˜ ํ”Œ๋žซํผ์œผ๋กœ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฐ˜์‘ํ˜• ๋ฐ ๋ช…๋ นํ˜• ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ํ†ตํ•ฉ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ณด๋ฉด ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋ฉด Quarkus๋Š” "์• ๊ทธ๋ฆฌ๊ฒŒ์ดํ„ฐ/์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ"์™€ "๊ณ ์ˆ˜์ค€ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ" ์‚ฌ์ด ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํ„ฐ ๊ทธ ์ด์ƒ์ด์ง€๋งŒ, ํ’€ ์Šคํƒ์— ๋„๋‹ฌํ•˜์ง€๋„ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ๋งž์ถฐ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ๋น ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์†๋„์™€ ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์•ฝ์†๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ์›น์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ์‘๋‹ต๊นŒ์ง€์˜ ์‹œ๊ฐ„:

๊ตฌ์„ฑ
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

๊ธฐ์กด ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ*
4.3
9.5

๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„(Mb):

๊ตฌ์„ฑ
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

๊ธฐ์กด ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ*
140
218

์ธ์ƒ์ ์ด์ง€ ์•Š๋‚˜์š”?

*์ด ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ถ”๊ฐ€ ๋ฐ”๋”” ํ‚คํŠธ๊ฐ€ ํฌํ•จ๋œ ์ผ์ข…์˜ Spring Boot๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค..

์•ˆ๋…•ํ•˜์„ธ์š”!

Quarkus๋กœ ์ž‘์„ฑ๋œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

๋ง ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ์ˆ˜์—…์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค! ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ Maven์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mvn compile quarkus:dev
โ€ฆ
$ curl http://localhost:8080/hello
hello

์ผ๋ฐ˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ์˜ ์ฐจ์ด์ ์€ Application ํด๋ž˜์Šค๊ฐ€ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค! Quarkus๋Š” ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋”์šฑ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฌด์—‡ ํ–ฅํ›„ ๊ณ„ํš? ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์— ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์‚ฌ. ์„œ๋น„์Šค ์ฝ”๋“œ:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

์ œ์–ด ์žฅ์น˜:

@Path("/hello")
public class GreetingResource {

   @Inject
   GreetingService service;

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public String greeting(@PathParam("name") String name) {
       return service.greeting(name);
   }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

Quarkus๋Š” ์ต์ˆ™ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ(CDI ๋ฐ JAX-RS)์˜ ํ‘œ์ค€ ์ฃผ์„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด์ „์— CDI ๋ฐ JAX-RS๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…

์—”ํ„ฐํ‹ฐ์— ๋Œ€ํ•œ Hibernate ๋ฐ ํ‘œ์ค€ JPA ์ฃผ์„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. REST ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ์˜ ์ข…์†์„ฑ์„ ํ‘œ์‹œํ•˜๊ณ  ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. @Entity application.properties์—์„œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘. sessionFactory, persistence.xml ๋˜๋Š” ๊ธฐํƒ€ ์„œ๋น„์Šค ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•„์š”ํ•œ ๊ฒฝ์šฐ persistence.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ORM ๊ณ„์ธต์„ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Quarkus๋Š” ์—”ํ„ฐํ‹ฐ ์บ์‹ฑ, ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์šฉ ์ปฌ๋ ‰์…˜, ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๊ธฐ์—” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ, ์ง€๋ฐฉ์˜ ํ•˜๋‚˜์˜ Kubernetes ๋…ธ๋“œ์— ๋Œ€ํ•œ ์บ์‹ฑ. ์ €๊ฒƒ๋“ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์บ์‹œ๋Š” ์„œ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ผ์‹œ์ ์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฝ”๋“œ ์‹คํ–‰

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Quarkus๋Š” ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์„œ๋น„์Šค๋กœ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

Quarkus ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” JUnit4 ๋˜๋Š” JUnit5๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” RestAssured๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@QuarkusTest
public class GreetingResourceTest {

   @Test
   public void testGreetingEndpoint() {
       String uuid = UUID.randomUUID().toString();
       given()
         .pathParam("name", uuid)
         .when().get("/hello/{name}")
         .then()
           .statusCode(200)
           .body(is("Hello " + uuid + "!"));
   }
}

@QuarkusTest ์ฃผ์„์€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Quarkus๋Š” GraalVM๊ณผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ”Œ๋žซํผ๋ณ„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด GraalVM์„ ์„ค์น˜ํ•˜๊ณ  GRAALVM_HOME ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ์กฐ๋ฆฝ์„ ์œ„ํ•œ ํ”„๋กœํŒŒ์ผ ๋“ฑ๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ ์ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

mvn package -Pnative

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ƒ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด JVM์—์„œ์˜ ์‹คํ–‰๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. @SubstrateTest ์ฃผ์„์€ ํ”Œ๋žซํผ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ์†์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”Œ๋žซํผ ์ข…์† ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋Š” Docker์— ํŒจํ‚ค์ง•๋˜์–ด Kubernetes ๋˜๋Š” OpenShift์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น.

ํˆดํ‚ท

Quarkus ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Maven ๋ฐ Gradle๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Maven์€ Gradle๊ณผ ๋‹ฌ๋ฆฌ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ํ˜„์žฌ Gradle์€ ๋นˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›น์‚ฌ์ดํŠธ์— ์ž์„ธํ•œ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ต๊ณผ์„œ.

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ

Quarkus๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฃผ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค ํ™•์žฅ 40๊ฐœ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ - ์ง€์›์—์„œ ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ ะธ ์•„ํŒŒ์น˜ ์นด๋ฉœ ์‹คํ–‰ ์ค‘์ธ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ๋กœ๊น…ํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์—. ๊ทธ๋ฆฌ๊ณ  Java ์™ธ์—๋„ Kotlin์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ์„ ์ง€์›ํ•˜๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋‚ด ์ƒ๊ฐ์—๋Š” Quarkus๊ฐ€ ์‹œ๋Œ€์  ํ๋ฆ„์— ์ƒ๋‹นํžˆ ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ฐฑ์—”๋“œ ์ฝ”๋“œ ๊ฐœ๋ฐœ์ด ์ ์  ๋” ์‰ฌ์›Œ์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Docker ๋ฐ Kubernetes์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ๋”์šฑ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. ํฐ ์žฅ์ ์€ GraalVM์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›๊ณผ ํ”Œ๋žซํผ ์ข…์† ์ด๋ฏธ์ง€ ์ƒ์„ฑ์„ ํ†ตํ•ด ์„œ๋น„์Šค๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฑฐ์˜ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋Œ€์ค‘์˜ ์—ด์ •์ด ๋„˜์น˜๋Š” ์‹œ๋Œ€์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์‚ฌ์ดํŠธ- quarkus.io. ๋น ๋ฅธ ์‹œ์ž‘์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์˜ˆ๋Š” ์ด๋ฏธ ๋‹ค์Œ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. GitHub์˜.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€