Spring Data JPA - Web 확장-페이징과 정렬
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Web 확장 - 페이징과 정렬 페이징 정렬 예제 MemberController.class @GetMapping("/members") public Page list(Pageable pageable) { // pageable 파라미터 정보 , Page 결과 정보 Page page = memberRepository.findAll(pageable); return page; } @PostConstruct public void init() { for(int i = 0; i < 100; i++) { memberRepository.save(new Member("user" + i, i))..
Spring Data JPA - Web 확장-도메인 클래스 컨버터
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Web 확장 - 도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩하는 기능이다. 도메인 클래스 컨버터 사용 전 MemberController.class @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member..
Spring Data JPA - Auditing
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용한다. 기본적으로 테이블을 생성할 때 등록일과 수정일 컬럼을 넣는다. 왜냐하면 운영할 때 기본적으로 추적이 쉽기 때문이다. 추가적으로 등록자, 수정자도 추가로 넣을 수 있다. 위의 등록일, 수정일은 거의 모든 테이블에 공통적으로 들어가 있는 컬럼으로 생각하면 된다.(등록자, 수정자는 필요 없는 테이블에선 추가하지 않는다.) 순수 JPA 사용 JapBaseEntity.class @Getter @MappedSuperclass public class JpaBaseEntity { @Column(..
Spring Data JPA - 사용자 정의 리포지토리 구현
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 사용자 정의 리포지토리 구현 사용자 정의 리포지토리 구현은 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하기에는 구현해야 하는 기능이 너무 많다. 그래서 그 중에 뽑아서 몇 개만 구현하고 싶거나, 혹은 JPA가 아닌 다른 Mybatis 등의 다른 리포지토리를 같이 쓰고 싶을 때 사용한다. 사용자 정의 리포지토리를 만드려면 일단 인터페이스 하나를 생성해야 한다. MemberRepositoryCustom.interface public interface MemberRepositoryCustom { List findMemberCustom(); } 그리고 이 인터페이스를 ..
Spring Data JPA - JPA Hint & Lock
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. JPA Hint & Lock JPA Hint JPA 쿼리 힌트(SQL 힌드가 아니라 JPA 구현체(하이버네이트)에게 제공하는 힌트이다.) 쿼리 힌트 사용 MemberRepositoryTest.class @Test public void queryHint() { Member member1 = memberRepository.save(new Member("member1", 10)); em.flush(); em.clear(); //Member findMember = memberRepository.findById(member1.getId()).get(); // 실무에서 get으로 바..
Spring Data JPA - @EntityGraph
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. @EntityGraph 연관된 엔티티들을SQL 한 번에 조회하는 방법이다. EntityGraph를 제대로 이해하려면 fetch join에 대해 자세히 알고 있어야 한다. 그래서 본론에 들어가기 앞서 fetch join에 대해 먼저 알아보자. fetch join MemberRepositoryTest.class // Member.class @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="team_id") private Team team; 지금 Member 기준에서 Member와 Team의 연관관계는 다대일이다. 그리고 연관 관계 ..
Spring Data JPA - 벌크성 수정 쿼리
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 벌크성 수정 쿼리 JPA는 엔티티를 가져와서 변경할 경우 변경 감지 기능이 작동한다. 이런 경우는 한 건 씩 지원되는 거고, 모든 데이터에 일괄적인 업데이트를 날려야 하는 경우(ex 모든 직원의 연봉 10% 인상)에 벌크성 수정 쿼리라고 한다. 순수 JPA 예제 20살이거나, 20살 이상인 회원의 나이를 +1 MemberJpaRepository.class public int bulkAgePlus(int age) { return em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age") .setPa..
Spring Data JPA - 스프링 데이터 JPA 페이징과 정렬
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 스프링 데이터 JPA 페이징과 정렬 페이징과 정렬 파라미터 org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능(내부에 Sort 포함) 패키지명에서 알 수 있는 건 JPA를 사용하지 않는다는 것이다. 어떤 DB(관계형, noSql 등)를 사용하던 이 기능을 사용할 수 있도록 공통화시킨 것이다. 세부 구현은 물론 개발자가 알아서 직접 개발해야 한다. 특별한 반환 타입 org.springframework.data.domain.Page 추가 count 쿼리 결과를..
Spring Data JPA - 순수 JPA 페이징과 정렬
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 순수 JPA 페이징과 정렬 예제를 위한 조건 검색 조건 : 나이 10살 정렬 조건 : 이름 기준 내림차순 페이징 조건 : 첫 번째 페이지, 페이지당 보여 줄 데이터는 3건 JPA 페이징 리포지토리 코드 MemberJpaRepository.class 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) .setFirst..
Spring Data JPA - 파라미터 바인딩, 반환 타입
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 파라미터 바인딩, 반환 타입 위치 기반 select m from Member m where m.username = ?0 이름 기반 select m from Member m where m.username = :name 위치 기반은 거의 사용하지 않는다. 코드 가독성과 유지보수를 위해 이름 기반 파라미터 바인딩을 사용하는 것이 좋다. 파라미터 바인딩 public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = :name") Member findM..
Spring Data JPA - @Query, 값, DTO 조회하기
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. @Query, 값, DTO 조회하기 단순히 값 하나 조회 여태 엔티티 위주로 조회를 했는데 그럼 엔티티에 들어있는 필드 하나, 즉 기본 타입으로 데이터를 조회하려면? @Query("select m.username from Member m") List findUsernameList(); @Test public void findUsernameList() { Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20); memberRepository.save(m1); memberRepository.save(m2); ..
Spring Data JPA - @Query, 리포지토리 메서드에 쿼리 정의하기
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 리포지토리 메서드에 쿼리 정의하기 쿼리 메서드 기능 3가지 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 애노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의 메서드에 JPQL 쿼리 작성 MemberRepository.interface @Query("select m from Member m where m.username = :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); MemberRepos..
Spring Data JPA - JPA NamedQuery
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. JPA NamedQuery 쿼리 메서드 기능 3가지 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의 JPA NamedQuery @NamedQuery 애노테이션으로 Named 쿼리 정의 실무에서 거의 사용할 일이 없다. JPA를 직접 사용해서 Named 쿼리 호출 관련 포스팅 JPA 객체지향 쿼리 언어(JPQL) - Named 쿼리 JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. Named 쿼리 정적 쿼리..
Spring Data JPA - 메서드 이름으로 쿼리 생성
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 메서드 이름으로 쿼리 생성 쿼리 메서드 기능 3가지 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의 메서드 이름으로 쿼리 생성 메서드 이름을 분석해서 JPQL 쿼리 실행 ex) 이름과 나이가 같은 회원을 조회하려면? 순수 JPA 리포지토리 public List findByUsernameAndAgeGreaterThen(String username, int age) { return em.createQuery("select m from Member m where m where m..
Spring Data JPA - 공통 인터페이스
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 공통 인터페이스 설정 원래는 스프링에서는 JavaConfig로 설정해야한다. @SpringBootApplication @EnableJpaRepositories(basePackages = "study.datajpa.repository") public class DataJpaApplication { public static void main(String[] args) { SpringApplication.run(DataJpaApplication.class, args); } } 스프링 부트에서는 다행히도 생략이 가능하며 @SpringBootApplication가 적용된 파일의 패..