SMALL

View

데이터베이스에서 View는 가상 테이블이다.

View를 사용하는 이유로는 여러 테이블을 조인하는 경우와 같이 복잡한 SQL을 간소화시키기 위해서입니다.

 

이러한 View를 Spring JPA에서 어떻게 사용하는지 알아보도록 합시다.

 

@Table

 

View 생성

CREATE OR REPLACE VIEW ROLE AS 
SELECT u.user_id,
       ut.user_id AS u_id
FROM   USER u
       JOIN user_team ut
         ON u.id = ut.user_id;

 

Entity 생성

@Entity
@Immutable
@Table(name = "role")
@Getter
public class Role {

    private String userId;
    
    @Id
    private UUID uId;

    private UUID teamId;

}

@Table, @Immutable Annotation을 추가하여 Entity 생성

@Table에는 View를 생성한 name을 작성

@Immutable - 해당 Entity에 매핑되는 것은 View이기 때문에 조회만 하고 수정은 존재하지 않는다.

 

이렇게 SQL View에 매핑되는 Entity를 작성할 수 있다.

추가적으로, @Subselect Annotation을 통해서도 가능하다.

 

@Subselect

해당 Annotation은 SQL View를 생성하지 않고 View를 생성할 때 사용하는 Join query를 Annotation에 설정하는 방식이다.

 

@Entity
@Immutable
@Subselect("SELECT u.user_id,\r\n" + 
        "       ut.user_id AS u_id,\r\n" + 
        "FROM   USER u\r\n" + 
        "       JOIN user_team ut\r\n" + 
        "         ON u.id = ut.user_id")
@Getter
public class Role {

    private String userId;
    
    @Id
    private UUID uId;

    private UUID teamId;

}

 

복합키 View ( @IdClass + @Table )

추가적으로, View를 생성하면 여러 테이블을 join 하여 생성하므로 일반적인 Entity와 같이 PrimaryKey가 하나 이상일 경우가 존재한다.

이러한 경우에는 @IdClass Annotation을 사용하여서 여러 Column을 조합하여 Primary Key를 설정할 수 있다.

 

View 생성

CREATE OR REPLACE VIEW ROLE AS 
SELECT u.user_id,
       ut.user_id AS u_id,
       tpr.team_id,
       tpr.page_id
FROM   USER u
       JOIN user_team ut
         ON u.id = ut.user_id
       JOIN uteam t
         ON t.id = ut.team_id
       JOIN team_page_role tpr
         ON t.id = tpr.team_id;

 

Entity 생성

@Entity
@Immutable
@Table(name = "role")
@Getter
@IdClass(RoleId.class)
public class Role {

    private String userId;
    private UUID uId;

    @Id
    private UUID teamId;

    @Id
    private UUID pageId;

}

이러한 식으로 Entity에 @Id를 한 개 이상 추가할 수 있다.

@IdClass Annotation 추가 해당 class 생성

 

 

@IdClass

@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class RoleId implements Serializable {

    private static final long serialVersionUID = 1122593031541339037L;

    @EqualsAndHashCode.Include
    UUID teamId;

    @EqualsAndHashCode.Include
    UUID pageId;
}

@IdClass를 사용하는 자세한 내용은 아래의 포스팅을 통해 확인할 수 있다. ( JPA 복합키 생성 )

https://joomn11.tistory.com/105

 

LIST

+ Recent posts