분류 전체보기 1341

Ch04. 확장 기능 - Web 확장(도메인 클래스 컨버터, 페이징과 정렬)

도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩 HTTP 요청은 회원 id를 받지만 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환 도메인 클래스 컨버터도 리파지토리를 사용해서 엔티티를 찾음 주의 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 한다. (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.) 페이징과 정렬 스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다. 파라미터로 Pageable 을 받을 수 있다. Pageable 은 인터페이스, 실제는 org.springframework.data.domain.PageRe..

Ch04. 확장 기능 - Auditing

엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? 등록일 수정일 등록자 수정자 JPA JPA에서 아래와 같은 이벤트 어노테이션을 활용한다. @PrePersist, @PostPersist @PreUpdate, @PostUpdate SpringDataJPA @Bean public AuditorAware auditorProvider() { return () -> Optional.of(UUID.randomUUID().toString()); } 등록자, 수정자를 처리해주는 AuditorAware 스프링 빈 등록 실무에서는 생성일, 수정일은 필요하지만 생성자, 수정자는 필요 없을 수도 있기 때문에 분리해서 만든다. @EntityListeners(AuditingEntityListener.class) ..

Ch04. 확장 기능 - 사용자 정의 리포지토리 구현

스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? JPA 직접 사용( EntityManager ) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 등등... Querydsl 사용 Custom interface 생성 규칙: 리포지토리 인터페이스 이름 + Impl 해당 규칙 말고 다른 이름으로 변경하고 싶다면 XML, JAVAConfig 설정을 하여 변경하면 된다. SpringDataJPA가 인식해서 스프링 빈으로 등록한다. 참고 실무에서는 주로 QueryDSL이나 SpringJdbcTe..

Ch03. 쿼리 메소드 기능 - JPA Hint, Lock

JPA HINT JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트) 조회만 동작시키는 쿼리지만, 더티 체크 기능을 동작시키기 위해 메모리에 원본 파일을 만들어야 한다(사용하지 않는 기능을 하기 위해 비용 낭비를 해야 된다) 하이버네이트는 이를 방지 하기 위에 JPA 쿼리 힌트를 제공한다. org.springframework.data.jpa.repository.QueryHints 어노테이션을 사용 Lock SpringDataJpa에서는 Lock 기능을 쉽게 사용이 가능하다(자세한 내용은 JPA 매뉴얼을 보자) JPA에서 제공하는 Lock 기능을 쉽게 사용 가능하다. org.springframework.data.jpa.repository.Lock 어노테이션을 사용

Ch03. 쿼리 메소드 기능 - @EntityGraph

연관된 엔티티들을 SQL 한 번에 조회하는 방법 JPA 연관된 객체를 Lazy로 설정 후 연관된 객체를 조회할 때마다 쿼리가 실행된다(LAZY) 이를 N +1 문제가 발생한다고 하는데 이를 해결하기 위해 fetch join을 활용하여 연관된 데이터를 모두 가지고 올 수 있다. SpringDataJPA Query JPQL를 직접 작성하여 FetchJoin한다. EntityGraph 사용 JPA 2.2 이상 버전부터 제공해 주는 기능이다. EntityGraph를 사용하여, FetchJoin을 사용하는 것처럼 엔티티 그래프를 조회할 수 있다. 앤티티에 NamedEntityGraph를 적어주면 이름으로 EntityGraph를 가지고 올 수 있다.

Ch03. 쿼리 메소드 기능 - 벌크성 수정 쿼리

JPA JPA의 더티 체크 기능을 사용하면, 단건 업데이트밖에 되지 않기 때문에 여러 건을 Update 하기 위해서는 벌크성 수정 쿼리를 동작시켜야 된다. 벌크 연산 같은 경우 조심해서 사용해야된다.(쿼리를 직접 동작) SpringDataJpa 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용 사용하지 않으면 다음 예외 발생 org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트 초기화: @Modifying(clearAutomatically = true) (이 옵션의 기본값은 false ) 벌크 연산을 진행 후 영속성 컨택스트와 DB을 데..

Ch03. 쿼리 메소드 기능 - SpringDataJPA 페이징과 정렬

순수 JPA 페이징과 정렬 검색 조건: 나이가 10살 정렬 조건: 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 SpringDataJPA 페이징과 정렬 페이징과 정렬 파라미터 org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) 두 가지 인터페이스로 페이징, 정렬 기능을 공통화시켜버렸다. @Test public void paging(){ //given memberRepository.save(new Member("member1",10)); memberRepository.save(new Member("member2",10)); memb..

Ch03. 쿼리 메소드 기능 - 반환 타입

스프링 데이터 JPA는 유연한 반환 타입 지원 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types Index of /spring-data/jpa/docs/current/reference docs.spring.io 조회 결과가 많거나 없으면? 컬렉션 결과 없음: 빈 컬렉션 반환 단건 조회 결과 없음: null 반환 결과가 2건 이상: javax.persistence.NonUniqueResultException 예외 발생 참고 단건으로 지정한 메서드를 호출하면 스프링 데이터 JPA는 내부에서 JPQL의 Query.getSingleResult() 메서드를 호출한다. 이 메서드를 호출했을 ..

Ch03. 쿼리 메소드 기능 - 파라미터 바인딩

위치 기반 select m from Member m where m.username = ?0 //위치 기반 이름 기반 select m from Member m where m.username = :name //이름 기반 참고 코드 가독성과 유지보수를 위해 이름 기반 파라미터 바인딩을 사용하자 (위치기반은 순서 실수가 바꾸면…) 컬렉션 파라미터 바인딩 다른 Collection 도 받을 수 있도록 부모타입인 Collection 타입으로 받는다. Chollection 타입으로 in 절을 지원한다.