인프런

공부/JPA

Spring Data JPA - Specifications(명세)

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 나머지 기능들 Specifications(명세) Query By Example Projections 네이티브 쿼리 나머지 기능들은 복잡도가 높지만 실무에서 그닥 필요하지는 않은 기능들이다. 그래도 개 똥도 약에 쓰려면 없다고, 알고 있으면 좋을 기능들이므로 이런 게 있구나 정도만 파악하면 될 것 같다. Specifications(명세) 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원한다. Criteria 앞에서 자주 좀 본 기능 같다. 하지만 기억에 잘 안 남는 거 보니 그다지 중요한 애는 아닌 거 같다. 강의에서도 말하길 이 기..

공부/JPA

Spring Data JPA - 새로운 엔티티를 구별하는 방법

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 새로운 엔티티를 구별하는 방법 새로운 엔티티를 판단하는 기본 전략 식별자가 객체일 때 null로 판단 식별자가 자바 기본 타입일 때 0으로 판단 private long id; 일 때 long에는 null이 들어갈 수 없으니 0이 들어간다. Persistable 인터페이스를 구현해서 판단 로직 변경이 가능하다. Item.class @Entity @Getter public class Item { @Id @GeneratedValue private Long id; } ItemRepository.interface public interface ItemRepository extend..

공부/JPA

Spring Data JPA - 스프링 데이터 JPA 구현체 분석

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 내부적으로 어떻게 동작하는지 알아보기 위해 구현체를 분석해보자. 구현체는 JpaRepository 인터페이스에 인터페이스 선언부 옆에 화살표 아래 버튼을 누르면 SimpleJpaRepository를 찾을 수 있다. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { //...생략 @Override public Optional findById(ID id) { A..

공부/JPA

Spring Data JPA - Web 확장-페이징과 정렬

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))..

공부/JPA

Spring Data JPA - Web 확장-도메인 클래스 컨버터

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..

공부/JPA

Spring Data JPA - Auditing

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용한다. 기본적으로 테이블을 생성할 때 등록일과 수정일 컬럼을 넣는다. 왜냐하면 운영할 때 기본적으로 추적이 쉽기 때문이다. 추가적으로 등록자, 수정자도 추가로 넣을 수 있다. 위의 등록일, 수정일은 거의 모든 테이블에 공통적으로 들어가 있는 컬럼으로 생각하면 된다.(등록자, 수정자는 필요 없는 테이블에선 추가하지 않는다.) 순수 JPA 사용 JapBaseEntity.class @Getter @MappedSuperclass public class JpaBaseEntity { @Column(..

공부/JPA

Spring Data JPA - 사용자 정의 리포지토리 구현

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 사용자 정의 리포지토리 구현 사용자 정의 리포지토리 구현은 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하기에는 구현해야 하는 기능이 너무 많다. 그래서 그 중에 뽑아서 몇 개만 구현하고 싶거나, 혹은 JPA가 아닌 다른 Mybatis 등의 다른 리포지토리를 같이 쓰고 싶을 때 사용한다. 사용자 정의 리포지토리를 만드려면 일단 인터페이스 하나를 생성해야 한다. MemberRepositoryCustom.interface public interface MemberRepositoryCustom { List findMemberCustom(); } 그리고 이 인터페이스를 ..

공부/JPA

Spring Data JPA - JPA Hint & Lock

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으로 바..

공부/JPA

Spring Data JPA - @EntityGraph

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의 연관관계는 다대일이다. 그리고 연관 관계 ..

공부/JPA

Spring Data 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..

공부/JPA

Spring Data 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 쿼리 결과를..

공부/JPA

Spring Data 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..

공부/JPA

Spring Data 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..

공부/JPA

Spring Data JPA - @Query, 값, DTO 조회하기

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); ..

공부/JPA

Spring Data JPA - @Query, 리포지토리 메서드에 쿼리 정의하기

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..

데부한
'인프런' 태그의 글 목록 (4 Page)