Spring Data JPA
-
#Spring Data Jpa - 15 Native QuerySpring Data JPA 2021. 3. 26. 09:56
네이티브 쿼리 가급적 네이티브 쿼리는 사용하지 않는게 좋음, 정말 어쩔 수 없을 때 사용 최근에 나온 궁극의 방법 → 스프링 데이터 Projections 활용 스프링 데이터 JPA 기반 네이티브 쿼리 · 페이징 지원 · 반환 타입 · Object[] · Tuple · DTO(스프링 데이터 인터페이스 Projections 지원) · 제약 · Sort 파라미터를 통한 정렬이 정상 동작하지 않을 수 있음(믿지 말고 직접 처리) · JPQL처럼 애플리케이션 로딩 시점에 문법 확인 불가 · 동적 쿼리 불가 JPA 네이티브 SQL 지원 public interface MemberRepository extends JpaRepository { @Query(value = "select * from member where ..
-
#Spring Data Jpa - 14 ProjectionsSpring Data JPA 2021. 3. 26. 09:50
Projections(쿼리 select 절에 들어갈 데이터 ) https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections 엔티티 대신에 DTO를 편리하게 조회할 때 사용 전체 엔티티가 아니라 만약 회원 이름만 딱 조회하고 싶으면? Spring Data JPA - Reference Documentation Example 109. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Mo..
-
#Spring Data Jpa - 13 스프링 데이터 JPA 구현체 분석Spring Data JPA 2021. 3. 25. 14:38
스프링 데이터 JPA 분석 스프링 데이터 JPA 구현체 분석 · 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 · org.springframework.data.jpa.repository.support.SimpleJpaRepository 리스트 12.31 SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity);..
-
#Spring Data Jpa - 12 확장기능 - Web 확장Spring Data JPA 2021. 3. 25. 12:00
Web 확장 - 도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩 도메인 클래스 컨버터 사용 전 @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } } 도메인 클래스 컨버터 사용 후 @RestCont..
-
#Spring Data JPA - 11 확장기능 - AuditingSpring Data JPA 2021. 3. 25. 11:00
@EntityListeners(AuditingEntityListener.class)Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? · 등록일 · 수정일 · 등록자 · 수정자 순수 JPA 사용 우선 등록일, 수정일 적용 package study.datajpa.entity; @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.no..
-
#Spring Data JPA - 9 쿼리메소드 -JPA Hint & LockSpring Data JPA 2021. 3. 24. 16:55
JPA Hint & Lock JPA Hint (JPA의 구현체인 hibernate에게 알려주는 것) JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트) 데이터를 변경할 목적이아니고 화면에 뿌리고만 끝낼건데 findMById를 하는순간 DB에서 원본을 들고온다. 100% 조회용으로 쓸거라고하면 JPA표준에서는 제공하지않고 hibernate에서는 제공한다. 쿼리 힌트 사용 @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value ="true")) Member findReadOnlyByUsername(String username); 쿼리 힌트 사용 확인 @Test public void queryHint() throws E..
-
#Spring Data JPA - 8 쿼리메소드 -@EntityGraphSpring Data JPA 2021. 3. 24. 16:12
@EntityGraph (SPRING DATA JPA에서 fetchJoin을 편리하게 새용하기 위해쓰임) 연관된 엔티티들을 SQL 한번에 조회하는 방법 member → team은 지연로딩 관계이다. 따라서 다음과 같이 team의 데이터를 조회할 때 마다 쿼리가 실행된다. (N+1 문제 발생) @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberReposito..
-
#Spring Data JPA - 6 쿼리메소드 - 페이징과 정렬Spring Data JPA 2021. 3. 24. 10:47
순수 JPA 페이징과 정렬 JPA에서 페이징을 어떻게 할 것인가? 다음 조건으로 페이징과 정렬을 사용하는 예제 코드를 보자. · 검색 조건: 나이가 10살 · 정렬 조건: 이름으로 내림차순 · 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 JPA 페이징 리포지토리 코드 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList();..