Hibernate-reactive: openSession() λ°˜ν™˜ 였λ₯˜ "Vert.x 이벀트 λ£¨ν”„μ—μ„œ μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€."

에 λ§Œλ“  2021λ…„ 05μ›” 12일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: hibernate/hibernate-reactive

μ•ˆλ…•ν•˜μ„Έμš”,

μ§€κΈˆκΉŒμ§€ VertxλŠ” Hibernate Reactive API(1.0.0.CR4)λ₯Ό μ‚¬μš©ν•˜λŠ” λ™μ•ˆ λ‚˜μ—κ²Œ 숨겨져 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 APIλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„Έμ…˜μ„ λ‹«κΈ°λ‘œ κ²°μ •ν•  λ•ŒκΉŒμ§€ μ—΄λ € μžˆλŠ” μ„Έμ…˜μ„ λ°˜ν™˜ν•˜λ €λ©΄ APIλ₯Ό λ…ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
Junit ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ 쀑이며 λ‹€μŒ APIκ°€ μžˆμŠ΅λ‹ˆλ‹€.

    public Stage.Session openSession() throws ExecutionException, InterruptedException {
        if (session != null && session.isOpen()) {
            session.close();
        }
        Stage.Session newSession = sessionFactory.openSession();
        this.session = newSession;
        return newSession ;
   }

그리고 λ‚΄ junit ν…ŒμŠ€νŠΈμ—μ„œ :
Stage.Session session = deviceRepository.openSession();
μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
This needs to be run on the Vert.x event loop
μ—¬λŸ¬ 가지 λ°©λ²•μœΌλ‘œ μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν–ˆμ§€λ§Œ 싀행에 μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

μ˜¬λ°”λ₯΄κ²Œ μˆ˜ν–‰ν•˜λŠ” 방법을 μΆ”μ²œν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ„€, ν•˜κ² μŠ΅λ‹ˆλ‹€

λͺ¨λ“  7 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”,
μ„Έμ…˜μ˜ λ¬Έμ œλŠ” μŠ€λ ˆλ“œλ‘œλΆ€ν„° μ•ˆμ „ν•˜μ§€ μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ μ„Έμ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ””λ²„κ·Έν•˜κΈ° μ–΄λ €μš΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μƒˆ μ„Έμ…˜μ΄ μƒμ„±λ˜λ©΄ Vert.x μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©λ˜λ©° 이후 λ™μΌν•œ μ»¨ν…μŠ€νŠΈμ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이것은 SessionFactory#withTransaction 및 SessionFactory#withSession μ‚¬μš©ν•  λ•Œ Hibernate Reactive에 μ˜ν•΄ 일반적으둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈλŠ” Vert.x μŠ€λ ˆλ“œκ°€ μ•„λ‹Œ JUnit μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
JUnit 4μ—μ„œ 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” ν•œ 가지 방법은 io.vertx:vertx-unit:4.0.3 λΌμ΄λΈŒλŸ¬λ¦¬μ— ν¬ν•¨λœ κ·œμΉ™μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

<strong i="13">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();

μ΄λ ‡κ²Œ ν•˜λ©΄ ν…ŒμŠ€νŠΈκ°€ Vert.x μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€ .

μ΄κ²ƒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ„Έμ…˜μ΄ κ·œμΉ™μ— μ˜ν•΄ μ •μ˜λœ λ™μΌν•œ Vert.x μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©λ˜μ–΄ μžˆλŠ”μ§€ 확인해야 ν•©λ‹ˆλ‹€.

VertxInstance μ„œλΉ„μŠ€:

일반적으둜 이λ₯Ό λ‹¬μ„±ν•˜λŠ” 방법은 μ‚¬μš©μž 지정 VertxInstance μ„œλΉ„μŠ€λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

이 μ„œλΉ„μŠ€λŠ” μ„Έμ…˜μ΄ 생성될 λ•Œ μ‚¬μš©ν•  μ˜¬λ°”λ₯Έ Vert.x μΈμŠ€ν„΄μŠ€λ₯Ό μ–»λŠ” 방법을 Hibernate Reactive에 μ•Œλ €μ€λ‹ˆλ‹€.
ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ SessionFactoryλ₯Ό μƒμ„±ν•˜λŠ” 경우 μˆ˜ν–‰ 방법에 λŒ€ν•œ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Configuration configuration = new Configuration();
StandardServiceRegistryBuilder builder = new ReactiveServiceRegistryBuilder()
                .addService( VertxInstance.class, (VertxInstance) () -> getMyVertxInstance())
                .applySettings( configuration.getProperties() );
StandardServiceRegistry registry = builder.build();
SessionFactory sessionFactory = configuration.buildSessionFactory( registry );

λ˜λŠ” JDK 의

  1. μ•„λž˜μ— org.hibernate.reactive.vertx.VertxInstance λΌλŠ” ν…μŠ€νŠΈ νŒŒμΌμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
    /META-INF/services/
  2. ν…μŠ€νŠΈ νŒŒμΌμ—λŠ” VertxInstance μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ— λŒ€ν•œ κ²½λ‘œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.
    org.myproject.MyVertxProvider

이제 Hibernate ReactiveλŠ” Vert.x μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•  λ•Œ MyVertxProvider 의 μΈμŠ€ν„΄μŠ€λ₯Ό ν˜ΈμΆœν•˜κ³  μ½”λ“œκ°€ λ™μΌν•œ Vert.x μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹€ν–‰λ˜λ©΄ λͺ¨λ“  것이 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

JUnit 4 κ΄€λ ¨ 문제 μˆ˜μ •:

ν…ŒμŠ€νŠΈλ‘œ λŒμ•„κ°€μ„œ 문제λ₯Ό μˆ˜μ •ν•˜λŠ” ν•œ 가지 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

<strong i="41">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();

...

Configuration configuration = new Configuration();
StandardServiceRegistryBuilder builder = new ReactiveServiceRegistryBuilder()
                .addService( VertxInstance.class, (VertxInstance) () -> vertxContextRule.vertx() )
                .applySettings( configuration.getProperties() );
SessionFactory sessionFactory = configuration.buildSessionFactory(  builder.build() );

κ·œμΉ™μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ νŠΉμ • Vert.x μ»¨ν…μŠ€νŠΈμ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Context currentContext = Vertx.currentContext();
currentContext.runOnContext( event -> {
   // Here you should be able to use the session
});

방금 μž‘μ„±ν•œ λ‚΄μš©μ„ FAQ둜 μ›Ήμ‚¬μ΄νŠΈ λ˜λŠ” μ–΄λ””μ—λ‚˜ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ„€, ν•˜κ² μŠ΅λ‹ˆλ‹€

@DavidD κ·€ν•˜μ˜ μ„€λͺ…에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. 감사 ν•΄μš”.

λ‚˜λŠ” λ¬Έμ„œ/μ›Ήμ‚¬μ΄νŠΈμ— λŒ€ν•œ μ΄λŸ¬ν•œ λ³€κ²½ 사항을 μΆ”μ ν•˜κΈ° μœ„ν•œ 문제λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€: https://github.com/hibernate/hibernate-reactive/issues/751

이 문제λ₯Ό μ’…λ£Œν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ§ˆλ¬Έμ€ λͺ…ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.

@DavidD JUnit 5μ—μ„œ μ•žμ„œ μ–ΈκΈ‰ν•œ λ‹€μŒ μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

Context currentContext = Vertx.currentContext();
currentContext.runOnContext( event -> {
   // Here you should be able to use the session
});

예, κ·Έ μ½”λ“œλŠ” JUnit이 μ•„λ‹ˆλΌ Vert.xμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ„œ t ν•΄λ‹Ήν•˜λŠ” ν™•μž₯이 μ•„λ‹™λ‹ˆλ‹€ .

<strong i="8">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰