본문 바로가기

데이터 접근 기술39

Kotlin, Querydsl 설정 목표 Spring Boot, kotlin, Gradle 7.x.x 환경에서 Querydsl을 사용하기 위한 설정을 진행한다. * tip : 프로젝트의 gradle 버전은 project_root/gradle/wrapper/gradle-wrapper.properties에서 확인 가능하다 1. build.gradle Plugins 추가 plugins { id 'org.springframework.boot' version '2.6.8' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.jetbrains.kotlin.jvm' version '1.8.22' id 'org.jetbrains.kotlin.plugin.jpa' .. 2023. 7. 8.
@Converter, Enum Enum은 열거형이라고 불리는 데이터 유형입니다. 고정된 상수 집합을 하나의 클래스처럼 다룰 수 있기에 빈번하게 사용됩니다. JPA는 enum을 지원하며 데이터베이스에 열거형 상수를 저장하고 조회할 수 있도록 지원합니다. 일반적으로 JPA에서 enum을 매핑하기 위해 @Enumerated 애노테이션을 사용하여 매핑합니다. 혹은 @Converter를 활용합니다. Java @Entity public class Book { // ... @Enumerated(EnumType.STRING) private BookType type; // ... } Kotlin @Entity class Book constructor( ... @Convert(converter = BookTypeConvertor::class) val .. 2023. 7. 7.
Querydsl Projections Querydsl에서 Projections을 많이 사용한다. 왜 많이 사용할까? 그 대답은 성능과 직결되기 때문이다. 서버는 사용자의 요청에 응답을 해주어야 한다. 이 과정이 만약에 데이터베이스와 연결되어 있다면 데이터의 크기를 줄이는 작업 매우 큰 서비스에서는 성능과 직결될 수 있다. 또한 클라우드를 사용하는 추세에 응답에 대한 트래픽에 대한 요금이 부과되기 때문에 무작정 모든 데이터를 끌어올려서 메모리에 넣어 매우 큰 데이터를 가공하여 응답하면 금전적으로도 손실이 발생하기 때문이다. 프로그래밍적으로도 깔끔함을 유지할 수 있는 좋은 수단이 된다. 요즘은 아키텍처의 각 Layer 간 결합도를 낮추기 위해 여러 가지 방법들이 동원된다. 이 중 Projections을 사용하면 ui, service, repos.. 2023. 2. 9.
OneToOne 연관관계에 대한 고민. 1:1 관계를 풀어내기 위해 엔티티 간의 연관관계를 설정했을 때 보통 둘 중 하나의 엔티티가 연관관계의 주인이 된다. 하지만 이러한 매핑은 효율적이지 않다. 자식 테이블은 별도의 PK가 존재하고, FK 칼럼도 존재하게 된다. 엔티티는 부모와 자식이 단 하나의 관계만 갖기때문에, 부모의 PK를 미러링 하는 것이 더 나은 선택이 될 수 있다. 이 방법에는 자식 테이블의 PK 값이 곧 FK값이 된다. 그리고 두 개의 테이블은 PK를 공유하게 된다. PK와 FK 칼럼은 자주 인덱스를 생성하게 됩니다. 위와 같은 설정은 저장공간을 절반으로 감소시킵니다. 이는 인덱스 스캐닝의 속도 향상을 하기 원한다면 매우 바람직한 방법입니다. 단방향의 @OneToOne 관계는 fetch 전략을 Lazy 하게 가져올 수 있습니다... 2023. 2. 9.
Querydsl 기본(3) Lazy의 연관관계를 fetch로 가져오는 방법을 Querydsl을 활용해 가져와보자. fetch join은 성능 최적화를 위해 연관된 엔티티를 동시에 조회하기 위해 많이 사용한다. 하지만 일대다 관계가 많아질수록 이는 행의 수가 중복돼서 생성되기 때문에 Set이나 distinct를 통한 중복을 제거해 주는 별도의 방법이 필요했다. 보통 일대다 관계가 연속적으로 필요한 경우 batch size를 통해 성능 최적화를 진행했다. 나는 여기서 한 가지 궁금증이 생겼다. fetch join을 사용할 때 만약 연관관계에 있는 특정 필드를 꺼내서 전달하려는 목적을 가졌을 때는 Projections을 최대한으로 활용하고 연관관계를 통해 변경을 가하도록 영향을 주는 비즈니스 로직이 있을 때 fetch join을 사용하.. 2023. 2. 7.
Querydsl 기본(2) 우선 기본적인 정렬이다. List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) .fetch(); orderBy 인자는 OrderSpecifier 타입을 받는다. 이 중에 nullsLast()와 nullsFirst()를 사용했을 때 SQL문이 궁금했다. select member0_."member_id" as member_i1_0_, member0_."age" as age2_0_, member0_."team_id" as team_id4_0_, member0_."username" as username3_0_ from "m.. 2023. 2. 6.
QueryDSL 적용 방법 알아보기. Querydsl은 많은 프로젝트에 검증받은 프레임워크다. jpql을 래핑 하여 사용한다는 점에서 jpql의 한계를 우회하기 위해 성능 악화에 영향을 주는 기능도 있는 것으로 보인다. 추가적으로 Querydsl을 적용하는 방법도 다양하기 때문에 여러 가지 방법을 알아보고 적합한 방법으로 적용하는 것도 필요하다. 우선 어떤 방식으로 적용할 것인지 어떤 방법이 있는지 알아보려고 한다. Spring Data JPA 공식문서에 있는 Querydsl Extension을 알아보자. 해당 섹션에서는 QuerydslPredicateExecutor 를 통해 조회조건을 통해 검색할 수 있는 방법을 지원한다고 한다. public interface QuerydslPredicateExecutor { Optional findByI.. 2023. 2. 6.
[Querydsl] 기본 공식문서를 읽기 전에 학습 테스트를 만들면서 간단하게 사용해 보자. JPQL @Test public void startJPQL() throws Exception { Member result = em.createQuery("select m from Member m where m.username = :username", Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(result.getUsername()).isEqualTo("member1"); } Querydsl @Test public void startQuerydsl() throws Exception { JPAQueryFactory queryFactory =.. 2023. 2. 1.
Hibernate Best Practices Thorben Janssen Home - Thorben Janssen Thrive Leads Shortcode could not be rendered, please check it in Thrive Leads Section! As seen at: Bring your Java persistence skills to the next… thorben-janssen.com JPA와 Hibernate에 대해서 조금 더 알아야 할 것 같아서 best practices의 글을 읽으면서 정리하고 공부하는 시간을 가졌다. Use a projection that fits your use case Projection은 쿼리의 검색 결과에서 반환되는 속성을 제한하는 기능을 말합니다. 즉 하나의 엔티티를 조회할 때 모든 속성을.. 2023. 2. 1.
Hibernate 5 Bootstrapping API 오늘은 Hibernate 5.0에서 재설계된 Bootstrapping API를 알아보자. BootStrapping이란 용어는 소프트웨어 컴포넌트의 초기화 과정과 시작을 의미한다. Hibernate에서는 JPA를 위한 완벽한 구성을 위해 SessionFactory의 instance 혹은 EntityManagerFactory instace를 빌딩 하는 과정을 이야기한다. 또한 부트스트랩 프로세스 중에 Hibernate 동작을 커스텀할 수도 있다. 즉 SessionFactory를 빌딩 한다는 것은 시작 및 런타임 동안 Hibernate가 필요로 하는 서비스를 가지고 있는 ServiceRegistry 구현을 가지도록 하는 것입니다. 그렇기 때문에 ServiceRegistry에서 애플리케이션의 도메인 모델과 데이.. 2023. 2. 1.