Persistence Framework 12

JPA Insert vs. Update

0. interface public interface UserRepository extends JpaRepository { @EntityGraph(attributePaths = "authorities") Optional findOneWithAuthoritiesByEmail(String username); User findByEmail(String email); } Repository의 save(T Object)를 통해 Entity를 저장 or update한다. 1. Insert 새로운 인스턴스 생성 후 setter or 생성자를 통해 객체 생성 후 객체 넘길 때 2. update 새로운 인스턴스를 생성하는 게 아닌 select해온 후 결과 객체에 setter 혹은 생성자를 통해 객체를 생성하고 save에..

Spring Data JPA Pagination, Querydsl의 pagenation연결

1. 스프링 데이터의 Page, Pageable을 활용 // List search(MemberSerarchCondition condition); 커스텀하게 이런 쿼리 만들 때 public interface MemberRepositoryCustom { List search(MemberSerarchCondition condition); Page searchPageSimple(MemberSerarchCondition condition, Pageable, pageable); Page searchPageComplex(MemberSerarchCondition condition, Pageable, pageable); } 2. 전체 카운트를 한번에 조회하는 단순한 방법 fetchReult를 통해서 컨텐츠용, 페이징용 ..

QueryDsl, 사용자 정의 Repository

1. Spring Data JPA 리포지토리 ex) interface를 만든다. //User entity와 userId 들어가서Long public interface UserRepository extends JpaRepository { @EntityGraph(attributePaths = "authorities") Optional findOneWithAuthoritiesByUsername(String username); } 2. Spring Data JPA 사용자 정의 Repository 순서 : 가. 사용자 정의 인터페이스 작성 -> 나. 사용자 정의 인터페이스 구현 -> 다. 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속 1) 기존 MemberRepository(JpaRepository상속)..

N+1문제

1. https://jojoldu.tistory.com/165 JPA N+1 문제 및 해결방안 안녕하세요? 이번 시간엔 JPA의 N+1 문제에 대해 이야기 해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미 jojoldu.tistory.com 2. https://jojoldu.tistory.com/457 MultipleBagFetchException 발생시 해결 방법 JPA의 N+1 문제에 대한 해결책으로 Fetch Join을 사용하다보면 자주 만나는 문제가 있습니다. 바로 MultipleBagFetchException 입니다. 이 문제는 2개 이상의 OneToMany 자식 테이블에 Fetch Join을 선언..

영속성 전이 : CASCADE 와 고아객체

1. 영속성 전이가 사용되는 경우? 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있도록 하게 하려면 영속성 전이 기능을 사용해야 한다. 예를 들어 부모 엔티티가 Order이고 자식 엔티티가 OrderDetails(or OrderLines) 일 때 1) Order의 경우 ( order- orderDetails 부분을 보자) @Entity @Table(name = "\"order\"") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order extends BaseTimeEntity { @Id @GeneratedValue @Column(name = "order_id") private long orderId; @Enu..

영속성 컨텍스트

1. 영속성 컨텍스트 란? 엔티티를 영구저장하는 환경이라는 의미이다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 예를 들어 em.persist(member); 에서 persist() 메서드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨택스트에 저장한다. 2. 엔티티의 생명주기 1) 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태이다. Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 2) 영속 : 영속성 컨텍스트에 저장된 상태이다. 엔티티 메니저를 통해 엔티티를 영속성 컨텍스트에 저장하고 관리하는 상태를 영속 상태라고 한다. em.persist(member); 3) 준영속 : 영속..

동적 쿼리 foreach문

1. 태그 1) collection : 전달받은 인자로 List or Array형태만 가능하다 2) item : 전달받은 인자 값을 alias 명으로 대체 3) open : 구문이 시작될 때 삽입할 문자열 4) close : 구문이 종료될 때 삽입할 문자열 5) index : 반복되는 구문 번호로 0부터 순차적으로 증가한다. 2. 사용 예시 -1 1) controller에서 불러올 때 인자 값 fileno Controller에서 String[] fileno = request.getParameterValues("fileno"); boardDetailsDao.insertBoard(boardInfo, filelist, fileno); 2) DaoImpl에서 hashmap으로 if (fileno != null)..