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
'Spring JPA' 카테고리의 다른 글
[JPA] 복합키 (Composite Key) - @IdClass, @EmbeddedId (0) | 2022.01.15 |
---|---|
[JPA] Fetch Join ( N+1 문제 해결) (0) | 2021.09.01 |
[JPA] 일대다 @OneToMany 연관관계 매핑(1:N) (0) | 2021.08.05 |
[JPA] 일대일 @OneToOne 연관관계 매핑(1:1) (0) | 2021.07.27 |
[JPA] 연관관계 매핑 관련 용어 정의 (0) | 2021.07.20 |