Exposed는 Kotlin 언어에서 사용되는 SQL 라이브러리로, 데이터베이스와의 상호작용을 보다 간단하고 직관적으로 처리할 수 있도록 도와줍니다. 이 라이브러리는 SQL 쿼리 작성을 Kotlin DSL로 표현할 수 있게 해주어, JDBC를 보다 효율적으로 사용하려는 개발자들에게 유용합니다.
1. Kotlin DSL (Domain-Specific Language)
2. 유연한 객체 관계 매핑 (ORM/DAO)
기존 ORM과 유사하게 객체와 테이블 간의 매핑을 처리하며, 상황에 따라 객체 지향적인 DAO 방식과 SQL 중심의 DSL 방식을 선택적으로 사용할 수 있습니다.
핵심 포인트: 복잡한 비즈니스 로직은 DAO로, 성능 최적화가 필요한 조회 로직은 DSL로 분리하여 효율적인 데이터 처리가 가능합니다.
3. JDBC 기반의 저수준 제어 (Low-level Control)
JDBC를 얇게 래핑(Wrapping)하여 데이터베이스와 직접 상호작용합니다. 이는 JPA 같은 고수준 ORM보다 추상화 계층이 낮아 더 세밀한 제어가 가능합니다.
JPA에서 구현하기 까다로운 Window Function이나 Native SQL의 기능을 직접 활용할 수 있어 성능 최적화에 유리합니다.
4. 강력한 동적 쿼리 빌딩
별도의 라이브러리(QueryDSL 등) 없이도 Kotlin 코드를 통해 SQL 쿼리를 동적으로 빌드할 수 있습니다.
핵심 포인트: Kotlin의 제어문(if, when)을 활용해 복잡한 검색 조건이나 동적 정렬 로직을 코드 레벨에서 안전하고 명확하게 구현할 수 있습니다.
| 특징 | JPA | Exposed |
|---|---|---|
| 개발 속도 | 빠르게 개발 가능 (자동으로 엔티티 매핑, CRUD 작업 제공) | 개발자가 더 많은 작업을 해야 함 (SQL 직접 작성) |
| 추상화 수준 | 고수준 추상화 제공 (엔티티 객체와 데이터베이스 테이블 매핑) | 저수준 추상화 제공 (직접 SQL 작성, 더 세밀한 제어 가능) |
| 유지보수 | 엔티티 클래스 기반으로 유지보수가 편리하고, 객체지향적 접근 | 코드가 간결하고, 쿼리 작성에 유연성을 제공하지만 객체지향적이지 않음 |
| 성능 | ORM이 추가적인 추상화로 인해 성능이 떨어질 수 있음 (특히 복잡한 쿼리) | 직접 SQL을 작성하므로 성능에 대한 세밀한 조정 가능 |
| 배우기 쉬운 정도 | Java 개발자에게 익숙하고 표준 API로 쉽게 배울 수 있음 | Kotlin 개발자에게 익숙하고 직관적이지만, JPA보다는 조금 더 배우기 어려울 수 있음 |
| 쿼리 최적화 | JPA가 제공하는 쿼리 최적화 기능이 한정적일 수 있음, 복잡한 쿼리에서 성능 이슈 발생 가능 | SQL을 직접 작성하여 최적화가 가능하지만, 더 많은 코드 작성 필요 |
| 라이브러리/도구 | 많은 툴과 라이브러리에서 지원, 예: Spring Data JPA | Kotlin에서 주로 사용되며, 일부 도구에서만 지원 |
| 특징 | JPA | Exposed |
|---|---|---|
| 복잡성 | 설정이 복잡할 수 있으며, 엔티티 간 관계 정의와 매핑이 번거로울 수 있음 | SQL을 직접 작성해야 하므로, 코드가 복잡할 수 있고, 관리가 어려울 수 있음 |
| 유연성 부족 | 자동화된 기능이 많아서, 복잡한 쿼리나 커스터마이징에 제약이 있을 수 있음 | 더 많은 유연성을 제공하지만, 직접 관리해야 할 부분이 많아져서 실수할 여지가 있음 |
| 학습 곡선 | JPA와 Hibernate의 복잡한 설정과 개념을 익히는 데 시간이 걸릴 수 있음 | Exposed는 Kotlin에 익숙하지 않은 개발자에게는 적응이 필요할 수 있음 |
| 디버깅 | JPA는 쿼리와 객체 매핑 간의 문제를 추적하기 어려울 수 있음 | 직접 SQL을 작성하므로 디버깅이 상대적으로 쉬운 반면, 코드 실수를 찾는 데 시간이 걸릴 수 있음 |