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는 엔티티 내의 필드값을 조건으로 사용할 수 도있다.
위에 설명한 방법 외에 여러가지 용도로 사용할 수 있는 것 같지만, 자료찾기가 힘들어 나는 위 케이스외에는 사용하지 못하고있다, 추후 다른방법으로도 사용할 수 있는 방법을 알게된다면 따로 정리해볼 예정이다.
'SPRING FRAMEWORK' 카테고리의 다른 글
Spring JPA에서 @Query를 사용하는 방법. (0) | 2020.09.22 |
---|---|
스프링 부트(Spring boot) + 그레들(Gradle) 개발 환경설정 (0) | 2020.07.06 |
JPA annotation @DynamicUpdate? (0) | 2020.05.07 |
Querydsl에서 DTO를 사용하는 방법 (0) | 2020.03.04 |
JPA @Modifying ?? (0) | 2020.03.03 |