ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nest.js-TypeOrm 관계
    FrameWork/Nest.js 2022. 7. 7. 15:13

     

    typeorm-model-generator 설치

    npm typeorm-model-generator
    npm install -g npx

     

    entities 생성

    npx typeorm-model-generator -h localhost -d tempdb -u sa -p 3306 -x password -e mariadb

     

     

    Workspace가 회사 단위라면, Channel들은 부서 단위이다. 그러므로 Workspace하나가 Channel 여러개를 가진다.

    Workspace 시점에서 보면 Workspace -  Channel은 1:n 관계 즉 @OneToMany 관계이다.

     

    관계를 설정할 때는 관계를 맺느 상대 table에도 똑같이 설정해주어야 한다. 따라서 Channel 시점에서  

    Channel - Workspace의 n:1 관계 즉 @ManyToOne 관계를 Channel 엔티티 클래스에소 명시해주어야 한다.

     

    @JoinColum Workspace -  Channel class 둘 중 하나에만 명시하면 된다. 보통 ForeginKey가 있는 쪽에 붙이다. 다시 말해 1: n의 관계일 경우 Workspace의 id를 ForeginKey로 가지게 되는 n쪽인 Channel 쪽에 명시한다.

     

    ForeginKey가 들어가는 class에 @JoinColum을 넣어주고, 괄호안에 위 그림 처럼 ForeginKey 정보를 넣어 주면된다.

     

    그러면 Channel class에는 Workspace라는 객체가 생기면서 매개체는 WorkspaceId라는 cloumn이 된다. 즉, Join이 자동으로 가능해진다.

     

    반대로,

     

    Workspace class에서도 해당 Workspace에 종속되어있는 Channel들의 객체들을 생성해 준다.

     

    @Column 데코레이터가 붙은 column은 해당 엔티티와 매치되는 테이블에 실제 존재하는 column이지만 @ManyToOne이나 @OnetoMay가 붙은 column은 join했을때 typeorm이 만들어주는 가상의 column이다. 

     

     

    @OneToMany()의 속성

    Workspaces.ts

    첫번째 파라미터로는 생성되는 객체(인스턴스 변수)의 참조type인 Channels를 적고, 두번째 파라미터로는 반대쪽 class가 인스턴스변수화 되었을 때   현재 file해당하는 class의 객체를 멤버 변수로 어떻게 표현할지를 적는다.

     

    @ManyToOne()의 속성

    Channels.ts

    마찬가지로, 첫번째 파라미터로는 생성되는 객체(인스턴스 변수)의 참조type인 Workspaces를 적고, 두번째 파라미터로는 반대쪽 class가 인스턴스 변수화 됐을때 현재 file에 해당하는 해당하는 class의 객체를 멤버 변수로 어떻게 표현할지 적는다.

     

    * ON DELETE SET NULL : 부모 테이블의 PK 값을  자식 테이블에서 FK로 참조하고 있을 때, 부모 테이블에서 특정 레코드를 삭제하려고 하면  참조 하고 있는 PK값 때문에 error가 하면 해당 레코드가 삭제되지 않는다. 이때 on  delete cascade 설정을 해주면 부모테이블에서, 특정 레코드를 삭제하려고 할때 이를 참조하고 있는 자식테이블의 FK 값을 NULL 값으로 변경하면서 참조 무결성을 유지한다.

     

    *ON UPDATE CASCADE : 부모 테이블에서 PK 값이 수정될 경우 이를 FK로 참고하고 있는 자식테이블의 값도 부모테이블의 수정된 값을 가지는 것으로 수정 되면서 참조 무결성을 유지하는 것을 의미한다.

     

    @ManyToMany

    Workspaces - Users가 @ManyToMany관계라고 할 수 있다. 왜냐하면 한 Users 여러개의 Workspaces에 들어갈 수 있고 한 Workspaces가 여러명의 Users를 가질 수 있기 때문이다.

     

    보통 ManyToMany 관계에는 중간 table존재하고 예시에서는 WorkspaceMembers가 중간table이다.

     

    ⭐Tip 

    버그가 생길 시 @ManyToMany는 @OneToMany 두개로 나눌수 있다.

    Workspaces - Users

    Workspaces - WorkspaceMembers - Users

     

    Workspaces.ts

    Users.ts

     

    @OneToMany/@ManyToOne은 @JoinColumn을 FK를 가지는 쪽 entity class에 넣어 주었다. 이와 다르게 @ManyToMnay관계의 entity는 @JoinTable을 넣어서 연결해 준다. n:n 관계이므로 중간 table이 생기기 때문이다.

     

    @JoinTable의 속성으로 name은 중간 table이 되는  workspacemembers를 넣어준다. 또 다른 속성인 joinColunm과 inverseJoinColumn이 바뀌면 error가 발생할 수 있으므로 주의한다. 해당 entity class file이 User.ts이므로 inverseJoinColumn에 Works

     

    @ManyToMnay는 갑을 관계가 없음으로 둘 중 하나의 entity class에 넣어준다. 

     

    @OneToMany: 하나의 table 대상 table과 두개의 관계

    Users - DMs 는 1:n의 관계이다.  1:n 관계가 2번 맺어진다. 

    • 보내는 사람 정보
    • 받는 사람 정보

    사용자가 DM을 보낼 때 DM은 받는사람과 보내는 사람 2명의 이 생기므로 User table과 두개의 관계가 생긴다.

     

    관계 데코레이터의 세번째 파라미터 option

    @OneToMany/@ManyToMany 의 세번째 파라미터는  option의 자리이다. option에 cascade에 대한 정보를 넣을수 있다.

     

    Workspaces를 수정하면서, WorkspceMembers 까지 같이 수정하고 싶다면, 즉 한번에 두개의 table을 수정할려고 하려면 이를 가능하도록 지원해준다. 

     

    참조 관계에 있는 두개의 Table을 한번에 수정(update,soft-delete)하고 싶다면 cascade option을 켜두어야 한다.

    댓글

Designed by Tistory.