본문 바로가기

Spring Data JPA

(14)
쿼리 메소드 조건들 KeywordSampleJPQL snippet Distinct findDistinctByLastnameAndFirstname select distinct …​ where x.lastname = ?1 and x.firstname = ?2 And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2 Is, Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1 Between findByStartDateBe..
3월 24일 SpringDataJPA 페이징과 정렬 page 와 Pageable 을 사용 @GetMapping("/members") public Page list(Pageable pageable){ Page page = memberRepository.findAll(pageable); return page; } 위 같이 page 형태로 반환받고 pageable을 매개변수로 사용하면 스프링이 페이징 해준다. pageable 은 인터페이스 , page는 결과 정보이다. pageable이 있으면 spring이 PageRequest를 생성해서 값을 세팅해 준다. 또한 http://localhost:8080/member?page = 0 을 붙여주면 0페이지부터 가져온다 (한 페이지당 기본값 20개) http://localhost:8080/member?page=0&s..
3월 23일 SpringDataJPA 도메인 클래스 컨버터 도메인 클래스 컨버터 간단한 조회용으로 사용 @GetMapping("members/{id}") public String findMember (@PathValiable("id") Long id){ Member member = memberRepository.findById(id).getId(); return member.getUsername(); } HTTP정보로 ID를 받아 그 ID를 엔티티로 찾아오는 로직이다. 그런데 이걸 SpringBoot 에서는 @GetMapping("/members2/{id}") public String findMember(@PathValiable("id") Member member){ return member.getUsername(); } SpringBoot에서는 HTTP로 id..
3월 23일 SpringDataJPA Auditing Auditing 테이블을 만들때 등록일 , 수정일을 꼭 남겨주어야한다. 엔티티를 생성, 변경시 추적을 위해서 등록일, 수정일 , 등록자 , 수정자를 꼭 남겨야 한다. 순수 JPA 사용 1.시간기록데이터 엔티티 생성 @MappedSuperClass //해당 엔티티의 필드를 다른 엔티티에서 가져다 쓸수 있게 한다. @Getter public class JPABaseEntity{ @Column(updatable = false , insertable = true) // 수정 등록시 데이터 변경 여부 private LocalDateTime createdDate(); private LocalDAteTime updatedDate(); //@PrePersist 는 영속화 되기 직전 //@PostPersist 는 영속화..
3월 23일 SpringDataJPA 사용자 정의 리포지토리 구현 사용자 정의 리포지토리 구현 (실무에서 중요) 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동생성하는 방식인데 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현해야 하는 기능이 너무 많다 다른 이유로 인터페이스와 메서드를 직접 구현하고 싶다면? -JPA를 직접사용(EntityManager) -스프링 JDBC Template 사용 -MyBatis 사용 -데이터 베이스 커넥션 직접 사용 등등 -Query DSL 사용 등 위 기능을 데이터 JPA에서 사용하고 싶을 경우 커스텀한 기능 하나마 쓰고 싶을 경우 사용자 인터페이스 인터페이스를 만든다. 1.MemberRepositoryCustom , Interface 생성 ( 기능 명시) public interface MemberR..
3월 22일 SpringDataJPA hint & lock hint & lock JPA 쿼리 힌트 (이 힌트는 SQL힌트가 아니라 JPA 구현체(하이버네이트)에 제공하는 힌트) 만약 Member 라는 엔티티를 find하게 될 경우 JPA는 변경감지를 위해 원본 member 와 변경감지용 member를 스탭샷에 생성해서 총 2개의 엔티티를 가진다 그런데 개발자가 해당 엔티티를 변경할 계획없이 find한 경우 스탭샷을 만들지 않을 수 있다. Repository @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly" , value = "true")) Member findReadOnlyByUsername(String username); 위 메소드로 member를 조회하면 "readOnly" 힌트로 인해 스탭샷을 ..
3월 22일 SpringDataJPA EntityGraph (fetch Join) EntityGraph //EntityGraph 는 @Query에서 fetch Join 을 사용할 때 사용 *fetch join을 필수적으로 알아야 한다. fetch = fetchType.LAZY 최초 호출시 proxy값을 가져오고 그 값에 접근할때 지연로딩을 수행하는것 지연로딩이 일어나는걸 n+1문제라 한다. 이 n+1문제를 fetch join으로 해결한다. fetch join은 해당 엔티티에 지연로딩 필드들을 즉시로딩으로 다 가져온다, 연관관계에 필드를 객체그래프라 한다 간단한 fetch join은 데이터 JPA를 사용 , 복잡하면 JPQL을 사용 ex) @override @EntityGraph(attributePaths = {"team"}) //fetch join 할 필드값을 넣어준다. List fi..
3월 22일 SpringDataJPA 벌크성 수정 쿼리 DB에 update 쿼리 1번으로 엔티티의 모든 요소를 수정하는것을 벌크성 수정 쿼리라 한다. 쿼리가 적용되는 요소가 2개이상인 경우를 말한다, 순수 JPA에서의 벌크 연산 Repository public int bulkAgePlus(int age){ return em.createQuery( "update Member m set m.age = m.age +1" + " where m.age >= :age") .setParameter("age" , age) .excuteUpdate() //excuteUpdate는 최종적으로 연산이 적용된 데이터의 갯수가 나온다. } 데이터 JPA 벌크연산 Repository @Modifying //update 시엔 이 값을 꼭 넣어야 한다, 없으면 에러가 발생 @Query(..