Ujorm3: JavaBeans와 레코드를 위한 새로운 경량 ORM

발행: (2026년 3월 24일 AM 01:27 GMT+9)
8 분 소요
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content (excluding the source line you already provided) here? Once I have the text, I’ll translate it into Korean while preserving the original formatting, markdown, and technical terms.

왜 새로운 ORM인가?

원래 JDBC API는 완전한 ORM을 목표로 하지 않았으며, 수년간 수많은 라이브러리와 프레임워크가 등장했으며 각각 복잡성, 성능, 사용성 측면에서 장단점이 있습니다.

Ujorm 3은 관계형 데이터베이스 접근을 위한 신뢰성 있고, 안전하며, 효율적이고, 이해하기 쉬운 도구가 되는 것을 목표로 합니다:

  • JDBC 위에 얇은 레이어 – 숨겨진 마법이 없습니다.
  • 상태 없는 객체네이티브 SQL – 데이터베이스에 전송되는 내용을 완전히 제어할 수 있습니다.
  • SQL 방언 처리 없음 – 순수 SQL을 작성하세요; 라이브러리는 타입 안전 매핑 도우미만 추가합니다.
  • 쿼리 결과 캐시 없음 – 속도를 위해 소량의 메타데이터만 유지됩니다.

첫 번째 릴리스 후보(RC1)는 Apache License 2.0 하에 Maven Central에서 제공됩니다.

Core Concepts

ConceptDescription
SqlQuery (formerly SqlParamBuilder)PreparedStatement에 대한 파사드. 명명된 파라미터를 지원하고, 체크 예외를 없애며, SELECT에 대해 Stream을 반환합니다.
ResultSetMapperResultSet을 도메인 객체에 매핑합니다. 매핑 모델은 최초 사용 시 한 번 구축되고 재사용되어, 쿼리당 오버헤드를 크게 줄입니다.
Annotations표준 jakarta.persistence 어노테이션(@Table, @Column, @Id)을 사용합니다. 어노테이션이 없을 경우에도 라이브러리가 매핑을 추론할 수 있습니다.
Supported POJOs가변 JavaBeans 불변 record 모두 완전히 지원됩니다.
RelationsM:1(many‑to‑one) 관계만 지원합니다. 1:M 컬렉션은 숨겨진 쿼리와 N+1 문제를 방지하기 위해 의도적으로 제외되었습니다.
Column Labels컬럼은 점으로 연결된 라벨(예: "city.name")로 참조할 수 있습니다. 안전성을 위해 생성된 type‑safe metamodel(Meta* 클래스) 사용이 권장됩니다.
EntityManagerCrud 객체를 통해 CRUD 작업(배치 명령 포함)을 제공합니다. 컬럼을 열거하거나 원본 객체와 차이를 비교하여 부분 업데이트를 지원합니다.

예시: 직원 선택

// Static mapper – thread‑safe and reusable
static final ResultSetMapper EMPLOYEE_MAPPER =
        ResultSetMapper.of(Employee.class);

void select() {
    var sql = """
            SELECT ${COLUMNS}
            FROM employee e
            JOIN city c ON c.id = e.city_id
            LEFT JOIN employee b ON b.id = e.boss_id
            WHERE e.id > :employeeId
            """;

    var employees = SqlQuery.run(connection(), query -> query
            .sql(sql)
            // Map columns – the ${COLUMNS} placeholder is replaced automatically
            .column("e.id",   MetaEmployee.id)
            .column("e.name", MetaEmployee.name)
            .column("c.name", MetaEmployee.city, MetaCity.name)
            .column("c.country_code", MetaEmployee.city, MetaCity.countryCode)
            .column("b.name", MetaEmployee.boss, MetaEmployee.name)
            .bind("employeeId", 0L)
            // Convert the ResultSet stream to a List
            .streamMap(EMPLOYEE_MAPPER.mapper())
            .toList());
}

도메인 클래스는 사전 등록이 필요하지 않습니다.
SQL 텍스트를 그대로 두고 싶다면 column() 대신 label()을 사용하세요. column()label()은 같은 쿼리에서 혼용할 수 없습니다.

벤치마크 하이라이트

  • 런타임에 생성되는 매핑 클래스 (리플렉션 대신) → 메모리 사용량 감소, GC 압력 감소.
  • 외부 의존성 없음 → 컴파일된 벤치마크와 Ujorm 3 JAR은:
org.ujorm
ujorm-orm
3.0.0-RC1

메타모델 생성 (옵션)

타입‑안전 Meta* 클래스를 원한다면, maven-compiler-plugin에 어노테이션 프로세서를 활성화하세요:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.ujorm</groupId>
                <artifactId>ujorm-processor</artifactId>
                <version>3.0.0-RC1</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

Source:

요약

Ujorm 3은 최소 오버헤드, 투명성, 그리고 타입 안전성을 제공하는 방식으로 Java에서 관계형 데이터베이스를 다룰 수 있게 합니다. JDBC에 가깝게 유지하면서도 깔끔하고 현대적인 API를 제공함으로써, 개발자는 무거운 ORM이 가져오는 숨겨진 비용 없이 명확하고 성능 좋은 코드를 작성할 수 있습니다.

다음 Java 17+ 프로젝트에서 한 번 사용해 보시고 “가능한 가장 단순한 방법”의 편리함을 체험해 보세요.

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujorm-meta-processor</artifactId>
    <version>3.0.0-RC1</version>
</dependency>

Benchmark 프로젝트의 Ujorm 모듈을 샘플 구현 템플릿으로 활용할 수 있습니다. 현재 라이브러리 코드베이스는 인‑메모리 H2 데이터베이스(모의 객체와 함께)를 활용한 JUnit 테스트로 커버되고 있습니다.

최종 버전을 릴리스하기 전에 PostgreSQL, MySQL, Oracle, 그리고 MS SQL Server 데이터베이스에 대한 통합 테스트를 추가할 예정입니다.

Note:
데이터베이스 간 표준성이나 추상화의 이식성을 요구하는 기업 고객을 위해 작업하고 있다면 JPA/Hibernate를 사용하세요. 이미 기대와 요구를 충족하는 ORM 프레임워크를 찾았다면 그대로 사용하면 됩니다. 하지만 새로운 프로젝트에서 숨겨진 메커니즘 없이 빠르고 투명한 대안을 찾고 있다면 Ujorm 3 라이브러리를 꼭 한 번 시도해 볼 가치가 있습니다.

프로젝트 홈페이지

(프로젝트 홈페이지에 대한 링크를 여기 삽입할 수 있습니다)

JUnit 테스트로 더 많은 예제

(추가 JUnit 테스트 예제에 대한 링크 또는 설명을 여기 삽입할 수 있습니다)

벤치마크 테스트

(벤치마크 테스트에 대한 링크 또는 설명을 여기 삽입할 수 있습니다)

0 조회
Back to Blog

관련 글

더 보기 »

SJF4J: Java용 구조화된 JSON 파사드

소개 Java에서 JSON을 다루는 것은 일반적으로 두 가지 접근 방식 중 하나를 선택하는 것을 의미합니다: - 데이터 바인딩 POJO – 강한 타입 지정이지만 경직됨 - 트리 모델 JsonNode / Ma...