참치코더의 꿈 메모장

JPA / 다형성 쿼리, 엔티티 직접 사용 정리 본문

JPA

JPA / 다형성 쿼리, 엔티티 직접 사용 정리

참치깡 2025. 11. 7. 16:31
728x90

 

다형성 쿼리

 

- JPA에서 상속구조가 있을때 부모타입으로 쿼리를 날리면 JPA가 자동으로 자식 엔티티들을 함께 

  조회하는 것을 말한다.

 

Item에 Album, Book이 상속되어 있다고 가정할때 Item 뿐만 아니라 Album, Book 엔티티도 

전부 조회한다.

1
2
3
4
List<Item> items = em.createQuery("select i from Item i", Item.class)
            .getResultList();
 
//JPA가 내부적으로 자식 테이블까지 다 합쳐서 하나의 결과로 만들어 준다.
cs

 

TYPE

 

- TYPE 키워드를 사용하여 상속관계에서 특정 자식만 조회가 가능하다.

- 이 객체가 실제로 특정 자식 타입인 경우만 필터링해서 가져온다.

1
2
3
List<Item> books = em.createQuery(
"select i from Item where type(i) = Book", Item.class)
.getResultList();
cs

 

TREAT

 

- Treat를 사용해서 Item 엔티티로 다운캐스팅하여 해당 자식 임베디드 타입 데이터만 가져올 수 있다.

- 이 객체를 특정 자식 타입이라고 가정하고 다운캐스팅해서 접근하는 기능이다.

1
2
3
List<String> authors = em.createQuery(
"select treat(i as Book).author from Item i"String.class)
.getResultList();
cs

 

다형성 쿼리의 장단점

 

장점

 

- 객체지향적인 코드로 상속 구조를 그대로 조회할 수 있다.

- 유지보수성과 추상화 수준이 높다.

 

단점

 

- JOIN이 많아져서 쿼리가 복잡해 질 수 있다.

- 불필요한 테이블 접근으로 성능 저하가 발생 할 수 있다.

- 자식이 많을수록 SQL이 비효율적으로 길어진다.

 

따라서 상속관계일때 필요한 자식 타입만 조회할때는 TYPE과 TREAT를 적절하게 사용해야 한다. 

 

 

엔티티 직접 사용

 

- JPQL에서 엔티티 객체 자체를 값처럼 사용하는 것을 말한다.

- JPA는 자동으로 해당 엔티티의 식별자(PK)로 변환해서 쿼리를 실행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Member member = em.find(Member.class, 1L);
 
List<Order> result = em.createQuery(
"select o from Order o where o.member = :member", Order.class)
    .setParameter("member", member)
    .getResultList();
 
// 여기서 :member는 실제 SQL 실행 시 member_id(외래키) 값으로 변환된다.
 
List<Member> result = em.createQuery(
    "select m from Member m where m = :member", Member.class)
    .setParameter("member", member)
    .getResultList();
 
// 여기서 :member 도 결국에 m.id = member.id 로 변환된다.
 
 
cs

 

 

728x90
Comments