Spring 177

플러시 & 준영속 상태 정리

플러시 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것 INSERT SQL / DELETE SQL / UPDATE SQL이 데이터베이스에 날라가는거라고 보면된다. 플러시 발생 변경 감지(Dirty checking) 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 em.flush() - 직접 호출 트랜잭션 커밋 - 플러시 자동 호출 JPQL 쿼리 실행 - 플러시 자동 호출 아래를 실행할 때 commit을 하게되면 insert문이 담기고 flush를 할 때 쿼리가 바로 DB에 반영이 된다. try { // 영속 Member member = new Member(200L, "member2..

Spring/JPA 2022.04.12

내부 동작 방식 - 영속성 컨텍스트 2

영속성 컨텍스트는 내부에 1차 캐시를 들고 있다. 조회할 때 find해서 동작하게되면 member를 먼저 조회 안하고 1차 캐시에서 조회를 하게 된다. 1차 캐시 엔티티에 member가 있게되면 member를 그냥 조회해온다. member2를 이제 찾게 되면 find를 했을 때 1차 캐시에 없으므로 DB에서 찾아서 1차캐시 엔티티에 저장하게 된다. 이후에 find("member2")를 하게되면 DB를 조회하지 않고 바로 1차캐시 엔티티에서 가져오게 된다 엔티티 매니저라는 것은 DB 트랜잭션 단위로 보통 만들고 DB 트랜잭션이 끝날 때 종료시켜버린다. 1차 캐시는 DB 트랜잭션 안에서만 효과가 있기 때문에 성능에 이점을 얻을 수 있는 장점은 없다. 이제 저장을 하고 조회를 하기위해 실행을 하면 데이터베이스..

Spring/JPA 2022.04.12

내부 동작 방식 - 영속성 컨텍스트 1

JPA에서 가장 중요한 2가지는 아래와 같다. 객체와 관계형 데이터베이스 매핑하기(Object Relational Mapping) 영속성 컨텍스트 아래 그림을 보면 고객의 요청이 올 때 마다 엔티티 매니저 팩토리를 통해서 엔티티 매니저를 생성한다. 엔티티 매니저는 내부적으로 DB 커넥션을 통해서 DB를 사용하게 된다. JPA를 이해하는데 가장 중요한 용어가 영속성 컨텍스트이고 "엔티티를 영구 저장하는 환경"이라는 뜻이다. Entity Manager.persist(entity); 즉 영속성 컨텍스트를 통해서 영속화 한다는 뜻인데 엔티티를 영속성 컨텍스트라는 곳에 저장 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 1:1로 눈에 보이지 않는 영속성 컨텍스트 ..

Spring/JPA 2022.04.12

스프링 부트 JPA 활용 2 - API 개발 & 성능 최적화 학습 리스트

API 개발 기본 회원 등록 API 회원 수정 API 회원 조회 API API 개발 고급 - 준비 API개발 고급 소개 조회용 샘플 데이터 입력 API 개발 고급 지연 로딩과 조회 성능 최적화 간단한 주문 조회 V1: 엔티티를 직접 노출 간단한 주문 조회 V2: 엔티티를 DTO로 변환 간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 간단한 주문 조회 V4: JPA에서 DTO로 바로 조회 API 개발 고급 컬렉션 조회 최적화 엔티티 직접 노출 DTO로 변환 DTO로 변환 - 페치 조인 최적화 DTO로 변환 - 페이징과 한계 돌파 JPA에서 DTO 직접 조회 JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 JPA에서 DTO 직접 조회 - 플랫 데이터 최적화 API 개발 고급 정리 A..

도메인 분석 설계 - 엔티티 설계시 주의점

엔티티 설계시에는 가급적 Setter을 사용안하는게 좋다. 그리고 모든 연관관계는 지연로딩으로 설정을 해줘야 한다. 즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩( LAZY )으로 설정해야 한다. 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다. @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다. 최악의 경우를 살펴보자. 아래에서 Member Order 연관 Order OrderItem이 연관 이렇게 다 연관이 되어있다 하자. 하나를 가져오면 다 연관되어 있는 애..

Spring/SpringBoot 2022.04.05

데이터베이스 스키마 자동생성 - create-drop

아래 create-drop가 제대로 작동안함(h2 db보면 member table이 그대로 있음) // persistence.xml 해결 JPAMain.java package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persist..

Spring/JPA 2022.04.04

도메인 분석 설계 - 엔티티 클래스 개발2

Item 폴더안에 Category Class를 만들고 // Category Class package jpabook.jpashop.domain.item; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; import static javax.persistence.FetchType.*; @Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name = "category_id") private Long id; private String name; // Catego..

Spring/SpringBoot 2022.04.02

도메인 분석 설계 - 도메인 모델과 테이블 설계

회원 - 주문 : 1:N 주문 - 상품(물품) 여러개 주문 가능 1 : n => 중간에 주문상품을 두어서 여러개를 놓는다. 카테고리 - 상품 n : n 도메인 모델 회원 엔티티 pk 값을 다 Long type으로 잡았다. 임베디드 타입(내장 값 타입)으로 Address를 넣어주었다. orders는 주문을 List로 가지게 된다. Order와 Item사이 중간에 OrderItem이 있는데 1 : N , N : 1 이 있는 관계를 풀어서 만들었다. ( id, item, order, orderPrice, count를 넣어놓았다.) 그리고 Member가 Order가지고 있고 Order는 Member을 가지고 있는 양방향 연관관계이다. 이 관계의 내용은 회원이 주문을 생성하는 것으로 생각하지 말고 주문이 필요할 ..

Spring/SpringBoot 2022.04.02