Spring JPA 공부

정렬 인프런 강의에서 나온 예시는 회원 정렬 순서 1. 회원 나이 내림차순(desc) 2. 회원 이름 올림차순(asc) 단 2에서 회원 이름이 없으면 마지막에 출력(nulls last) 이 예시를 Querydsl로 짜 볼 것이다. @Test public void sort() throws Exception { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); // when List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), ..
기본 Q-Type 활용 Q클래스 인스턴스를 사용하는 2가지 방법 QMember qMember = new QMember("m"); //별칭 직접 지정 QMember qMember = QMember.member; //기본 인스턴스 사용 이렇게 2가지 방법이 있습니다. 하지만 이것보다 더 간편하게 사용할 수 있는 방법은 static import를 사용하는 것 입니다. 이렇게 static imprort로 사용할 수 있습니다. 쿼리를 보면 별칭으로 member1으로 되어있습니다. 이것은 default 값으로 Qmember에 설정되어 있습니다!! Querydsl을 실행하다가 JPQL 형식을 보고 싶으면 spring.jpa.properties.hibernate.use_sql_comments: true 이걸 appli..
JPQL JPQL은 지금까지 제가 사용한 형식입니다. 쿼리를 짜서 직접 실행하는 스타일입니다. @Test public void startJPQL() throws Exception { //member1을 찾아라. String qlString = "select m from Member m " + "where m.username = :username"; // when Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); //then assertThat(findMember.getUsername()).isEqualTo("member1"); } 이렇게 jpql로 ..
이번에 방학동안 프로젝트를 하면서 제일 큰 문제가 동적쿼리를 처리하는 부분이었습니다. 동적 쿼리는 주로 조건에 따라 WHERE 절의 일부가 필요한 경우나 정렬 순서를 동적으로 결정해야 하는 경우 등에 사용됩니다. 예를 들어, 사용자가 웹 애플리케이션에서 검색 조건을 입력한 경우, 그 조건에 따라 데이터베이스에 쿼리를 보내야 합니다. 이때 동적 쿼리를 사용하여 해당 조건을 반영한 쿼리를 생성하고 실행할 수 있습니다. 이 부분을 손쉽게 해결해 줄 수 있는게 Querydsl이라고 합니다. 그래서 김영한 강사님의 실전! Querydsl을 듣고 공부해보기로 했습니다!! Querydsl 세팅 저는 스프링부트 3.1.3 을 사용하였고 자바는 17을 사용했습니다. 스프링부트 3 이후는 Querydsl 세팅하는 법이 달..
Specifications(명세) 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원한다. 술어(predicate) 참 또는 거짓으로 평가한다. AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성한다. (컴포지트 패턴) 스프링 데이터 JPA는 org.springframework.data.jpa.domain.Specification 클래스로 정의한다. 실무에서는 JPA Criteria를 거의 사용하지 않고 QueryDsl을 사용한다고 한다! Query By Example @SpringBootTest @Transactional public class QueryByExampleTest { @Autowired MemberRepository memberRepos..
스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체는 org.springframework.data.jpa.repository.support.SimpleJpaRepository 이다. @Repository 적용 JPA 예외를 스프링이 추상화한 예외로 변환한다. JDBC를 JPA로 바꿔도 예외를 처리하는 매커니즘이 동일하다. @Transactional 트랜잭션 적용 JPA의 모든 변경은 트랜잭션 안에서 동작한다. 스프링 데이터 JPA는 변경(등록, 수정, 삭제) 메서드를 트랜잭션 처리한다. 서비스 계층에서 트랜잭션을 시작하지 않으면 리파지토리에서 트랜잭션 시작한다. 서비스 계층에서 트랜잭션을 시작하면 리파지토리는 해당 트랜잭션을 전파 받아서 사용한다. 그래서 스프링 데..
사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성한다. 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다. MemberRepositoryCustom public interface MemberRepositoryCustom { List findMemberCustom(); } MemberRepositoryImpl @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom{ private final EntityManager em; @Override public List findMemberCustom() ..
저번 기본 편에서 연관된 다른 엔티티에 내용을 조회할 때 문제가 있었다. 실무에서는 모든 내용이 Lazy 로딩으로 되어 있어야 한다. 그 상태에서 연관된 다른 엔티티를 조회할 경우 프락시로 저장되어 있다. 그래서 그 엔티티 내용을 다시 조회할 때면 쿼리가 또 나가게 된다. 결국 N+1 문제가 발생한다. 이것을 해결한 것이 fetch join이다. fetch join은 연관된 엔티티도 조회할 때 클래스로 가지고 온다. 즉, N+1 문제가 해결되고 한방 쿼리로 모든 것을 가져오게 된다. 하지만 스프링 데이터 JPA에서 사용할려면 Query문을 새로 추가해 줘야 하고 매번 fetch join을 써줘야 한다. 그래서 스프링 데이터 JPA에서 지원해주는 것이 @EntityGraph 이다. EntityGraph 사..
Wooooong!!
'Spring JPA 공부' 카테고리의 글 목록