codingBird

TIL - 쇼핑몰 프로젝트(Plain Old) 마이그레이션 2일 차. Hibernate Reactive 본문

TIL

TIL - 쇼핑몰 프로젝트(Plain Old) 마이그레이션 2일 차. Hibernate Reactive

김뚜루 2023. 7. 26. 09:08

갓 나와 따끈따끈한 Hibernate Reactive 2.0

이번 마이그레이션을 진행하면서 꼭 해보고 싶은 부분은 아래와 같다.

- WebMVC → WebFlux

- Coroutine

- Blocking DB → R2DBC 또는 Hibernate Reactive

- 멀티 모듈 (어드민, 사용자)

- 선착순 상품

특정 기업에 입사하지 않는 이상 반응형 프로그래밍을 다룰 기회는 없을 것 같지만 그래도 멋있고 재밌어 보이니까 한번 해보려고 한다.

Hibernate Reactive

WebFlux 는 비동기/논블럭 작업을 통해 적은 스레드로 높은 처리량을 가진다는 장점이 있다. (Cpu 코어 x 2개)

하지만 JPA의 구현체 hibernate 는 블럭킹 입/출력인 관계로 스레드 수가 적은 WebFlux 환경에서 hibernate 를 사용하면 WebMVC 환경에서 hibernate 을 사용하는 것에 비해 성능은 매우 좋지 않을 것이다.

물론 Kotlin Coroutine 을 사용하면 크게 문제 없을 것 같은데 그래도 남는 게 시간이고 경험은 중요하니 Hibernate Reactive 를 사용하려 한다.

그리고 R2DBC 가 아닌 Hibernate Reactive 를 사용하고자 하는 이유는 익숙한 JPA 특성을 거의 그대로 가져가면서 비동기 방식으로 수행할 수 있기 때문.

Springboot Devtools 이슈

Springboot Devtools 때문이라고는 꿈에도 몰랐었지…

공식 문서 예제를 보면서 구현하고 있던 도중 위와 같은 오류가 계속 발생했다.

에러 내용은 Hibernate Reactive 가 Reflection 을 통해 필드 값을 읽으려고 하는 데 실패했다는 것.

혹시 final 관련 문제인가 싶어 AllOpen 플러그인도 추가했지만 여전히 같은 오류가 발생해서 도저히 이유를 알 수 없었다.

Hibernate Reactive 사용을 포기하려고 했던 찰나에 우연히 어느 블로그의 글에서 Spring Devtools로 인해 오류가 발생할 수 있다는 글을 보고 Devtools 의존성을 제거했더니 놀랍게도 서버가 정상적으로 실행되는 것을 볼 수 있었다. (Application Classloader 와 Restart Classloader 차이 때문에 발생할 수 있다고 하는데 정확한 이유는 잘 모르겠다)