SPRING FRAMEWORK

JPA의 엔티티에서의 카운팅(@Formula)

Ambitions 2020. 5. 3. 15:31

JPA를 이용해 개발하다보면 모호한 부분이 많은 것 같은데 대표적인게 JPA, Hibernate, Spring JPA인 것 같다.

여기서 정리 할 내용은 아니지만 간단히 설명하면 JPA는 기술명세, Hibernate는 인터페이스, Spring JPA는 Hibernate를 스프링 프레임워크에서 쉽게 사용할 수 있게 모듈화? 해놓은 것이라는데 이게 무슨소린지 아직도 좀 어렵다.

 

이 이야기를 하는 이유는 오늘 설명한 @Formula는 Hibernate의 기능이기 때문이다.

현재 내가 개발하면서 @Formula를 사용하는 경우는 조건절로 사용하거나, 집계된 데이터가 필요할 때 사용하고 있는데, 이외의 경우에도 사용할 수 있는지는 파악해보고 있다.

 

먼저 @Formula에 대해서 간단한 설명을 하자면, 데이터베이스 엔티티를 가져올 때 실행되는 읽기전용 엔티티를 생성하는 것이고, 생성된 엔티티를 이용해 서브쿼리처럼 사용하거나, 값만을 가져와서 사용할 수 있다.

@Formula에 대한 정보를 찾기가 쉽지 않아 설명이 빈약한 것 같아서, 나머지는 코드를 통해 설명하도록 해보겠다.

 

예를들어 학생테이블이 있고, 여기서 엔티티를 가져올 때 휴학생의 수를 카운팅해서 가져오고 싶다면 다음과 같이 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.hibernate.annotations.Formula;
/**
 * 이외 import 중략..
 */
 
@Entity
@Table(name = "student")
@Getter
public class ExpenseReport extends JpaEntity<Long> {
    
    
    private Long id;
    
    private String name;
    
    private String grade;
    
    private String status;
    
 
    @Formula("(select count(1) from student where status = 'ABSENCE')")
    private int absCnt; 
    
    @Formula("(select count(1) from student_two t where t.id = id)")
    private int cntTest; // 엔티티 내의 필드를 조건으로 이용하여 사용할 수 있다.
}
 
cs

위 코드가 실행되게되면 student라는 테이블의 데이터를 가져올 때 마다 absCnt의 값을 같이 가져오게 된다.

또, Qdomain에 QabsCnt도 생성되기 때문에 queryDsl의 조건필드로도 사용할 수 있다.

다음으로, 2번째 선언된 cntTest는 student_two와 student 테이블의 id가 같은 값을 가져오는 쿼리문인데, @Formula는 엔티티 내의 필드값을 조건으로 사용할 수 도있다.

 

위에 설명한 방법 외에 여러가지 용도로 사용할 수 있는 것 같지만, 자료찾기가 힘들어 나는 위 케이스외에는 사용하지 못하고있다, 추후 다른방법으로도 사용할 수 있는 방법을 알게된다면 따로 정리해볼 예정이다.