전체 글
-
#Spring Data JPA - 10 확장 기능-사용자 정의 리포지토리 구현카테고리 없음 2021. 3. 25. 10:00
사용자 정의 리포지토리 구현 · 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 · 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 · 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?(실무에서 굉장히 많이 사용) · JPA 직접 사용( EntityManager ) · 스프링 JDBC Template 사용 · MyBatis 사용 · 데이터베이스 커넥션 직접 사용 등등... · Querydsl 사용 만드는 순서 1. 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } SPRING DATA JPA가 아니라 직접 구현한 기능을 쓰..
-
#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();..
-
#Spring Data JPA - 5 쿼리메소드 - 반환타입Spring Data JPA 2021. 3. 23. 16:03
반환 타입 스프링 데이터 JPA는 유연한 반환 타입 지원 List findByUsername(String name); //컬렉션 Member findByUsername(String name); //단건 Optional findByUsername(String name); //단건 Optional 스프링 데이터 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 조회 결과가 많거나 없으면? · 컬렉션 · 결과 없음: 빈 컬렉션 반환 · 단건 조회 · 결..
-
#Spring Data JPA - 4 쿼리 메소드 -파라미터 바인딩Spring Data JPA 2021. 3. 23. 16:03
파라미터 바인딩 · 위치 기반(사용 X) · 이름 기반(사용 O) select m from Member m where m.username = ?0 //위치 기반 select m from Member m where m.username = :name //이름 기반 파라미터 바인딩 import org.springframework.data.repository.query.Param public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = :name") Member findMembers(@Param("name") String username); } 참고: 코드 가독성과 유지보수를 ..
-
#Spring Data JPA - 3 쿼리 메소드 기능Spring Data JPA 2021. 3. 23. 16:01
쿼리 메소드 기능 package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Member; import java.util.List; public interface MemberRepository extends JpaRepository { //JpaRepository List findByUsername(String username); //username같은것은 공통으로 하기 애매해서 안만들어져 있다. //impl로 상속받아 구현할려고하면 interface라서 나머지도 다 구현해야한다고 나온다. //그럼 어떻게 findByUsername을 해결해야할..
-
#Spring Data JPA - 2 공통 인터페이스Spring Data JPA 2021. 3. 23. 11:41
공통 인터페이스 기능 · 순수 JPA 기반 리포지토리 만들기 · 스프링 데이터 JPA 공통 인터페이스 소개 · 스프링 데이터 JPA 공통 인터페이스 활용 · 순수 JPA 기반 리포지토리 만들기 · 순수한 JPA 기반 리포지토리를 만들자 · 기본 CRUD · 저장 · 변경 → 변경감지 사용 · 삭제 · 전체 조회 · 단건 조회 · 카운트 참고: JPA에서 수정은 변경감지 기능을 사용하면 된다. 트랜잭션 안에서 엔티티를 조회한 다음에 데이터를 변경하면, 트랜잭션 종료 시점에 변경감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다. 공통 인터페이스 설정 JavaConfig 설정- 스프링 부트 사용시 생략 가능 @Configuration @EnableJpaRepositories(base..