728x90
반응형
📌 오늘 배운 핵심 요약
✅ select, selectNew, selectFrom의 차이를 이해하고 적절한 상황에서 사용
✅ like와 containOrNull의 차이를 구분하여 null 안전성 고려
✅ EmbeddedId 내부 필드 접근 시 path(EmbeddedId, Field) 방식 활용
✅ JDSL과 JPQL의 차이점을 비교하여 JDSL의 장점을 이해
✅ KProperty1, KFunction1을 활용하여 프로퍼티 및 메서드 참조하는 방법 숙지
✅ :: 연산자를 활용한 프로퍼티, 함수, 생성자 참조 활용법 학습
1️⃣ select, selectNew, selectFrom 차이점
JDSL에서 데이터를 조회할 때 사용하는 select, selectNew, selectFrom의 차이점을 정리하면 다음과 같다.
- select
- 엔티티 전체를 조회할 때 사용한다.
- 반환 타입은 지정된 엔티티 타입이다.
select(entity(EntityClass::class))
- selectNew
- 특정 필드만 선택하여 DTO로 매핑할 때 사용한다.
- 생성자로 전달할 필드를 지정해야 한다.
selectNew<DTOClass>(
path(EntityClass::field1),
path(EntityClass::field2)
)
- selectFrom
- select(entity()) + from(entity())의 축약형이다.
- 코드 가독성을 높이기 위해 사용한다.
selectFrom(entity(EntityClass::class))
2️⃣ like 와 containOrNull 차이점
- like
- SQL의 LIKE 연산자를 그대로 활용하는 방식이다.
- % 기호를 직접 사용하여 패턴을 지정해야 한다.
path(EntityClass::name).like("%searchTerm%")
- containOrNull
- like와 유사하지만, null을 안전하게 처리할 수 있도록 래핑한 메서드이다.
- null 입력 시 WHERE 절에 포함되지 않도록 한다.
path(EntityClass::name).containOrNull("searchTerm")
3️⃣ JDSL에서 EmbeddedId 내부 필드 가져오기
JDSL을 사용할 때, EmbeddedId 내부 필드에 접근하는 방법은 두 가지가 있다.
✔ path(EmbeddedId, Field) 방식
- EmbeddedId 자체를 경로로 가져오고, 그 내부 필드를 다시 경로로 지정하는 방법
path(EntityClass::embeddedId)
.path(EmbeddedIdClass::field)
✔ path(EmbeddedId::field) 방식
- EmbeddedId 내부의 특정 필드에 직접 접근하는 방식
path(EntityClass::embeddedId, EmbeddedIdClass::field)
이 방식을 사용하면 복합키(Composite Key)를 활용한 JOIN이나 WHERE 절을 쉽게 적용할 수 있다.
4️⃣ JDSL vs JPQL
비교 항목 JDSL (Java/Kotlin DSL for JPQL) JPQL (Java Persistence Query Language)
문법 | Kotlin DSL을 활용한 함수형 문법 | SQL과 유사한 문자열 기반 문법 |
타입 안정성 | 컴파일 타임에 오류를 잡을 수 있음 | 문자열 기반이라 런타임에서 오류 발생 가능 |
가독성 | 체이닝 방식으로 직관적 | SQL과 유사하지만 길어질 경우 가독성 저하 |
재사용성 | 쿼리 구성 요소를 조합하여 재사용 가능 | 문자열이므로 재사용성이 낮음 |
예제 | selectFrom(entity(EntityClass::class)).where(path(EntityClass::field).eq(value)) | SELECT e FROM EntityClass e WHERE e.field = :value |
5️⃣ KProperty1, KFunction1 차이점
✔ KProperty1<T, R> (프로퍼티 참조)
- Kotlin에서 프로퍼티(속성)를 참조하는 타입이다.
- className::propertyName 형태로 사용 가능하며, 엔티티 필드 접근 시 활용된다.
val prop: KProperty1<EntityClass, String> = EntityClass::name
println(prop.get(instance)) // instance.name 값을 가져옴
✔ KFunction1<T, R> (함수 참조)
- Kotlin에서 함수(메서드)를 참조하는 타입이다.
- className::functionName 형태로 사용 가능하며, 메서드 접근 시 활용된다.
val func: KFunction1<EntityClass, String> = EntityClass::methodName
println(func(instance)) // instance.methodName() 실행
6️⃣ :: (콜론 두 개) 연산자
Kotlin에서 ::는 참조 연산자로, 다음과 같이 사용된다.
✔ 프로퍼티 참조
val propRef = EntityClass::name
- name 프로퍼티를 참조하여 KProperty1 타입의 변수를 생성한다.
✔ 함수 참조
val funcRef = EntityClass::methodName
- methodName 함수를 참조하여 KFunction1 타입의 변수를 생성한다.
✔ 생성자 참조
val constructorRef = ::EntityClass
- EntityClass의 생성자를 참조하여 함수형 인터페이스나 람다로 활용 가능하다.
728x90
반응형
'Blog > TIL' 카테고리의 다른 글
2025-03-13 (목) (0) | 2025.03.13 |
---|---|
2025-03-11 (화) (1) | 2025.03.11 |
2025-03-07 (금) (2) | 2025.03.07 |
2025-03-06 (목) (0) | 2025.03.06 |
2025-03-05 (수) (0) | 2025.03.05 |
댓글