기본키가 아닌 컬럼과의 관계 설정

신연우·2021년 3월 18일
0

JobITs 회고

목록 보기
5/7

기본키를 바꾸게 되다

기능적으로 필요한 데이터를 구할 수가 없는 문제를 맞닥뜨리게 되어 DB 설계에 문제가 있었음을 알게 되었다.

그래서 테이블에 새로운 컬럼을 추가하는데, 이 컬럼에 auto increment 옵션을 부여해야 했기 때문에 기본키로 설정할 수밖에 없었다.

기존에 사용하던 기본키를 삭제하는 방법도 있었지만, 이미 충분히 개발이 진행된 상황이었고, 그래서 해당 키를 삭제한다면 코드의 대부분을 바꿔야 했다.

기본키 외 컬럼과 관계를 설정할 수 있는가?

일단 기본키 외에 컬럼과 관계를 맺을 일이 지금까지 단 한 번도 없었다. 과연 이게 되는 것인가라는 의문이 들 정도로 생소한 일이었다.

하지만, 기본키가 관계를 맺을 수 있으니 기본키 외 컬럼도 기본키와 동일한 기능을 할 수 있다면 관계를 맺을 수 있지 않을까라는 생각을 하게 되었다.

그러기 위해 해당 컬럼을 NOT NULL 제약 조건과 UNIQUE 제약 조건을 추가했다.

Sequelize ORM에서는 어떻게 만드는가?

이제 DB의 컬럼을 설정했으니 ORM을 사용한 개체 정의 코드와 관계 설정 부분을 살짝 손봐야 했다.

개체를 정의한 부분은 어려운 점 없이 고치는데 성공했으나, 관계 설정에서 애를 먹었다.

분명 외래키를 지니는 테이블에는 targetKey 프로퍼티를 추가하고, 외래키의 대상이 되는 컬럼을 지니는 테이블에는 sourceKey 프로퍼티를 추가하여 기본키 외의 컬럼과의 관계를 설정할 수 있다고 했다.

하지만, 어째서인지 해당 컬럼이 모델에 정의되어 있지 않다는 에러가 출력되면서 서버가 켜지지 않는 현상이 발생했다.

이 문제를 해결하기 위해 구글링을 하던 도중 좋은 글을 발견했다.

물론, foreignKey 프로퍼티에 대한 설명이었지만, 읽다 보니 언더바를 사용했기 때문이라는 생각이 들었다.

내가 ORM을 통해 모델을 정의할 때, 해당 프로퍼티의 이름을 카멜 케이스로 지었기 때문에 언더바를 사용하지 않았었다.

그래서 해당 모델에 정의한 프로퍼티의 이름으로 변경하니 정상적으로 동작하는 것을 확인했다.

참고로, 나 같은 경우는 관계를 맺는 양쪽 모델에서 sourceKeytargetKey 프로퍼티 값을 모두 설정해줘야 정상적으로 동작했다.

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글