[TIP] View 목적의 Entity 객체를 만드는 법

Sierra·2022년 11월 14일
0

Tip

목록 보기
2/2

Intro

개발을 하다보면 View 테이블을 사용해야 하는 경우가 생긴다. 여기서 View란, 가상 테이블을 의미한다.
우리가 가지고 있는 Entity와는 다르게 파생되는 데이터들이 생길 수 있다. 개발을 하다보면 막상 필요한 데이터가 언제 어떻게 나타날 지 모든 걸 100퍼센트 예측할 수는 없기 때문이다.

이러한 파생 된 데이터를 화면 상에서 보여줘야 할 때 고민이 들 수 있다. 새로운 Entity를 생성하자니 중복되는 데이터가 DB 상에 존재하게 된다. 좋은 상황이라고 볼 수 없다. 중복 데이터가 존재한다면, 특정 데이터가 변경되었을 때 잔여 데이터들에 대한 변경 처리 또한 해 주어야 한다. 쉽게 얘기해서 하나의 트랜잭션이 복잡해지게 만드는 원인이 될 수 있다.

이번 포스팅에서는 Spring Framework에서 View 목적의 Entity를 생성하는 법에 대해 기록 해 보도록 하겠다.

어노테이션으로 처리하는 법

@Entity
@Table(name = "entity")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class entity{
	@Id
    private UUID uid;
    
    private String name;
}

평범하게 Entity 클래스를 코딩하면 보통 이런식일 것이다. View Entity를 생성하려면 어떻게 바꾸어야 할까?
간단하게 어노테이션 하나 붙혀주는 방식으로 해당 Entity를 View에 매핑되는 Entity로 작성할 수 있다.

@Entity
@Immutable
@Table(name = "view_entity")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class entity{
	@Id
    private UUID uid;
    
    private UUID departId;
    
    private String name;
}

이러한 방식은 기존에 View 가 생성 되어있을 때 해당 View 에 Hibernate로 접근할 수 있도록 하는 데 사용된다. Immutable 어노테이션을 사용했기 때문에 해당 엔티티는 Read Only가 된다.

하지만 RDBMS 상에서 View 가 생성되지 않은 상황이라면? 아래와 같은 방법을 사용할 수 있다.

Subselect

@Entity
@Immutable
@Subselect("SELECT e.uid, e.name FROM userEntity e JOIN userDepartment ud ON e.uid = ud.uid")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class entity{
	@Id
    private UUID uid;
    
    private UUID departId;
    
    private String name;
}

Subselect 어노테이션에 직접 JPQL 쿼리를 집어넣어서 View를 생성해내어 사용하는 방식이다.

Outro

이러한 방법을 사용한다면, 매번 데이터에 대한 Entity를 생성 할 필요 없이 필요한 정보에 대해 View 역할을 하는 Entity로 사용할 수 있다. Spring Framework 를 통해 서버 애플리케이션을 개발하던 경험들 중 상당히 초창기에 했던 실수를 해결해 주었던 팁이었다.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글