BackEnd(Java)/Spring Data JPA(10)
-
조회 API 성능 최적화
✅ 아래 내용들에 대해서 알아보자 - 조회 API 성능 최적화 방법 - 최적화 VS 코드 복잡도 조회 API 성능 최적화 방법 1. 엔티티 조회 방식으로 우선 접근 패치조인으로 쿼리 수 최적화 컬렉션 최적화 -> 페이징 필요시 default_batch_fetch_size, @BatchSize로 최적화, 불필요시 패치조인 사용 2. 엔티티 조회 방식으로 해결 안 되면 DTO 조회 방식 사용 3. DTO 조회 방식으로 해결이 안 되면 Native SQL or 스프링 Jdbc Template or Mybatis 등.. 이 방식으로도 해결이 안 된다면 트래픽이 많은 경우이므로 캐싱 처리(redis, 로컬 캐시)등을 통해 해결해야 한다. 만약 캐싱 처리한다면 엔티티를 캐싱 처리하면 안 됨(라이플 사이클이 안 맞으..
2023.06.13 -
컬렉션 패치 조인
✅ 아래 내용들에 대해서 알아보자 - 컬렉션 패치 조인 - 컬렉션 패치조인 문제점 - 컬렉션 패치조인 한계 - 컬렉션 패치조인 최적화 컬렉션 패치 조인 아래 코드를 보면 Order 엔티티와 OrderItem 엔티티가 N:1인 관계 OnetoMany로 구성되어 있고, Order와 orderItems를 join fetch로 컬렉션 패치 조인 하고 있는 것을 확인할 수 있다. public List findAllWithItem() { return em.createQuery("select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi", Order.class) ..
2023.06.12 -
@OnetoMany 관계 삭제
@OnetoMany관계에서 delete 연산을 해보자. Gym과 Member가 (1:N)인 관계이다(Member가 연관관계의 주인) Gym을 삭제하려고 하면 아래의 오류가 뜬다. "Cannot delete or update a parent row: a foreign key constraint fails" 해당 오류를 찾아보니 두 테이블 사이 foreign key로 연결되어 있을 경우에 삭제하면 나타나는 오류이다. Member가 Gym의 id값을 fk로 가지고 있다. 그래서 DB에서 삭제하지 못하게 오류가 뜨게 된다. 그렇다면 어떻게 해야 삭제를 할 수 있을까? 두 엔티티 사이의 연관관계를 끊어 버리는 것이다. 연관관계의 주인인 Member에서는 gym= null로 하고, Gym에서는 List member..
2022.04.21 -
부모 - 자식 엔티티 관계 삭제
부모 - 자식 관계를 가지는 엔티티 구조에서 통상적으로 부모가 삭제되면 자식도 같이 삭제가 되어야 한다. (상황에 따라 자식 데이터가 필요할 경우 자식 데이터는 남겨 놓는다) 왜냐하면, 자식 입장에서 부모의 데이터가 존재해야 자식의 데이터가 유의미해진다. 부모 삭제 시 자식이 같이 삭제, 영속 등 기능을 JPA에서는 제공한다. 이러한 기능들 영속성 전이(CASCADE)라고 한다. CASCADE에 대한 자세한 개념을 설명하지는 않을 것이다. 부모 -자식 관계의 삭제에 대해서 자세히 알아볼 것이다. 부모 - 자식 관계에서 자식 엔티티를 삭제하는 방법은 2가지가 있다. 1. 부모 삭제 시 자식도 같이 삭제하는 방법 - CascadeType.REMOVE 혹은 orphanRemoval = true로 설정하여 부모..
2022.04.19 -
생성 시간, 수정 시간 자동으로 값 넣기
Spring Data 공식문서를 읽어보면 엔티티가 수정되거나 생성될 때 자동으로 행위자와 그 시간에 대한 정보를 제공(Capture)한다고 나와있다. 이 기능을 JPA Auditing라고 한다.(그림 1 참고) 그러면 실제 JPA에서 어떻게 설정하고 사용하는지 알아보자 설정 아래의 그림 2를 보면 먼저 클래스 위에 @EntityListeners를 사용하여 Auditing 기능을 사용한다고 선언 후 실제 생성시간, 수정 시간에 맞는 필드에 각각 @CreatedDate와 @LastModifiedDate를 사용하면 자동으로 시간이 설정돼서 들어가게 된다. 위 설정 후 프로젝트의 SpringBoot Main 부분 클래스에 @EnableJpaAuditing 어노테이션을 사용하여 JpaAuditing 기능을 사용한..
2022.03.29 -
JPA - Mysql 컬럼명 대문자 생성이 안될 때
jpa에서 @Column(name="ID") 을 사용하여 컬럼 매핑을 대문자로 했는데 hibernate 실행 쿼리는 소문자로 매핑되고 있고 실제 DB에 소문자로 컬럼이 설정됐다. 왜 대문자로 안되는지 구글에서 찾아보다가 나와 비슷한 문제를 겪고 있는 사람 발견하였음! https://velog.io/@gillog/JPA-Spring-Boot-JPA-Entity-Table-%EB%8C%80-%EC%86%8C%EB%AC%B8%EC%9E%90-%EA%B5%AC%EB%B6%84-%EB%AA%BB%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0-%ED%95%B4%EA%B2%B0 [JPA] Spring Boot JPA Entity Table 대, 소문자 구분 못하는 경우 해결 Spring..
2022.03.24