김영한 #spring 16

[Querydsl] Querydsl 중급문법 3 (동적 쿼리 - where절 이용, 벌크 연산)

동적쿼리where 다중 파라미터 사용@Testpublic void dynamicQuery_WhereParam(){ String usernameParam = "member1"; Integer ageParam = 10; // 동적 쿼리로 이름이 member1이고 나이가 10살인 사람을 찾고 싶은 상황 List result = searchMember2(usernameParam,ageParam); Assertions.assertThat(result.size()).isEqualTo(1);} 동적 쿼리로 들어오는 이름과 나이 변수에 맞춰 다른 값을 리턴시켜보자. private List searchMember2(String usernameCond, Integer ageCond){ JP..

[Querydsl] Querydsl 중급문법 2 (@QueryProjection, 동적쿼리 - BooleanBuilder)

프로젝션 결과 반환 - @QueryProjection@Datapublic class MemberDto { private String username; private int age; public MemberDto(){} @QueryProjection public MemberDto(String username, int age) { this.username = username; this.age = age; }}우선 위의 방법을 사용하기 위해선 다음과 같이 생성자에 @QueryProjection 어노테이션을 적어주고 Q타입을 생성해줘야 한다. @Generated("com.querydsl.codegen.DefaultProjectionSerializer")p..

[Querydsl] Querydsl 중급문법 1 (프로젝션과 결과 반환 - Dto)

프로젝션과 결과 반환 - 기본프로젝션이란 select 대상을 지정하는 것을 프로젝션이라 한다. 프로젝션 대상이 하나인 경우@Testpublic void simpleProjection(){ JPAQueryFactory queryFactory = new JPAQueryFactory(em); List result = queryFactory.select(member.username) .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); }} 프로젝션 대상이 하나면 타입을 String과 같이 명확하게 지정할 수 있다. 만약 프로젝션 대상이 둘 이상이..

[Querydsl] Querydsl 기본문법 4 (on 절, 페치 조인, 서브쿼리)

on 절조인 대상 필터링예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 //jpql: select m,t from Member m left join m.team t on t.name = 'teamA'@Testpublic void join_filtering(){ JPAQueryFactory queryFactory = new JPAQueryFactory(em); List result = queryFactory.select(member, team) .from(member) .join(member.team) .on(team.name.eq("teamA")) .fetch(); for (..

[Querydsl] Querydsl 기본문법 2 (검색 조건, 결과 조회, 정렬, 페이징)

검색 조건 쿼리@Testpublic void search(){ Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) .fetchOne(); Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");} 우선 다음과 같이 테스트 코드를 작성해주었다. where절에서는 위와 같이 메소드 형식으로 and, or 을 비롯한 무수하게 많은 검색 조건을 제공한다. equal, not equalmemb..

[JPA] OSIV와 성능 최적화 (Open Session in View란?)

OSIV(Open Session In View) 란?OSIV란 영속성 컨텍스트를 View 영역까지 열어두는 기능이다.즉, View 레이어에서도 지연로딩과 같은 영속성 컨텍스트의 특징을 사용할 수 있다. Spring boot에서 OSIV는 default가 true기 때문에 따로 설정을 바꿔주지 않는 한 항상 실행된다. 데이터베이스 커넥션JPA는 언제 데이터베이스 커넥션을 가져오고 언제 커넥션을 반환할까? JPA에서 영속성 컨텍스트를 사용하기 위해선 당연히 데이터베이스 커넥션을 사용해야한다. 기본적으로 데이터베이스 트랜잭션을 시작할 때 영속성 컨텍스트가 데이터베이스 커넥션을 가져온다.다음과 같이 보통 Service 단에서 트랜잭션이 시작하니 위의 트랜잭션 코드가 실행될 때 데이터베이스 커넥션이 만들어지는 것..

spring/JPA 2024.08.27

[JPA] API 개발과 성능 최적화 3 (페이징과 한계 돌파)

컬렉션을 페치 조인하면 페이징이 불가능하다. 오더와 아이템이 일대다의 관계고, 현재 페치조인을 한 상태라고 생각해보자 우리는 페이징을한다면 오더를 기준으로 페이징을 해야한다. 그러나 데이터는 다(Many), 즉 Item을 기준으로 row가 생성된 상태다.  그러니 이 상황에서 페이징을 하면 오더가 기준이 아닌 Item이 기준이 된다. 이 경우 하이버네이트는 order를 기준으로 페이징을 하기 위해 경고 로그를 남기고 모든 DB 데이터를 읽어 메모리에서 페이징을 시도한다. 그러면 페치 조인 상황에서 페이징을 하려면 어떻게 해야할까? 해결 방법먼저 ToOne 관계의 모든 엔티티를 페치조인 한다. (ToOne 관계는 row 수를 증가시키지 않기 때문)컬렉션은 지연 로딩으로 조회한다.지연 로딩 성능 최적화를 위..

spring/JPA 2024.08.11