본문 바로가기

Spring

(77)
Querydsl- 조인 @Test public void join() throws Exception{ List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); for (Member m : result) { assertThat(m.getTeam().getName()).isEqualTo("teamA"); } } /** * 세타 조인 * 회원의 이름이 팀 이름과 같은 회원 조회 */ @Test public void theta_join() throws Exception{ // 세타조인 예제를 위한 엔티티 em.persist(new Member("teamA")); em.persist(new Mem..
Querydsl- 집합 @Test public void aggregation() { /* * JPQL * select * Count(m), * Sum(m.age), * Avg(m.age), * Max(m.age), * Min(m.age) * from Member m * */ // Tuple: 다양한 데이터 셋을 저장 가능 Tuple tuple = queryFactory .select( member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() ) .from(member) .fetchOne(); // Tuple의 데이터를 get() 메서드를 이용해서 조회가능 assertThat(tuple.get(member.count())).isEq..
Querydsl- 정렬과 페이징 예시 초기 조건 package study.querydsl; @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach //각 테스트마다 데이터 주입 public void each(){ queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); ..
Querydsl- Q 인스턴스 Q 인스턴스 사용법 2 가지 QMember member = new QMember("m") // 별칭 직접 지정 QMember member = QMember.member // 기본 인스턴스 사용 일반적으로 기본 인스턴스를 주로 사용한다. 기본 인스턴스와 static import를 사용하면 훨씬 sql 느낌이 나는 직관적인 코드를 작성할 수 있다. 예시 (기본 인스턴스 + static import) package study.querydsl; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.assertj.core.api.Assertions; import org.junit.jupiter.a..
Querydsl- Jpql과 Querydsl 비교 JpaQueryFactory public class QuerydslStudy{ @Autowired private EntityManager em; // JpaQueryFacotry 생성 JpaQueryFactory queryFactory = new JpaQueryFactory(em); 인자로 EntityManager를 받음 } 기본적으로 JPQL을 사용하기 위해서는 EntityManager가 필요한 것 처럼, Querydsl을 사용하기 위해서는 JpaQueryFacotry가 필요하다. JpaQueryFactory를 선언하기 위한 방법은 위와 같다. 테스트 코드로 JPQL과 Querydsl 비교하기 package study.querydsl; import com.querydsl.jpa.impl.JPAQuery..
Querydsl- build.gradle 설정 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '2.7.14' id 'io.spring.dependency-management' version '1.0.15.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } r..
JPA- Open Session In View OSIV 기본적으로 스프링 프로젝트를 실행하면, warn 로그가 뜨면서 spring.jpa.open-in-view : true 기본값이라고 알려준다. 기본적으로 OSIV 전략은 최초 데이터베이스 커넥션 시작 시점부터 View, API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Transactional public Long join(Member me..
JPA- DISTINCT DISTINCT join fetch로 컬렉션을 조인하여 조회하는 경우 동일 엔티티가 중복 조회되는 문제가 존재한다. 예를 들어 Team1이라는 엔티티에 Member엔티티 3개(member1, member2, member3)가 매핑 되어있다고 하자. 이때 " select t from Team t join fetch t.members where t.name = "TEAM1" "라는 jpql로 쿼리를 날리게 된다면 이는 sql로 " SELECT T.*, M.* FROM TEAM T JOIN MEMBER M ON T.MEMBER_ID = M.MEMBER_ID WHERE T.NAME = "TEAM1" "로 번역되어 조인된 테이블은 총 세개 row가 만들어질 것이다. 여기서 distinct 키워드를 추가하여 "se..