Programming/Spring Boot

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기

Jan92 2023. 11. 28. 23:16

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기

database view, jpa entity 매핑하기

해당 포스팅은 '데이터베이스 가상 테이블인 View를 Entity에 매핑하는 방법'을 정리한 내용입니다.

 

먼저 데이터베이스에서 View란 무엇인지를 간단하게 살펴보고, 이어서 '1. 생성된 View에 Entity를 매핑하는 방법''2. View가 생성되지 않은 상태에서 Entity에 매핑하는 방법'에 대해서 살펴보겠습니다.

 


View란?

(View)란 데이터베이스에 존재하는 가상의 테이블입니다. 가상의 테이블이라는 이름처럼 실제로는 데이터를 가지고 있지 않은데요.

View는 데이터가 아닌 SQL을 저장하여 보여주는 것만을 목적으로 하는 테이블입니다.

 

이처럼 View는 SQL을 저장하기 때문에 '1. 여러 테이블을 조인하는 복잡한 쿼리문을 View로 만들어서 간소화'하거나, '2. 반복적으로 사용되는 쿼리문을 View로 만들어서 관리하는 목적'으로 사용됩니다.

 

추가적으로 뷰는 데이터 보안에도 유리한데요.

뷰를 조회하면 컬럼과 데이터만 공개되기 때문에 원천 테이블에 대한 정보를 알 수 없습니다.

예를 들어 어떤 유저가 특정 테이블을 봐서는 안 되는 경우인데, 해당 테이블의 데이터 중 일부가 필요한 경우 View를 통해 필요한 데이터만 보여줄 수 있습니다.

(실무에서는 view table이라는 것을 구분하기 위해 테이블명 앞에 'vw_'를 붙여 뷰 테이블임을 명시해 주는 방식으로 사용됩니다.)

 

 


생성된 View에 Entity를 연결하는 방법

@Getter
@Entity
@Table(name = "fruit")
public class Fruit {

    @Id
    private Long id;
    private String name;
    private Long colorId;
}

@Getter
@Entity
@Table(name = "color")
public class Color {

    @Id
    private Long id;
    private String name;
    private int code;
}

(예시로 사용할 Entity)

 

CREATE OR REPLACE view vw_fruit
AS
  SELECT f.id,
         f.name AS fruit_name,
         c.name AS color_name
  FROM   fruit f
         JOIN color c
           ON c.id = f.color_id;

데이터베이스에서 다음과 같이 View를 생성합니다.

 

@Immutable
@Entity
@Table(name = "vw_fruit")
public class VwFruit {

    @Id
    private Long id;
    private String fruitName;
    private String colorName;
}

그리고 해당 View와 연결할 Entity를 생성합니다.

이때 View와 연결되는 Entity에는 @Immutable 어노테이션을 적용시켜 주는데요. @Immutable 어노테이션을 통해 Hibernate에게 해당 Entity 객체가 수정되지 않을 것이라고 명시합니다.

 

***

Primary Key가 하나 이상일 경우 @IdClass 또는 @EmbeddedId 어노테이션을 사용하여 여러 컬럼에 대한 복합키를 설정할 수 있습니다.

 

 


View가 생성되지 않은 상황에서 사용할 수 있는 방법

@Immutable
@Subselect(
        "SELECT f.id, f.name AS fruit_name, c.name AS color_name\r\n" +
                "FROM fruit f\r\n" +
                "JOIN color c\r\n" +
                "ON c.id=f.color_id"
)
@Entity
@Table(name = "vw_fruit")
public class VwFruit {

    @Id
    private Long id;
    private String fruitName;
    private String colorName;
}

만약 데이터베이스 상에서 View가 생성되지 않은 상황이라면, 다음과 같이 @Subselect 어노테이션에 View 내부적으로 사용되는 쿼리를 설정하여 뷰 테이블을 생성한 것과 동일하게 사용할 수 있습니다.

(이렇게 사용할 수는 있지만 데이터베이스 상에 View가 존재하지 않는 상태라는 것은 동일합니다.)

 

 

 

< 참고 자료 >

https://joomn11.tistory.com/107

https://haenny.tistory.com/415