목록JPA (15)
DevKim
[ 기본 검색 조건 ] 검색 조건은 .and() .or()를 매서드 체인으로 연결할 수 있다. queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) .fetchOne(); where문의 경우 ','로 연결해도 모두 and로 인식해주기 때문에 아래와 같이 사용해된다고한다. queryFactory .selectFrom(member) .where(member.username.eq("member1"), member.age.eq(10)) .fetchOne(); JPQL이 제공하는 모든 검색 조건 제공한다. 1. == & null 여부 .eq("member1") .ne("member1") //== ...
QueryDSL이란? SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API JPA 크리테이라에 비해서 편리하고 실용적이다 SQL, JPQL의 문제점 SQL, JPQL은 문자열이다. Type-check가 불가능하다. 잘 해봐야 애플리케이션 로딩 시점에 알 수 있다. 컴파일 시점에 알 수 있는 방법이 없다. 해당 로직 실행 전까지 작동여부 확인을 할 수 없다. 해당 쿼리 '실행 시점'에 오류를 발견한다. QueryDSL 장점 문자가 아닌 코드로 작성할 수 있다. 컴파일 시점에 문법 오류를 발견할 수 있다. 코드 자동완성(IDE 도움) 단순하고 쉽다. 코드 모양이 JPQL과 거의 비슷하다 동적 쿼리 QueryDSL - 동작원리 쿼리타입 생성 Member.java @Entity를 가지고, QMemb..
[ 벌크성 수정 쿼리 ] - 모든 멤버의 나이를 1씩 증가시켜줘 ! 할때 쿼리 한번으로 쭉 1씩 더해주는게 효율적일 때 벌크연산을 한다. ※ 주의 ※ 벌크성 수정,삭제 쿼리는 @Modifying 어노테이션을 꼭 넣어주어야하고, 만약 벌크 쿼리를 날린 후, 다시 조회해야한다면 꼭!! 영속성 컨텍스트를 초기화 해주어야한다. ** 벌크 연산은 영속성 컨텍스트를 무시하고 직빵으로 DB에 반영하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 있는 엔티티의 상태가 달라질 수 있다. ** ※ 권장 방안 ※ 1. 영속성 컨텍스트를 clear해준 후 엔티티가 없는 상태에서 벌크 연산을 먼저 수행한다. 2. 부득이하게 영속성 컨텍스트에 엔티티가 있으면, 벌크 연산 직후 영속성 컨텍스트를 초기화한다. -> @Mo..
실무에선, Total Count 쿼리 때문에 성능이 안나오는 경우도 있기 때문에,Page 쓰는걸 고려해봐야한다고 한다. 성능 테스트해보고 성능 안나오면 count 쿼리를 분리해보자! total count 쿼리는 어쨌든 DB에 있는 모든 데이터를 카운트해야하므로 매우 무겁다. member와 team이 양방향 연관관계가 걸려있는 상황일 때, member를 가져올 때, 어쨌든 데이터를 쿼리하는건 team을 같이 조인해서 가져와야한다. @Query(value = "select m from Member m left join m.team t") Page findPageByAge(int age,Pageable pageable); 다음을 실행시키면 이런 쿼리로그를 볼 수 있다. select 쿼리에서 jo..
[ 페이징과 정렬 ] 반환 타입에 따라 Total count 쿼리를 날릴지 안 날릴지가 결정이 된다. 반환 타입이 Page 일 때 * Count 쿼리 사용 * ✔ pageRequest에 원하는 정보 넣고 만들어서 넘겨준 뒤, interface에서 Pageable로 받으면 끝이다. ✔ PageRequest.of ( 찾을 페이지, 한 페이지의 사이즈, Sort 조건 ) -> Sort 조건은 생략가능 ✔ page안에 많은 메서드가 제공된다. [Interface] Page findByAge(int age, Pageable pageable); [Test] @Test public void page() throws Exception{ //given memberRepository.save(new Member("mwmb..
실습을 위해 간단한 일대다 양방향 매핑을 걸어준 Member 와 Team 엔티티를 생성하였고 JPA Repository와 DataJPA Repository를 각각 작성하여 각각의 테스트 코드를 작성해보았다. JPA에서는 엔티티매니저 불러와서 persist해주고 조회시 쿼리 만들어서 조회하고.. Data JPA는 인터페이스 하나로 마무리된다는게 아직도 신기한 일이다. 다른건 생략하고, 한가지 다시 짚고 넘어가야 할 점이 있었다. 여기서 equals를 따로 override 안했기 때문에, 현재 isEqualTo에는 기본적으로 == 비교를 하게 되어있다. 이때 findMember와 member 가 같다고 나오는데, 이는 JPA 특성상 같은 트렌젝션 안에서는 영속성 컨텍스트의 동일성을 보장하기 때문이다. @Sp..
SQL은 DB 테이블을 대상으로 쿼리를 하지만, JPQL은 엔티티 객체를 대상으로 검색하는 객체 지향 쿼리이다. 어차피 결국 JPQL은 SQL로 변환되기 때문이어서 그런지, SQL이랑 문법은 거의 비슷한 것 같다. String jpql="select m from Member as m where m.username like '%kim%'" em.createQuery(jpql,Member.class) .getResultList(); JPQL은 단순 문자열이므로, 동적 쿼리를 만들거나 할 때는 QueryDSL이 더 유용하다. QueryDSL은 문자가 아닌 자바코드로 JPQL을 작성할 수 있으므로 컴파일 시점에 문법 오류를 찾을 수 있다는 장점이 있다. JPQL 문법을 먼저 정리하고, 메뉴얼보고 QueryDSL..
JPA의 데이터 타입은 엔티티 타입/ 값 타입으로 나뉜다. [ 엔티티 타입 ] - @Entity로 정의하는 객체이며, 데이터가 변해도 식별자로 지속해서 추적가능하다. [ 값 타입 ] - int,String 처럼 단순히 값으로 사용하는 자바 기본 타입/객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가하다. 값 타입은 기본값 타입, 임베디드 타입, 컬렉션 값 타입으로 나뉜다. 기본 값 타입 - 자바 기본 타입(int,double) , 래퍼 클래스(Integer,Long), String 이있다. - 생명주기를 엔티티에 의존하며, 값 타입은 공유하면 안되고 공유되지도 않는다. - 기본 타입은 공유가 안되고 항상 값을 복사한다. (a=b 이면 a에 b의 값이 복사됨 -> 두개는 다른 것) - 래퍼 클래스는 ..