본문 바로가기

Back-End53

JPA ) 연관관계 매핑 단방향 연관관계 연관관계에서는 N:1 단방향 관계를 먼저 이해해야 한다. 객체 VS 테이블 객체는 참조(주소) 로 연관관계를 맺는다. 테이블은 외래 키 로 연관관계를 맺는다. 이 둘은 비슷하지만 다른 특징을 가진다. 연관 데이터를 조회할 떄, 객체는 참조를 테이블은 조인을 사용한다. 양방향 연관관계 객체의 관점에서 바라봤을 때 서로 양방향이 되기 위해서는 각 객체에서 참조를 이뤄야 한다. 테이블에서 바라봤을 때 외래 키 하나로 양방향 조회가 가능하기 떄문에 처음부터 양방향이다. 엄밀히 말하자면 객체에서 양방향 이라는 것은 존재하지 않는다. 그저 단방향 2개 로 이루어진 것이 그렇게 보이는 것이다. 연관관계의 주인 설정 엔티티 를 양방향으로 설정한다면 객체에서는 참조가 둘이 된다. 해당 연관관계의 주인을 .. 2022. 3. 11.
JPA) 병합 merge 준영속 상태의 엔티티를 영속상태로 만드려면 merge 를 사용한다. 새로운 영속상태의 엔티티를 반환한다. merge 실행 파라미터로 넘어온 준영속 엔티티 식별자값으로 1차캐시에서 조회 만약 1차캐시에 없으면 DB를 조회한다음 1차 캐시에 저장 조회한 영속 엔티티에 이전값을 채워넣는다. member와 mergeMember는 다른 인스턴스기 떄문에 보통은 병합시 사용했던 변수를 참조해서 하는것이 좋다. 비영속 병합 비영속 상태의 엔티티도 영속상태로 변경할 수 있다. 정리 병합은 파라미터로 넘어온 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 없으면 DB를 조회한다. 만약 DB에도 없다면 새로운 엔티티를 생성하여 병합한다. 병합은 영속상태 여부를 판단하지 않는다. 그저 식별자 값으로 조회가 가능하면 불러서.. 2022. 3. 11.
JPA) 준영속 상태 영속성 컨텍스트가 관리하는 영속상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라고 한다. 따라서 준영속 상태의 엔티티는 영속성 컨텍스트의 기능을 사용할 수 없다. 영속상태의 엔티티를 준영속으로 만드는 방법은 3가지 이다. em.detech() 호출 em.detech() 를 호출하는 순간 부터 영속성 컨텍스트에 관리를 받지 못하고 1차 캐시 부터 쓰기지연 SQL 까지 해당 엔티티를 관리하기 위한 정보가 제거된다 영속상태 였다가 영속성 컨텍스트가 더이상 관리하지 않게된 상태를 준영속 상태라고한다. 이떄는 어떠한 영속성 컨텍스트의 기능이 실행되지 않는다. DB에 저장도 되지않음. 2. em.clear() em.detech가 하나의 엔티티를 준영속으로 만들었다면 em.clear() 는 영속성 컨텍스.. 2022. 3. 11.
JPA) Flush 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영한다. 구체적으로 다음과 같은 일이 발생한다. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티와 스냅샷을 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티는 SQL을 만들어 저장소에 저장 DB에 전송한다. 영속성 컨텍스트를 플러시하는 방법은 3가지 이다. 직접 em.flush() 를 호출 트랜잭션 커밋시 자동으로 호출 JPQL 쿼리 실행시 자동으로 호출 직접 호출 방식은 테스트 또는 타 프레임워크와 JPA를 쓸 떄빼고 거의 미사용 커밋시 자동 호출하는 이유는 변경 내용을 DB에 전달하지 않고 커밋만 하면 내용의 변화가 없기 때문에 꼭 커밋전 호출해서 반영을 해야한다 이러한 문제를 방지하기 위해서 자동호출이 실행된다. persist로 3개의 객체를 .. 2022. 3. 11.
JPA) 변경 감지 (Dirty Check) JPA로 엔티티를 수정할 떄 단순히 조회해서 데이터만 변경하면 된다. 트랜잭션 커밋 직전에 수정하는 기능을 써야하는 데 따로 없다. 사실 JPA는 변경 감지 기능을 사용해서 엔티티의 변화를 DB에 자동반영한다. JPA는 영속성 컨텍스트에 엔티티를 보관할 때, 최초 상태를 복사해서 저장해 두는데 이것을 스냅샷 이라고 한다. 그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. 순서 트랜잭션 커밋시 EM 내부에서 먼저 flush가 호출 된다. 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다. 변경된 엔티티가 있으면 쓰기 지연 저장소에 SQL을 보낸다. 쓰기지연 저장소의 SQL을 DB로 전달한다. DB 트랜잭션을 커밋을 한다. 변경 감지 는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티만.. 2022. 3. 11.
JPA) 영속성 컨텍스트 개념 및 특징 엔티티를 영구 저장하는 환경이라는 뜻이다. EM 으로 Entity를 저장하거나 조회하면 EM은 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 엔티티의 생명주기 엔티티에는 4가지 상태가 존재한다. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태 영속 : 영속성 컨텍스트에 저장된 상태. 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 : 삭제된 상태 영속성 컨텍스트의 특징 영속성 컨텍스트와 식별자 값 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 떄문에 반드시 영속상태는 식별자 값이 있어야한다. 없다면 예외가 발생한다. 2. 영속성 컨텍스트와 DB 저장 JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영하는데 이것을 flush 라고 한다. 영속성 컨텍.. 2022. 3. 11.