본문 바로가기
코틀린

Kotlin Exposed (orm) 사용해보기

by RWriter 2022. 1. 9.
반응형

예제소스는 깃허브에 있습니다.

 

jetbrains 에서 운영하는 kotlin orm 이다.

 

GitHub - JetBrains/Exposed: Kotlin SQL Framework

Kotlin SQL Framework. Contribute to JetBrains/Exposed development by creating an account on GitHub.

github.com

 

orm 이란 object relational mapping 의 약자로 객체와 rdbms (관계형 데이터베이스) 를 맵핑해주는 도구이다.

자바,스프링 진영에서는 hibernate를 메인 구현체로 하는 JPA 를 사용하고 있다.
(jpa는 일종의 spec 이고, 구현체는 대부분 hibernate 를 사용한다.)

 

kotlin 으로 만들어진 orm 3대장 (star) _ 2022.01.05

  • exposed (5.8k)
  • sqldelight (4.4k) - 안드진영에서 인기
  • ktorm (1.2k)

Exposed

Just like our mascot, Exposed can mimic a variety of database engines and help you build database applications without hard dependencies on any specific database engine, and switch between them with very little or no changes in your code.

오징어 마스코트를 내세우며 다양한 db engine에 대해서 코드 변경을 최소화한다는 것을 목적으로 삼고 있다.

그런데.. 이런 정도의 objective 는 jdbc 도, jpa 와 비교했을때 차별점으로 보긴 어려운듯.. 다소 심심한 포부로 느껴진다.

 

왠만한 RDBMS는 지원된다. 파란색글씨는 추가 설명 링크

개발도 활발하다.

 

document site 는 따로 없고, github wiki 만 존재한다.

 

GitHub - JetBrains/Exposed: Kotlin SQL Framework

Kotlin SQL Framework. Contribute to JetBrains/Exposed development by creating an account on GitHub.

github.com

 

특징

  • lightweight orm
    • 그렇다고 sql mapper 수준은 아님. (like mybatis)
    • per transaction 기준으로 entity cache 지원. (메커니즘은 살펴보지 못함..)
  • dsl (like QueryDSL)
    • queryDSL은 컴파일러가 만들어주는 것과 달리 QClass 같은 것을 직접 선언해서 사용한다.
  • dao (like jpa)
    • lazy loading, eager loading 지원. 기본은 lazy. 
    • jpa와 달리 eager이 바로 join query 하나만 사용하는 것은 아니고, 메인 엔티티 조회 시 참조객체를 가져오는 쿼리를 같이 수행한다. 다건 조회의 경우에는 추가 in 절 쿼리를 수행하여 n+1을 방지한다.
  • single thread 기반 (like jpa)
  • native query 지원
  • batch update, batch insert 지원
    • jpa가 지원못해주는 이유는 mysql + identity + context 때문이므로..
  • spring @transaction 으로도 사용 가능
  • transaction 에 isolation 지정 가능
  • propagation level은 없음. nestedTransaction enable flag가 존재하여 exception 시 nestedTx 만 rollback 하게 할 수 는 있다. 
  • multiple datasource 가능

장점

  • 스프링 이외의 서버 프레임워크와 이용 가능 (ktor, http4k 등..)
  • 코틀린으로 만들어져서 null 타입 호환이 잘 됨
  • batch insert 등을 편하게 쓸 수 있다.
  • jdbc template + jpa 느낌
  • 설정이 간편하다.
  • coroutine transaction 을 지원함
  • 젯브레인에 대한 기대감..

단점

  • 레퍼런스가 적다 (막혔을 때 막막함)
  • dsl 코드량이 queryDSL 에 비해 적지 않음
  • best practice 를 찾지 못했음. 
  • 버전이 낮음 (0.32)
  • r2dbc X (지원예정)

정리

  • 토이 프로젝트에서 사용해보는 것을 권장
  • batch insert 등이 필요한 경우에 부분적으로 사용해보는 것도 좋음 (사내 일부 팀에서 쓰고 있음)
  • 그래도 비교적 lightweight 하므로, 코드를 직접 살펴보며 추상화 과정을 엿볼 수도 있다. 

 

공식 위키를 참고하는 것이 가장 도움이 되나, 실용적인 튜토리얼로 몇가지 예제를 준비했다. 

 

GitHub - LarryJung/study-git

Contribute to LarryJung/study-git development by creating an account on GitHub.

github.com

1. DSL 사용하기

2. DAO 사용하기

3. HikariCP 사용하기

4. 테이블 엔티티 모델링

5. 간단한 CRUD

6. TxHandler로 transaction 추상화하기

7. lazy, eager 로딩 살펴보기

8. join, dynamic query, select 절 맵핑하기 

반응형

댓글