Hibernate-reactive: "Rx" ์ด๋ฆ„ ์žฌ๊ณ 

์— ๋งŒ๋“  2020๋…„ 03์›” 31์ผ  ยท  40์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: hibernate/hibernate-reactive

Rx๋Š” ์˜์กด์„ฑ์œผ๋กœ Reactive Extensions(์ฆ‰, RxJava)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ํ˜ผ๋ž€์„ ์—†์• ๊ธฐ ์œ„ํ•ด ์ด ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์„ "hibernate-reactive" ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์†”์งํžˆ ๋‹ค์Œ ์˜ต์…˜์ด ์ ์  ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

//I want to try out Mutiny
Mutiny.SessionFactory sessionFactory = emf.unwrap(Mutiny.SessionFactory.class);
Mutiny.Session session = sessionFactory.openReactiveSession();
Mutiny.Query = session.createQuery(hql);

๋˜๋Š”:

//I want to try it out with CompletionStage
Stage.SessionFactory sessionFactory = emf.unwrap(Stage.SessionFactory.class);
Stage.Session session = sessionFactory.openReactiveSession();
Stage.Query = session.createQuery(hql);

๊ทธ๋Ÿฐ ๋‹ค์Œ Mutiny ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import static org.hibernate.reactive.mutiny.Mutiny.*;

...

SessionFactory sessionFactory = emf.unwrap(SessionFactory.class);
Session session = sessionFactory.openReactiveSession();
Query = session.createQuery(hql);

๋‚˜๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ์‚ฌ๊ณ ์˜ ๋ฌธ์ œ๋ฅผ ์ƒ๋‹นํžˆ ์™„ํ™” ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. (๋‹จ, ๋‹ค๋ฅธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ชจ๋“  40 ๋Œ“๊ธ€

@emmanuelbernard WDYT?

์˜ˆ, ํ•ญ์ƒ ์ฝ”๋“œ ์ด๋ฆ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ง„์งœ ์ด๋ฆ„์œผ๋กœ ๊ตณ์–ด์ง€๋Š” ๊ณผ์ •์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นจ๋ฆฌ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‚˜์—๊ฒŒ ํ• ๋‹นํ–ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‚˜๋Š” ์ด๋ฒˆ์ฃผ ๋ง์— ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ์ฃผ๋ง์— ํ•ด๋ด์•ผ๊ฒ ์–ด์š”

๊ทธ๋Ÿฐ๋ฐ ๋ฌด์—‡์œผ๋กœ ๋ฐ”๊พธ๊ฒ ์Šต๋‹ˆ๊นŒ?

hibernate-reactive ๋‚˜์˜์ง€ ์•Š์€ ์†Œ๋ฆฌ

>

์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ ๋ฐ˜์‘์— +1

2020๋…„ 4์›” 1์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 7์‹œ 45๋ถ„ DavideD [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

hibernate-reactive ๋‚˜์˜์ง€ ์•Š์€ ์†Œ๋ฆฌ

>

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/hibernate/hibernate-rx/issues/77#issuecomment-607292426 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AADJJTIRGWQNUSN7FC3WCSLRKNHRJANCNFSM4LX6AEVQ
.

๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค๋งŒ ReactiveSession ๋ฅผ ์ฒœ ๋ฒˆ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค....

์ €๋Š” HibernateRX ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. "๋ฐ˜์‘์„ฑ"์ด๋ผ๋Š” ๊ฒƒ์€ ๊ฐœ๋…์ด๋ฉฐ RxJava์˜ ์ƒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์ง€๋งŒ ReactiveSession์„ ์ฒœ ๋ฒˆ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•? ํ‚ค๋ณด๋“œ์— ์ŠคํŽ˜์ด์Šค ๋ฒ„ํŠผ์ด ์—†์Šต๋‹ˆ๊นŒ? :)

๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ๋‚˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์— ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ทธ๋‹ค์ง€ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์— ๋„ฃ์–ด๋„ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„๊นŒ์š”? ์•„๋‹ˆ๋ฉด ORM์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๊นŒ?
R ๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ฒƒ์„ ์ž์œ ๋กญ๊ฒŒ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Œ).

  1. org.hibernate.rx.RxSession (ํ˜„์žฌ)
  2. org.hibernate.rx.Session
  3. org.hibernate.reactive.ReactiveSession
  4. org.hibernate.reactive.Session
  5. org.hibernate.reactive.RSession
  6. org.hibernate.rx.RSession

๋‹ค๋ฅธ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐ•ํ•œ ์„ ํ˜ธ๋„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Reactive๊ฐ€ ์ด๋ฆ„์„ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ทธ๋ ‡๊ฒŒ ๊ธธ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ์ผ๋ถ€ ๊ตฌํ˜„ ๋˜๋Š” ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๋‘์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. class AbstracRxtEntityPersister extends RxEntityPersister
  2. class AbstracReactivetEntityPersister extends ReactiveEntityPersister

์ด๊ฒƒ์€ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ˆ˜์—…์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
RxAbstractEntityPersister

๋‚˜๋Š” ์˜ต์…˜ 3์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: org.hibernate.reactive.ReactiveSession
๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜์€ ์ œ์•ˆ์ด๋‚˜ ์ด์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์˜๊ฒฌ์ด ์žˆ์œผ๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ 3 ํˆฌํ‘œํ•˜๊ฒ ์ง€๋งŒ @vietj ๋„ ์˜๊ฒฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๋” ๋‚˜์€ ์˜ต์…˜์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ์†”์งํžˆ ๊ณต๋ฐฑ์„ ๊ทธ๋ ธ๊ณ  ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ReactiveSession ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Java์— ์œ ํ˜• ๋ณ„์นญ์ด ์—†๋Š” ๊ฒƒ์„ ์‹ซ์–ด ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ•ดํ‚น์€ Reactive.Session , Reactive.Query ๋“ฑ์„ ์ผ๋ถ€ Reactive ์œ ํ˜•์˜ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด Java์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์‹ค์ œ๋กœ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ต์…˜ 2์™€ 4๋ฅผ ์ข‹์•„ํ•œ๋‹ค:

  • org.hibernate.rx.Session
  • org.hibernate.reactive.Session

ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ํด๋ž˜์Šค๊ฐ€ "๋ฐ˜์‘ํ˜•"์ž„์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. Rx/Reactive๋ฅผ ๋ชจ๋“  ํด๋ž˜์Šค์— ์ ‘๋‘์‚ฌ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค๋ฅผ 2๊ธ‰ ์‹œ๋ฏผ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋น„๋ฐ˜์‘ํ˜• ๋Œ€์‘๋ฌผ๊ณผ ๋™์ผํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ฃผ์š” ๋‹จ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ํด๋ž˜์Šค์—์„œ ๋‘ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ(๋”ฐ๋ผ์„œ ์œ ํ˜•์ด ํ‘œํ˜„๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ •๊ทœํ™”๋œ ํด๋ž˜์Šค ์ด๋ฆ„์ด ํ•„์š”ํ•จ)์ด์ง€๋งŒ AFAIK๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ์–ด๋‚˜ ๋‹ค?

๋‚˜๋Š” ์˜ต์…˜ 2์™€ 4๋ฅผ ์ข‹์•„ํ•œ๋‹ค:

  • org.hibernate.rx.Session
  • org.hibernate.reactive.Session

FTR ์ €๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ ์˜ค๋ฅ˜์˜ ์œ„ํ—˜์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ˜์‘ ์„ธ์…˜์„ ๊ฐ€์งˆ ๊ฒƒ์ด ๊ฑฐ์˜ ํ™•์‹คํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์Œ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ˜๋ž€์„ ์œ„ํ•œ MutinySession
  • StagedSession ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ CompletionStage
  • ๋“ฑ

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ฐ˜์‘ํ˜• ํ’๋ฏธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ์šฉ์ž ๋Œ€๋ฉด API์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ฐ˜์‘ํ˜• ํ’๋ฏธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ์šฉ์ž ๋Œ€๋ฉด API์ž…๋‹ˆ๊นŒ?

"์ฃผ์š”" API ์ค‘์—๋Š” Query ํ•ด๋‹นํ•˜๋Š” API๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด, ๋‚˜๋Š” "Rx"๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ข‹์€ ๋ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ณ , ๊ทธ๊ฒƒ์€ RxJava ํ”„๋กœ์ ํŠธ์— ์˜ํ•ด ์ „ํ˜€ _์†Œ์œ _๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด - ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์˜ณ์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ณ„์•ฝ ๊ตฌ์กฐ์— ๋Œ€ํ•ด

Gavin์ด ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Session ์ธํ„ฐํŽ˜์ด์Šค์˜ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋™ ์™„์„ฑ ์˜ค๋ฅ˜์™€ ์‚ฌ๋žŒ๋“ค์˜ ์ธ์ง€ ๊ณผ๋ถ€ํ•˜๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด +1:

  • MutinySession , RxJava2Session , JDKReactiveSession (CompletionStage ๋ฐ Flow์šฉ)
  • SessionMutiny , SessionRxJava2 ๋“ฑ

๋Œ€์•ˆ์ ์ธ ํŒจํ„ด์€ reactiveSession.forMutiny().[...] , reactiveSession.forJDK().[...] ์ด์ง€๋งŒ ์˜์กด์„ฑ ์•…๋ชฝ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค. reactiveSession.unwrap(MutinySession.class) ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ:

  • Rx์—๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” 3๊ฐ€์ง€ ๋ฒ„์ „์ด ์žˆ์œผ๋ฏ€๋กœ ๊ณ„์•ฝ์„œ์— ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CompletionStage ์˜ ํŒ”์งฑ์„ ๋ผ๊ณ  ์žˆ๋Š” ํ˜•๋‹˜์ด Flow ๋ผ๊ณ  ํ•ด์„œ JDKReactiveSession ๋ผ๊ณ  ๋ถˆ๋ €์Šต๋‹ˆ๋‹ค.
  • RxJava์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹จ์ผ ์œ ํ˜•์ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ RxJavaXSession ๋ฉ”์„œ๋“œ๋Š” fetchAsSingle() ๋“ฑ๊ณผ ๊ฐ™์ด "์˜ค๋ฒ„๋กœ๋“œ"๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Query ์—๋„ Reactive ๋Œ€์‘๋ฌผ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. BTW ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ง์ ‘ ์œ ํ˜•๊ณผ ๋ฐ˜์‘ ๋ž˜ํผ(์˜ˆ: Uni<String> ๋ฅผ ๋ชจ๋‘ ์ˆ˜๋ฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์—์„œ Hibernate ORM Reactive๋Š” hibernate-orm-reactive ๊ดœ์ฐฎ์ง€๋งŒ @FroMage "Panache Rx"๋Š” ๋น„์Šทํ•œ ๋ณ€ํ™˜์„

@emmanuelbernard ๋Š” Session ๋ฐ SessionFactory ๋ฅผ ์–ป๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

RxSessionFactory sessionFactory = emf.unwrap(RxSessionFactory.class);
RxSession session = sessionFactory.openRxSession();

๋‚˜๋Š” ์ด ํŒจํ„ด์— ์ƒ๋‹นํžˆ ๋งŒ์กฑํ•œ๋‹ค.

JDKReactiveSession

์–ด. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€์— ๋Œ€ํ•ด ๋”์ฐํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Query ์—๋„ Reactive ๋Œ€์‘๋ฌผ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๋ฏธ ์กด์žฌํ•˜๋ฉฐ ํ˜„์žฌ RxQuery ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋‹ค์Œ ์˜ต์…˜์ด ์ ์  ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

//I want to try out Mutiny
Mutiny.SessionFactory sessionFactory = emf.unwrap(Mutiny.SessionFactory.class);
Mutiny.Session session = sessionFactory.openReactiveSession();
Mutiny.Query = session.createQuery(hql);

๋˜๋Š”:

//I want to try it out with CompletionStage
Stage.SessionFactory sessionFactory = emf.unwrap(Stage.SessionFactory.class);
Stage.Session session = sessionFactory.openReactiveSession();
Stage.Query = session.createQuery(hql);

๊ทธ๋Ÿฐ ๋‹ค์Œ Mutiny ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import static org.hibernate.reactive.mutiny.Mutiny.*;

...

SessionFactory sessionFactory = emf.unwrap(SessionFactory.class);
Session session = sessionFactory.openReactiveSession();
Query = session.createQuery(hql);

๋‚˜๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ์‚ฌ๊ณ ์˜ ๋ฌธ์ œ๋ฅผ ์ƒ๋‹นํžˆ ์™„ํ™” ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. (๋‹จ, ๋‹ค๋ฅธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ฉ‹์ง€๋‹ค @gavinking

@gavinking ๋งˆ์ง€๋ง‰ ์ œ์•ˆ์ด ์ •๋ง ๋งˆ์Œ์—

๋‚˜๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•˜๋Š” ์‚ฌ๊ณ ์˜ ๋ฌธ์ œ๋ฅผ ์ƒ๋‹นํžˆ ์™„ํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‹จ, ๋‹ค๋ฅธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

์˜ˆ๋ฅผ ๋“ค์–ด?

@DavidD ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ IDE๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

@emmanuelbernard ๋Š” Session ๋ฐ SessionFactory ๋ฅผ ์–ป๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

RxSessionFactory sessionFactory = emf.unwrap(RxSessionFactory.class);
RxSession session = sessionFactory.openRxSession();

๋‚˜๋Š” ์ด ํŒจํ„ด์— ์ƒ๋‹นํžˆ ๋งŒ์กฑํ•œ๋‹ค.

JDKReactiveSession

์–ด. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€์— ๋Œ€ํ•ด ๋”์ฐํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์—์„œ ์‚ฌ๋žŒ๋“ค์€ CompletionStage ์‹ซ์–ดํ•˜๊ณ  RxJava๋‚˜ ์นœ๊ตฌ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋ฒ„์ „์€ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์—์„œ ์‚ฌ๋žŒ๋“ค์€ CompletionStage๋ฅผ ์‹ซ์–ดํ•˜๊ณ  RxJava๋‚˜ ์นœ๊ตฌ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋ฒ„์ „์€ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? :-NS

๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์—์„œ ์‚ฌ๋žŒ๋“ค์€ CompletionStage ์‹ซ์–ดํ•˜๊ณ  RxJava๋‚˜ ์นœ๊ตฌ๋“ค์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋ฒ„์ „์€ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ €๋„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

IDE๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Session ์ž‘์„ฑํ•  ์ˆ˜ ์—†๊ณ  static Mutiny.Session ๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” IDE ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•ญ์ƒ Mutiny.Session ์ ‘๋‘์‚ฌ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋ฌธ์„œ์—๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์—์„œ Hibernate ORM Reactive๋Š” ์ข‹์€ hibernate-orm-reactive์ด์ง€๋งŒ @FroMage ๋Š” "Panache Rx"์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. ํ•ญ์ƒ ์ฝ”๋“œ๋„ค์ž„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Session์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๊ณ  ๊ฐ€์ ธ์˜ฌ IDE ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๊ฐ•๋ ฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์„œ์— ์ถฉ์‹คํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ์ „ํžˆ Mutiny.SessionFactory ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ญ์ƒ ๊ทธ๋ž˜์•ผ ํ•˜์ง€๋งŒ, ์ˆ˜์ž…ํ’ˆ์„ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค) .

@FroMage ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IntelliJ์—์„œ ์„ค์ • > ์ฝ”๋“œ ์Šคํƒ€์ผ > Java > ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ์ด๋™ ํ•ฉ๋‹ˆ๋‹ค. Eclipse์—๋Š” ๋น„์Šทํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Mutiny๋Š” ๋‚ด ์ƒ๊ฐ์— ๊ธฐ๋ณธ API๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” compat ํŒจํ‚ค์ง€์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CompletionStage/Flow ๋ฒ„์ „๋„ :-)

์—…๋ฐ์ดํŠธ: Mutiny ๋ฌธ์„œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ compat์—์„œ ๊ตฝ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ฅผ ์œ„ํ•ด Mutiny์— ์˜์กดํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ๋ถ€๋‹ด์„ ์ค๋‹ˆ๋‹ค.

Clement๋Š” Mutiny์— ํŠธ๋žจํด๋ฆฐ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Mutiny๋ฅผ Reactive Hibernate์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ์ง€์› ์ธ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์€ hibernate-dev ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” Hibernate Reactive ๋กœ ๊ฐ€๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ... ์•Œ์•˜์Šต๋‹ˆ๊นŒ?

๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ๋‹ต์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋“ฑ๋กํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํŠนํžˆ ์ด๊ฒƒ์€ (๋ฌด์—‡๋ณด๋‹ค๋„) ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ํฐ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

Hibernate Reactive, ์•Œ์•˜์ง€?

:์ƒดํŽ˜์ธ:

ํŠนํžˆ ์ด๊ฒƒ์€ (๋ฌด์—‡๋ณด๋‹ค๋„) ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ํฐ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ํฐ ์Šค๋ ˆ๋“œ, ํ•˜๋‚˜์˜ ์ด๋ฉ”์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค ;)

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์—ฌ์ „ํžˆ HibernateRX๋ฅผ ๋” ์ข‹์•„ํ•œ๋‹ค -- ๋‚˜๋Š” RxJava๊ฐ€ "Rx"๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š๊ณ  IMO HibernateRX๊ฐ€ ๋ˆˆ์— ์ž˜ ๋„๋Š” ์ด๋ฆ„์ด๋ผ๋Š” Sanne์— ๋™์˜ํ•œ๋‹ค. Hibernate Reactive๋Š” ์ด๋ฆ„๋ณด๋‹ค ์„ค๋ช…์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‚ด $0.02์ด๊ณ  ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์Šค๋ ˆ๋“œ๋ฅผ ์ด๊ฒƒ์œผ๋กœ ์–ด์ง€๋Ÿฝํžˆ๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์—ฌ์ „ํžˆ HibernateRX๋ฅผ ๋” ์ข‹์•„ํ•œ๋‹ค -- ๋‚˜๋Š” RxJava๊ฐ€ "Rx"๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š๊ณ  IMO HibernateRX๊ฐ€ ๋ˆˆ์— ์ž˜ ๋„๋Š” ์ด๋ฆ„์ด๋ผ๋Š” Sanne์— ๋™์˜ํ•œ๋‹ค. Hibernate Reactive๋Š” ์ด๋ฆ„๋ณด๋‹ค ์„ค๋ช…์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‚ด $0.02์ด๊ณ  ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์Šค๋ ˆ๋“œ๋ฅผ ์ด๊ฒƒ์œผ๋กœ ์–ด์ง€๋Ÿฝํžˆ๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@aguibert ์˜ ๋ฌธ์ œ๋Š” x๊ฐ€ Hibernate Rx ์ด๋ฆ„์—์„œ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
Reactive Extension์€ ํŠน์ • https://en.m.wikipedia.org/wiki/Reactive_extensions์ž…๋‹ˆ๋‹ค.

๋งž์•„, ๋‚˜๋Š” Hibernate Rx๊ฐ€ "Hibernate Reactive Extensions"์˜ ์•ฝ์ž๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. Reactive Extensions๋Š” ํŠน์ •ํ•œ ๊ฒƒ์ด์ง€๋งŒ ํŠน์ • ์ œํ’ˆ์ด๋‚˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ๋…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. IMO ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ผ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทธ ๊ฐœ๋…์— ๋งž์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ "Hibernate Reactive"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ํ•ฉ์˜์— ๊ทผ์ ‘ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ ์ด๋ฆ„์œผ๋กœ๋„ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” Emmanuel์˜ ์ด๋ฉ”์ผ๋กœ ์ธํ•œ ๋ฐ˜๋ž€์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธ€์„ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค. :)

Hibernate Reactive ์ž…๋‹ˆ๋‹ค! @murphye ์™€ ๋ชจ๋‘์—๊ฒŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

#111์— ์ด์–ด

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰