[typeORM] typeORM 넘어져보기 (1:1 관계와 1:N관계)
시작하며
현재 진행 중인 프로젝트에서 OrderItem - Product엔터티의 관계설정 진행 중 마주친 문제와 해결 방법을 기록하려 합니다.
마주친 문제
OrderItem과 Product엔터티는 1:N관계를 맺고 있었고, OrderItem에 ProductId는 외래키로서 Product엔터티의 id를 참조하고 있었습니다. 개발 진행 중 OrderItem이 Product의 정보를 하나만 갖고 있으면 되는 상황이라 판단했고, 두 엔터티 간의 관계를 1:1로 수정하고 데이터를 삽입하여 테스트를 진행하는 도중 마주친 에러와 알게 된 사실, 해결한 방법을 기술하려 합니다.
두 엔터티 관계)
위 두 엔터티를 보면 OrderItem테이블에 FK가 생성될 것이고, FK의 필드 이름은 procudtId입니다. Product는 해당 쇼핑몰의 제품정보입니다.
여기서 저는 하나의 OrderItem이 하나의 Product를 갖는 맥락으로 이해했고, 이론적으로도 알맞은 로직이라고 생각해서 1:N관계에서 1:1 관계로 수정 후, 데이터를 넣었을 때 아래와 같은 에러를 마주쳤습니다.
위 에러는 mysql에서 중복된 값이 들어왔을 때, 생성되는 에러라는 것을 알게 되었습니다. MySQLWorkbench에서 OrderItem테이블 정보를 찾아보던 중, 해당 테이블의 ProductId FK가 UNIQUE로 설정되어 있다는 것을 발견하게 되었습니다.
typeORM은 1:1관계를 설정하면 FK가 생기는 필드에 자동으로 UNIQUE를 설정하게 된다는 것을 알게 되었고, 동일한 상품의 주문을 하게 되었을 때 UNIQUE였던 FK가 곂치면서 위에 에러를 발생시킨다는 사실을 깨닫게 되었습니다.
그렇다면 UNIQUE를 false로 하면 되겠다고 생각하고, @OneToOne의 옵션값을 확인했지만 unique옵션 설정값이 존재하지 않다는 것을 알게 되었습니다. 해당 문제의 해결 방법은 간단하게 1:N으로 관계 설정을 하는 것이라는 매우 간단한 방법이 있었습니다.
https://github.com/typeorm/typeorm/issues/1877 -> 문제에 대한 해결방법
마치며
typeORM문서를 보면서 각각의 데이터베이스마다 동작방식과 옵션값이 다를 수 있고, MySQL에 대해서 좀 더 알아볼 수 있는 시간이었습니다. 해당 데이터베이스와 ORM에 대해서 기본적인 것들을 놓치면서 개발을 하고있다는 생각을 하게되었습니다.
기본을 알아가는 과정에서 문제를 마주치고 해결하며 기초가 튼튼한 개발자가 되고 싶습니다.