(TypeORM) TypeORM - View Entity

최건·2025년 5월 9일

참고 문서

View Entity란?

  • DB View를 표현하는 읽기 전용 엔티티
  • @ViewEntity() 데코레이터로 정의
  • 실제 테이블이 아니라 SQL SELECT 문을 기반으로 구성됨

예시

@ViewEntity({
  name: "post_category", // 생략 가능
  expression: `
    SELECT post.id AS id, post.name AS name, category.name AS categoryName
    FROM post
    LEFT JOIN category ON category.id = post.categoryId
  `,
})
export class PostCategory {
  @ViewColumn()
  id: number;

  @ViewColumn()
  name: string;

  @ViewColumn()
  categoryName: string;
}

또는 QueryBuilder로도 표현 가능:

@ViewEntity({
  expression: (dataSource: DataSource) =>
    dataSource
      .createQueryBuilder()
      .select("post.id", "id")
      .addSelect("post.name", "name")
      .addSelect("category.name", "categoryName")
      .from(Post, "post")
      .leftJoin(Category, "category", "category.id = post.categoryId"),
})
  • 중요: where("... = :value", { value }) 형태의 파라미터 바인딩은 안 된다. 문자열 리터럴만 사용 가능.

ViewEntity vs 일반 Entity 차이점

항목EntityViewEntity
매핑 대상테이블뷰 (SELECT 결과)
읽기/쓰기읽기/쓰기 가능읽기 전용
사용 목적데이터 저장 및 조작여러 테이블 집계, 통계
쿼리 정의 방식없음expression으로 정의

실행 흐름 요약

  1. PostCategory 테이블 생성
  2. 그 둘을 조인한 PostCategory ViewEntity 생성
  3. @ViewColumn()으로 SELECT된 값을 매핑
  4. ViewEntity는 entities: [PostCategory]로 등록 필요
  5. find() 또는 findOneBy()로 일반 엔티티처럼 조회 가능
const postCategories = await dataSource.manager.find(PostCategory);
// 결과: [{ id: 1, name: "About BMW", categoryName: "Cars" }, ...]
profile
개발이 즐거운 백엔드 개발자

0개의 댓글