Projection
2024. 6. 20. 21:17ㆍTIL
✔오늘 배운 중요한 🔑 point
- Spring Data는 Repository 인터페이스를 확장한 인터페이스를 찾고 빈으로 등록을 해주는데 JpaRepository가 Repository 인터페이스를 상속받는 형태이다.
- JPA와 QueryDSL을 함께 사용함으로써 JPA의 간편한 매핑 기능과 QueryDSL의 유연한 쿼리작성을 모두 활용할 수 있다
- Projection을 통해 데이터를 조회한다는 것은 반환 자료형으로 Entity가 아닌 특정 필드만 선택하여 반환하는것을 의미하기 때문에 반환값이DTO나 특정 필드만 포함한 인터페이스가 된다.
🎯 오늘 배운 내용
Jpa와 QueryDSL을 같이 사용하는 이유?
QueryDSL은 JPA 쿼리를 더 안전하고 효율적으로 작성할 수 있게 도와주기 때문에 JPA와 QueryDSL을 같이 사용하면 쿼리의 안성성과 가독성을 높이고 복잡한 쿼리를 보다 쉽게 관리할 수 있게 된다.
Spring Data JPA Repository 작동 방식
JpaRepository는 PagingAndSortingRepository를 상속하고 CrudRepository를 상속하고 Repository를 상속하는 식의 상속관계이다
Spring Data는 Repository 인터페이스를 확장한 모든 인터페이스를 찾고 해당 인터페이스의 인스턴스를 만들어서 Spring Bean으로 등록을 해준다
따라서 우리가 JpaRepository를 상속받기만 해도 편하게 사용할 수 있었던 것이다
JPA + QueryDSL 을 사용할 때의 구조
@Repository
interface MemberRepository : JpaRepository<Member, Long>, MemberQueryDslRepository {
}
interface MemberQueryDslRepository {
fun findByEmail(email: String): Member?
}
// 필수!! 꼭 "인터페이스 이름 + Impl" 으로 클래스명을 명시해야한다.
// 그래야 Spring Data JPA 가 Repository Bean 을 생성할 때 이 코드를 해당 인스턴스에 주입해준다.
class MemberQueryDslRepositoryImpl(
private val queryFactory: JPAQueryFactory
) : MemberQueryDslRepository {
private val member: QMember = QMember.member
fun findByEmail(email: String): Member? {
return queryFactory.selectFrom(member)
.where(member.email.eq(member))
.fetchOne()
}
}
Projection이란?
데이터베이스에서 테이블을 출력할때 특정 필드만 선택하여 조회하는것
왜 Projection을 사용할까?
필요한 데이터만 가져옴으로써 성능 최적화와 네트워크 사용량 감소에 도움이 되기 때문이다
JPA Repository에서 Projection을 구현하는 방법
Entity
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
@Entity
data class Member(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
val email: String,
val nickname: String
)
Projection Interface
interface SimpleMemberProjection {
val email: String
val nickname: String
}
Repository
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param
import org.springframework.stereotype.Repository
@Repository
interface MemberRepository : JpaRepository<Member, Long> {
// Projection을 사용한 쿼리 메서드
@Query("SELECT m.email AS email, m.nickname AS nickname FROM Member m WHERE m.email = :email")
fun findSimpleMemberByEmail(@Param("email") email: String): SimpleMemberProjection?
}
Projection을 통해 데이터를 조회한다는 것은 반환 자료형으로 Entity가 아닌 특정 필드만 선택하여 반환하는것을 의미하기 때문에 반환값이 DTO 나 특정 필드만 포함한 인터페이스가 된다.
🤔 어떻게 활용할까?
JPA에서 Projection을 사용하면 특정 엔티티의 일부 속성만을 선택적으로 조회할 수 있기 때문에 성능 최적화, 데이터 전송량 감소, 복잡한 쿼리 작성 등 다양한 이점을 제공한다.
📓 오늘의 한줄
"Taking time to do nothing often brings everything into perspective."
- Doe Zantamata -
'TIL' 카테고리의 다른 글
@DataJpaTest 를 이용한 통합 테스트 코드 작성하기 (0) | 2024.06.22 |
---|---|
@DataJpaTest를 이용해서 단위 테스트 코드 작성하기 (0) | 2024.06.21 |
영속성 컨텍스트 (0) | 2024.06.19 |
팀프로젝트 게임 채널 관리 앱 (회고) (0) | 2024.06.18 |
팀프로젝트 게임 채널 관리 앱 (5일차) (0) | 2024.06.17 |