본문 바로가기

전체 글102

JPA) 객체지향 쿼리 객체지향 쿼리 find()를 사용해서 식별자로 엔티티 하나를 조회할 수 있다. 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티를 찾을 수 있다. 다음이 가장 단순한 조회방법이다. 식별자로 조회 객체 그래프 탐색 이 기능만으로 애플리케이션 개발은 어렵다. 좀더 복잡한 검색 방법이 필요할 수 있는데 결국 데이터는 DB에 있어서 SQL로 필요한 내용을 조회해야 한다. 하지만 ORM은 DB가 아닌 객체를 활용하기 때문에 엔티티 객체를 대상으로 조회하는 방법을 필요로 한다. SQL이 DB테이블을 대상으로 하는 데이터 중심 쿼리라면 JPQL은 엔티티 객체를 대상으로 하는 객체지향 쿼리이다. JPQL을 사용하면 JPA가 이를 분석하여 적절한 SQL을 만들어 DB를 조회한다. JPA는 JPQL 뿐만 아니라 .. 2022. 3. 12.
JPA) 영속성 전이 특정 엔티티를 영속상태로(Persist) 만들고 싶을 때 연관된 엔티티도 함께 영속상태로 만들고 싶다면 영속성 전이 기능을 사용하면 된다. Cascade 옵션으로 영속성 전이를 제공한다. 해당 기능을 이용하면 부모 엔티티를 저장할 때 자식의 엔티티도 같이 저장이 가능해진다. 위 코드로 부모와 자식 엔티티를 영속상태로 만들기 위해서는 3번의 persist 를 호출해야 한다. em.persist(parent); em.persist(child1); em.persist(child2); 하지만 만약 영속성 전이를 설정했을 경우에는 부모를 영속화 하는 것으로 자식엔티티 또한 같이 영속화 되어 저장된다. @OneToMany(cascade = CascadeType.PERSIST) private List children.. 2022. 3. 12.
JPA) Eager, Lazy 로딩 즉시로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다 ex) 회원과 팀 엔티티가 연관관계라고 가정 했을 때, em.find(Member.calss, "member1"); 를 호출 할 때 회원 엔티티와 팀 엔티티를 함께 조회한다. 예시 코드 @ManyToOne(fetch = FetchType.EAGER) 회원을 조회하는 순간 연관관계를 맺은 엔티티 또한 함께 조회한다. 이때 2번의 쿼리를 실행하는 것 같지만, JPA 구현체는 즉시로딩을 최적화 하기위해서 가능하면 조인 쿼리를 사용한다. 여기서는 한번의 쿼리로 두 엔티티를 모두 조회한다. 중요한 점 이떄 외부조인( outer join ) 을 사용하는 데 외부 조인을 사용할 경우 null을 허용하게 된다. 즉, 팀에 속하지 않는 회원까지 조회하게될 가.. 2022. 3. 12.
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.