JPA

2020-07-08
해당 코드는 Github 에서 확인할 수 있습니다. JPA + Querydsl group_concat 사용법 Querydsl 기반으로 작업하다 보면 sql 함수가 필요한 경우가 있습니다. 대표적으로 sum(), max() 등이 있고 해당 함수는 Querydsl 자체에서 지원해 주고 있습니다. 하지만 group_concat 과 같은 함수를 사용하기 위해서는 별도의 설정이 필요합니다. 본 포스팅의 내용은 Mysql 환경에서 JPA + Querydsl 조합에서 group_concat 을 사용하는 방법을 정리한 것입니다. Mysql 환경에서 group_concat 을 사용하기 위해서 별다른 설정 없이...
2020-02-29
최근 JPA를 3년 가까이 사용하면서 개인적인으로 선호하는 패턴들을 한 번 정리하려고 한다. 어디까지 개인적으로 선호하는 패턴으로 굳이 이런 가이드를 따르지 않아도 된다. 컬럼 에노테이션 사용 칼럼 에노테이션과 멤버 필명이 동일한 경우 칼럼에노테이션을 생략하는 경우도 있다. 그래서 일치하지 않은 것들만 작성하는 방법도 있지만 나는 모든 멤버 필드에 칼럼 에노테이션을 작성하는 패턴을 선호한다. 칼럼 에노테이션을 통해 nullable , unique ,...
2020-02-04
JPA Bulk 작업을 진행할 때 영속성 컨텍스트의 메커니즘을 이해하지 못한 상태라면 예상하지 못한 문제를 만날 수도 있게 됩니다. 어떤 문제가 있고 이 문제가 왜 발생하는지 정리해 보았습니다. 코드 코드는 간단합니다. team_1 , team_2 ... team_10 을 저장하고 query dsl update를 이용해서 team name 을 none name 으로 변경하는 것입니다. 그리고 변경 제대로 변경이 되었는지 확인하는 확인하는 반복문이 있습니다. 로그를 보면 team name 1 ~ 10까지 제대로 출력되는 것을 확인할 수 있습니다....
2020-01-28
엔티티 객체 엔티티 관계는 위와 같습니다. 테스트 코드 teamA 를 영속화 이후, member1 , member2 를 영속화를 진행합니다. member1 , member2 는 teamA 소속이 됩니다. 그리고 fetch join 통해서 teamA 와 teamA 에 속한 member 를 조회하고 있습니다. 그리고 then 절에서 member1 , member2 가 teamA 에 있는지 검증을 진행합니다. 이 테스트 코드는 실패합니다. 디버깅 모드로 보면 memebers szie가 0인 것을 확인할 수 있습니다. 그렇다면 실제 데이터베이에 member1 , member2 가 영속화가 안 된 것일 까요?...
2019-11-03
해당 코드는 Github 를 확인할 수 있습니다. JPA를 사용하다면 보면 N+1문제를 많이 만나게 됩니다. 그에 따른 발생 원인과 해결법을 정리해보았습니다 ERD 위 엔티티 처럼 멤버 <-> 주문 관계를 기준으로 살명드리겠습니다. 발생 케이스 즉시로딩 N+1 fetch = FetchType.EAGER 전략을 즉시 로딩으로 가져가면 N+1 문제가 발생합니다. 지연로딩과 N+1 fetch = FetchType.LAZY 설정으로 LAZY 로딩을 하면 N+1 문제는 발생하지 않습니다. 위처럼 한 명의 member를 조회했기 때문에 해당 memeber의 order를 위 와 같은 SQL로 조회합니다....
2019-09-10
비동기 메시지를 사용하여 상호 간에 통신하는 방식을 메시징 Messaging[1] 이라고 부른다. 마이크로서비스 환경에서 비동기 처리 시 보통 카프카 Kafka 나 래빗엠큐 RabbitMQ 같은 메시지 브로커 Message Broker 를 사용하여 메시징을 구현한다. 아래와 같이 마이크로서비스들이 메시징을 통해 협업하여 주문을 처리한다고 가정해보자. OrderService는 주문 상태 이벤트(예. ORDER_CREATED, ORDER_CANCELLED 등)를 메시지 브로커에 발행하고 이벤트에 관심 있는 서비스가 구독하여 처리한다. 주문 상태 이벤트의 발행은 두 가지로 구분할 수 있다....
2019-08-30
엔터티 클래스 이름으로 일반적으로 많이 사용하는 Order나 Group으로 만들 때가 있다. 하이버네이트 Hibernate 는 JPA 엔터티를 기준으로 데이터베이스 스키마를 자동 생성해 주는 기능 을 제공한다. 개발 초기에는 스키마가 자주 변경되기 때문에 이 기능을 사용하면 매우 편리하다.(설정값에 따라 테이블을 DROP 하기도 하니 사용 시 주의 필요) 하이버네이트는 스키마를 자동으로 생성할 때 기본적으로 엔터티 클래스 이름을 사용한다. 이때 클래스 이름이 데이터베이스 키워드/예약어(예. ORDER, GROUP, SELECT, WHERE 등)와 동일한 경우 스키마 생성에 실패한다....
2019-08-26
먼저 아래와 같은 객체 모델이 있다고 가정해 보자. 하나의 Order(주문)는 여러 개의 LineItem(주문 품목) 가지고 각 LineItem은 하나의 Product(상품)에 의존한다. [caption id="attachment_23384" align="alignnone" width="500"] 객체 모델[/caption] 특정 상품이 포함된 주문 목록은 어떻게 조회할 수 있을까? 가장 쉬운 방법은 객체 연관관계를 사용하는 것이다. 객체 그래프 탐색이라고 부르는 방식인데 Order 목록을 가져와 반복문을 돌려 LineItem이 특정 상품인지 확인하는 것이다. 당연히 이 방식은 Order가 많으면 많을수록 성능이 문제가 된다. 이런 문제를 해결하기 위해...
2019-06-20
해당 코드는 Github 를 확인해주세요. JpaRepository의 쿼리 메서드를 통해서 간단한 쿼리들을 아래 예제 처럼 쉽게 만들수 있습니다. 유사한 쿼리가 필요해지면 쿼리 메서드를 지속적으로 추가해야 하는 단점이 있습니다. 이런 경우에 QuerydslPredicateExecutor 를 사용하면 매우 효과적입니다. QuerydslPredicateExecutor QuerydslPredicateExecutor 코드의 일부입니다. Predicate 를 매개변수로 받고 있기 때문에 Predicate를 통해서 새로운 쿼리를 만들수 있습니다. AccountRepository 적용하기...
2019-06-18
JPA Java Persistence API 로 애그리게잇 을 구현할 때면 흔히 루트 엔터티(전역 식별성을 지니며 주체로 쓰이는 엔터티)에 연관 엔터티 컬렉션을 매핑한다. 때때로 루트 엔터티는 연관 엔터티 컬렉션의 카운트를 제공해야 하는 경우가 있는데 여기서 성능 문제가 발생할 수 있다. 이 글은 연관 엔터티 컬렉션의 카운트를 구할 때 발생할 수 있는 성능 문제를 알아보고 이를 개선해 가는 과정을 소개한다. 부서 목록을 보여주는 화면 부서 목록과 함께 직원 수와 프로젝트 수를 보여주는 화면을 만든다고 가정해 보자....
더보기