티스토리 뷰

현재 다니고 있는 회사도 그렇고, 많은 회사들이 실제로 FK 제약을 걸지 않지만, 논리적으로 같은 속성끼리 참조하여 JOIN 한다고 한다. 그래서 나도 현재 하고 있는 토이프로젝트에서 참조 제약을 걸지 않으면서 JOIN하는 방법을 쓰고 있는데, MikroORM을 이용해서 JOIN하는 방법을 정리해보려고 한다.

 

1. RAW QUERY 실행

EntityManager를 이용하면 Raw Query를 실행할 수 있다. 2개 이상의 join을 실행할 때는 Raw Query를 사용하는 게 편했다.

다만 EntityManager는 각각의 DBMS에 따라 import 해줘야 하기 때문에 여러 DBMS에서 호환시키려면 적합하지 않을 수 있다.

아무래도 내가 명시적으로 어떤 속성끼리 참조를 할 건지 작성하므로 마음이 편했다.

 

2. Entity의 option에 Join 명시

 

MikroORM의 Entity에서 ManyToOne, OneToMany, ManyToMany를 통해 참조를 할 수 있다. Migration을 사용하는 경우 이 데코레이터를 인식해서 FK가 자동으로 constraint가 적용되는데, 나는 constraint가 없는 경우이므로 아래처럼 작성하였다.

(여담으로 개인적으로 Migration 관리가 어려워서 DDL은 Raw Query로 관리한다. 도대체 migration 관리 어떻게 하면 잘 하는데요.)

 

 

ManyToOne, OneToMany, ManyToMany 데코레이터의 Option을 확인해보면 아래 속성들이 공통적으로 있다.

 

joinColumn은 현재 테이블에서 참조하는 column, referenceColumnName은 join하는 테이블에서 참조하는 column의 이름을 써준다. 근데 웃긴데 안 웃긴 건 referenceColumnName은 referenceColumnName이고, referencedColumnNames는 referencedColumnNames이다.

 

내가 여기서 헷갈려서 헤맸던 부분은 바로 Column 이름 부분이었다. MikroORM에는 이름 짓기 전략 (Naming Strategy) 가 있는데 MongoDB를 제외하고는 기본적으로 UnderscoreNamingStrategy를 채택한다.

NestJS에서 CamelUpperCase로 otherId로 작성해도 실제 DB 드라이버에는 other_id로 작성이 된다는 것! 따라서 joinColumn, referenceColumn에는 Underscore Case로 작성해주어야 한다!

 

다른 전략을 채택했다면, 어쨌든 실제 DB에 물리적으로 저장된 속성 이름을 적으면 된다.

 

MikroORM의 이름 짓기 전략은 아래 링크를 참고하면 자세하게 나온다.

https://mikro-orm.io/docs/naming-strategy

 

Naming Strategy | MikroORM

When mapping our entities to database tables and columns, their names will be defined by naming

mikro-orm.io

 

이 방법은 하나의 테이블만 JOIN하고, 항상 직렬화에 포함해야 할 때 유용하다.

 


 

EntityManager를 이용해 QueryBuilder를 사용하는 방법은 아직 찾아내지 못했다. 그리고 MikroORM은 javascript의 Knex.js를 지원하는데 개인적으로 Knex.js의 join 방법이 편했어서 알아볼 생각이다.

 

'Node.js > MikroORM' 카테고리의 다른 글

여러 속성을 PK로 설정하기  (0) 2022.09.19
mikro-orm migration not determine executable to run error  (0) 2022.08.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함