JPA
-
Querydsl로 동적쿼리 쉽게 작성하기JPA 2021. 3. 1. 19:48
JPA를 사용할 때 동적 쿼리를 작성하려면 정말 까다롭고 어렵다. 하지만 Querydsl을 사용하면 쉽고 간편하게 동적 쿼리를 작성할 수 있다. Querydsl의 장점은 자바처럼 SQL문을 작성할 수 있고, 문법 오류가 나면 컴파일 에러로 잡을 수 있기 때문에 정말 좋다. (보통의 SQL문은 런타임에 에러가 발생) Querydsl로 동적 쿼리를 작성하는 방법은 크게 두 가지가 있다. 1) Builder 적용 2) Where절 적용 Builder 적용 void dynamicQuery_BooleanBuilder() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List result = searchMember1(usern..
-
벌크 연산JPA 2021. 2. 28. 18:23
벌크 연산은 쿼리 한 번으로 대량의 데이터를 수정할 때 사용된다. 하지만 벌크 연산을 사용할 때 주의해야 할 점이 있다. 다음 쿼리를 보자 long count = queryFactory .update(member) .set(member.age, member.age.add(1)) .execute(); List result = queryFactory .selectFrom(member) .fetch(); for (Member member1 : result) { System.out.println("member1 = " + member1); } 모든 멤버의 나이를 1살 씩 더해주고, 멤버를 조회하였다. 쿼리 사용전 쿼리 사용후 그런데 쿼리를 날리기 전과 후의 차이가 없다? 여기가 바로 벌크 연산을 할 때 주의 해..
-
페치 조인(fetch join)JPA 2021. 2. 23. 20:41
페치 조인은 JPQL에서 성능 최적화를 위해 제공하는 기능이다. 보통 연관관계 매핑을 할 때 지연 로딩 전략을 많이 사용하게 되는데 페치 조인을 사용하게 되면 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 것이 가능하다. 사용방법 select m from Member m join fetch m.team Member와 Member에 연관된 team을 한 번에 조회하게 된다. 페치 조인은 X ToOne 관계에서 사용하면 정말 유용하게 사용할 수 있다. 하지만 X ToMany 관계에서는 함부로 페치 조인을 사용하면 안 된다. 예를 들어 위의 예시처럼 Member와 team이 OneToMany 관계라고 생각해보자. 여기서 컬렉션 페치 조인을 사용하면 Many를 기준으로 조인이 되기 때문에 데이터양이 예..
-
OSIV (Open Session In View)JPA 2021. 2. 22. 23:26
OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그런데 이 전략은 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 이것은 결국 장애로 이어진다. OSIV를 끄면 트랜잭션 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다. 따라서 커넥션 리소스를 낭비하지 않는다. OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다. 그렇다면 OSIV를 끈 상태로 복잡성 관리를 어떻게 하면 좋을까? 바로 Command와 Query를 분리하는 것이다. 보통 비즈니스 로직은 특정 엔티티 몇 개를 등록하거나 수정하는 ..