티스토리 뷰
QueryDSL의 타입 안정성
Querydsl의 핵심 원칙은 타입 안정성(Type safety) 이다. 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입을 이용해서 쿼리를 작성하게 된다. 또한, 완전히 타입에 안전한 방법으로 함수/메서드 호출이 이루어진다.
QueryDSL은 개발자가 직접 SQL문을 작성하지 않고, Java 코드 기반의 빌더 API를 사용하여 타입 안전한 쿼리를 작성할 수 있도록 도와주는 프레임워크입니다. QClass는 정적 타입 기반으로 생성된 클래스로, 컴파일 시점에 타입 안정성을 보장하며, 쿼리 작성 과정에서 발생할 수 있는 오류를 최소화합니다. 또한 QClass는 엔티티 클래스에서 생성되며, 엔티티와 데이터베이스의 컬럼 이름을 기반으로 쿼리를 작성하기 때문에, 매핑할 프로퍼티 불일치로 인한 오류를 줄일 수 있습니다. 다만, 엔티티의 모든 필드와 데이터베이스 컬럼이 항상 정확히 매핑되어야 하므로, 매핑 설정이 잘못되었을 경우에는 문제가 발생할 수 있습니다.
MyBatis 타입 안정성
MyBatis는 어노테이션과 XML을 통해 쿼리를 작성하고 메서드를 통해 특정 타입의 객체를 반환하도록 할 수 있습니다. 하지만 XML로 작성을 하게 되면 정의한 resultType과 @Mapper 인터페이스의 메서드 반환형과의 타입이 일치하지 않는 문제가 있어 런타임 에러를 발생시킬 수 있습니다. 어노테이션만을 고집하여 쿼리를 작성한다면 XML보다 런타임 에러 발생 확률이 적을 수 있겠으나, 개발자가 작성한 쿼리의 결과 컬럼과 매핑할 클래스의 프로퍼티가 일치하지 않아 런타임 에러가 발생할 가능성도 있으므로 MyBatis는 타입 안정성이 떨어진다고 생각을 합니다.
MyBatis에서 타입 안정성을 높이는 방법
MyBatis Generator를 활용하면, SQL 쿼리와 매핑 객체를 자동 생성하여 타입 불일치 문제를 줄일 수 있습니다. 매핑 객체를 생성하거나 변환할 때 수동 매핑 대신 MapStruct와 같은 자동 매핑 도구를 사용하는 것도 런타임 오류 가능성을 줄일 수 있습니다. 테스트를 통해서 안정성을 높일 수도 있는데요. 결과 타입과 매핑이 정확한지 검증하는 통합 테스트를 추가로 작성하여 런타임 에러를 사전에 방지할 수 있습니다.
[MyBatis Generator]
MyBatis 프로젝트에서 제공하는 코드 생성 도구로 데이터베이스 테이블 스키마를 기반으로 MyBatis의 핵심 구성 요소인 Mapper 인터페이스, XML Mapper 파일, 도메인 객체(Java 모델 클래스)를 자동으로 생성하는 데 사용됩니다. 이를 통해 반복적인 코딩 작업을 줄이고 개발 생산성을 높일 수 있습니다.
데이터베이스 테이블에서 매핑되는 Java 클래스, SQL 매퍼(XML), 그리고 Mapper 인터페이스를 생성하며 초기 개발 단계에서 기본적인 CRUD 작업에 필요한 코드를 빠르게 생성합니다. 테이블 구조(컬럼 및 데이터 타입)를 기반으로 Java 객체를 생성하며 resultType과 매핑을 자동으로 처리하여 기본적인 타입 불일치 문제를 방지합니다. XML 설정 파일을 통해 생성될 코드의 패키지 구조, 대상 테이블, 매핑 전략등을 세부적으로 지정이 가능합니다. 테이블 스키마가 변경되면 새로운 코드 생성을 통해 기존 매핑 클래스를 쉽게 업데이트할 수 있습니다.
[MapStruct]
Java 애플리케이션에서 객체 간 매핑(예: DTO와 엔티티 간 변환)을 간편하고 효율적으로 처리할 수 있도록 설계된 Java 기반 매핑 프레임워크입니다. 컴파일 타임에 매핑 코드를 자동으로 생성하기 때문에 런타임 성능이 뛰어나고 타입 안정성을 보장하는 것이 특징입니다.
매핑 로직이 컴파일 타임에 생성되므로 런타임 오버헤드가 적고, 빠른 성능을 제공합니다. 잘못된 매핑이 있을 경우 컴파일 시점에 오류를 감지합니다. @Mapper, @Mapping과 같은 간단한 애노테이션을 사용해 매핑 설정을 정의하며, @Mapper에 componentModel = "spring" 옵션을 추가하면 Spring Bean으로 등록되어 의존성 주입에 사용할 수 있습니다. 필드 이름이 동일하면 자동으로 매핑되며 필요한 경우 특정 필드에 대해 커스텀 매핑을 설정할 수 있습니다.
JdbcTemplate 타입 안정성
JdbcTemplate으로 Select 쿼리를 작성하면, RowMapper를 사용하여 ResultSet 데이터를 엔티티 클래스에 매핑하는 로직을 작성할 수 있습니다. 매핑 로직을 Java 코드로 작성하면 컴파일 시점에 일부 예외를 감지할 수 있으므로 일정 수준의 타입 안정성이 보장됩니다. 하지만 다음과 같은 상황에서는 타입 안정성에 대한 위험이 존재합니다.
- 반환형을 잘못 지정한 경우(예: queryForObject 메서드에서 반환 타입이 실제 결과와 일치하지 않을 때)
- SQL 쿼리에서 반환되는 컬럼 이름이 엔티티 클래스의 필드와 정확히 매핑되지 않을 때
- SQL 결과가 null을 포함하거나, 매핑하려는 데이터 타입과 엔티티 필드 타입이 호환되지 않을 때
이러한 이유로 JdbcTemplate의 타입 안정성은 기본적으로 컴파일 시점에 일부 보장되지만, 런타임에 발생할 수 잇는 매핑 오류를 완전히 방지하는 못하므로 SQL 쿼리와 엔티티 클래스 간의 정확한 매핑 확인이 중요합니다.
Reference URIs
http://querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/
GPT
'[개발] 프레임워크 > Spring' 카테고리의 다른 글
build.gradle 파일 문법에 대해서 알아보자. (1) | 2024.10.22 |
---|---|
MyBatis useGeneratedKeys 조심히 사용하기 (0) | 2024.10.07 |
Spring에서 SSE(Server-Sent Event) 구현하기 (2) | 2024.09.08 |
Postman에서 카카오 OAuth AccessToken 발급 받기 (0) | 2024.09.08 |
Security 설정으로 static 파일 허용 (0) | 2024.08.20 |