본문 바로가기
Blog/TIL

2025-03-10 (월)

by 코젼 2025. 3. 10.
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

댓글