2022. 5. 22. 15:36ㆍ책/Node.js 교과서
이전 글에서 모델간 관계를 설정해주는 일이 매우 중요하다고 설명했다. 예를 들어, 인스타에 가서 '존잘남'을 검색했다고 치자. 애플리케이션은 '존잘남' 이란 유저 한명을 표현하기 위해 아래와 같은 데이터들을 불러올 것이다. (더 있을 수도 있겠다만)
- '존잘남' 유저 1명이 쓴 여러개의 게시글
- '존잘남' 유저를 팔로잉하는 여러명의 유저들
- '존잘남' 유저가 팔로우하는 여러명의 유저들
- '존잘남' 유저가 쓴 여러개의 게시글
- 각 게시글에 달린 여러개의 해시태그
그럼 이제 모델간의 관계가 어떻게 지정되는지 알아보자
1. 1:N 관계

눈으로 보면 쉽게 이해가 되는데 이 관계를 코드로 딱 정립해주려면 뭐가 필요할까? 생각나는대로 적어보자.
- <Comment> 테이블에서 누가 코멘트를 썼는지는 commenter에 적혀있다
- commenter가 구체적으로 누구인지는 <User> 테이블의 id를 보면 알 수 있다
- 즉, commenter에 적힌 값은 <User> 테이블의 id를 출처로 삼고있다
- 한 명의 commenter는 여러개의 코멘트를 달 수 있다
이를 느낌대로 정리하면 다음과 같다.
- <Comment>테이블은 <User>테이블의 노예같은 놈이다
- 두 테이블의 상호 관계에 있어 핵심은 commenter 컬럼이다
- commenter는 <User>테이블의 id값이 source이자 <Comment> 테이블이 target으로 삼는 놈이다
이를 시퀄라이즈 코드로 나타내면 아래와 같다.

시퀄라이즈에서 만약 foreignKey를 따로 설정하지 않는다면 노예가 될 테이블 내부에 모델명+기본키로 컬럼을 하나 만들고, 이를 외래키로 삼는다. 즉, 여기서 'commenter'를 넣지 않았다면 <Comment> 테이블에 가서 userId란 컬럼을 만들고 foreignKey로 얘를 할당한다는 뜻.
2. N:M

이번엔 좀 더 어려운 관계다. <Comment>테이블의 id1 코멘트에 달린 태그가 #차 #벤츠로 2개이고, <HashTag>테이블의 '차'라는 태그랑 관련있는 글은 <Comment>테이블의 id1, id3 코멘트이다.
이 관계는 어떻게 관리하면 표현하기 쉽고 직관적으로 파악할 수 있을까? 답은 중간에 두 관계를 표현하는 세로운 테이블을 만드는 것이다.

이렇게 중간에 테이블을 하나 만들어서 껴주면 상호 조회가 더 편해진다. 특히, 시퀄라이즈에선 가운데 중개를 해주는 테이블을 자동으로 만들어주는 코드도 있으므로 활용하기 좋다. 또한, 시퀄라이즈가 자동으로 만들어준 PostHashTag 테이블은 db.sequelize.models.PostHashTag로 접근 가능하다.

3. N:M (심화)

이번엔 더 어려운 상황을 다뤄보자. 테이블은 하나인데 팔로우때문에 팔로워/팔로잉 이란 이상한 N:M관계가 생긴 상황이라면? 이럴 땐 3개의 테이블을 만들고, 팔로워 - 중개자 - 팔로잉 형태로 만들어 관리하면 된다.

db.User.belongsToMany(db.User, {
through: 'Follw', // Follow 모델을 통해
as: 'Following', // Following 으로서
foreignKey: 'followerId', // followerId를 참조해 팔로워를 찾겠음
});
db.User.belongsToMany(db.User, {
through: 'Follow',
as: 'Followers',
foreignKey: 'followingId',
});
'책 > Node.js 교과서' 카테고리의 다른 글
[8장] mongoDB/ODM (0) | 2022.05.22 |
---|---|
[8장] mongoDB (0) | 2022.05.22 |
[7장] MySQL/ORM (0) | 2022.05.08 |
[7장] MySQL (0) | 2022.05.07 |
[6장] Express / Router (0) | 2022.05.07 |