[TIL_2024.1 .2] Nest.JS-N:M 테이블 연결

김효진·2024년 1월 2일
0

개인과제 주제로 영화예매사이트를 만들고 있다.
처음에는 예약을 다루는 테이블과 좌석 테이블을 그냥 연결했었는데 생각해보니 표를 여러장 사면서 자리를 예약하는 경우도 있어 어떻게 테이블 구조를 만들면 좋을지 고민하다가
데이터를 다룰 때 접근이나 조회가 조금 더 수월하게 하기 위해 예약테이블과 좌석테이블을 N:M으로 연결했다.

typeorm의 경우 N:M 연결을 하면 자동으로 중간테이블이 생성된다.

    // reservation.entity.ts

    ...
    ...
    // N : M, 예약정보 여러개가 여러개의 좌석을 가질 수 있음
    @JoinTable()
    @ManyToMany(() => MovieSeat, (moviesSeats) => moviesSeats.reservations)
    moviesSeats: MovieSeat[];
    // movieSeat.entity.ts

    ...
    ...
    // N : M , 영화 좌석 여러개가 여러 예매정보에 들어갈 수 있음
    @ManyToMany(() => Reservation, (reservations) => reservations.moviesSeats)
    reservations: Reservation[];

@JoinTable() 의 경우 보다 메인이 되는 테이블에서 사용한다.

번외로 eager 옵션에 대해 알게되었는데
어떤 테이블에 외래키의 외래키로 다른 테이블이 조인되어 있을때 이 외래키에 대해 eager을 true로 설정하면 해당 테이블의 외래키의 외래키 정보들(영화상영시간 테이블에 연결된 영화예약 외래키에 연결된 유저테이블이 조인되어 있는 경우 유저테이블 정보들을 가져올 수 있음)을 가져올 수 있다.
해당 옵션을 사용하지 않는 경우 relation으로 특정 테이블을 연결해도 해당 테이블에 연결되어져 있는

그냥 생각해봐도 연결되어 있는 더 많은 정보를 가져오다보니 서버가 느려질 수 있다는 단점이 있다.
잘 고민해보고 필요한 경우 사용하는 걸로 하자.

// 사용 예시 -> 해당 테이블이 메인으로 조회하는 테이블의 외래키의 외래키로 연결되어 있는 경우 상세정보도 함께 조회할 수 있다
    @ManyToOne(() => MovieRoom, { eager: true })
    movieRoom: MovieRoom;

말이 조금 헷갈리는데
예를 들면 예약테이블에 영화테이블이 연결되어있고 그 영화테이블에 영화상영시간 테이블이 연결되어있다고 가정했을때 그냥 예약테이블에 영화테이블을 조인해 조회하면 영화테이블에 있는 영화상영시간테이블 정보는 가져올 수 없고 영화상영시간테이블의 아이디도 조회되지 않는다.
이때 영화상영시간 테이블에서 { eager: true } 옵션을 추가하게 되면
예약테이블에서 영화테이블을 조인하여 조회를 할 때 영화상영시간테이블의 내용까지도 가져올 수 있는것이다.

profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!

0개의 댓글