-
Sequelize - 시퀄라이즈 활용1(관계설정)카테고리 없음 2024. 3. 22. 12:18
Sequelize(시퀄라이즈) 활용1
관계정의하기
users 테이블과 comments 테이블 간의 관계를 정의해보자 사용자 한 명은 댓글을 여러 개 작성할 수 있다. 하지만 댓글 하나에 사용자(작성자)가 여러 명일 수는 없다. 이러한 관계를 일대다(이하 1:N)관계라고 한다. 1:N 관계에서 사용자가 1이고, 댓글이 N이다.
다른 관계로는 일대일, 다대일 관계가 있다. 일대일 관계로는 사용자와 사용자에 대한 정보 테이블을 예로 들 수 있다. 사용자 한 명은 자신의 정보를 담고 있는 테이블과만 관계가 있다. 정보 테이블로 한 사람만을 가리킨다. 이러한 관계를 일대일(이하 1:1)관계라고 한다.
다대다 관계로는 게시글 테이블과 해시태그(#) 테이블 관계를 예로 들 수 있다. 한 게시글에는 해시태그가 여러개 달릴 수 있고, 한 해시태그도 여러 게시글에 달릴 수 있다. 이러한 관계를 다대다(이하 N:M)관계라고 한다.
MySQL에서는 JOIN이라는 기능으로 여러 테이블 간의 관계를 파악해 결과를 도출한다. 시퀄라이즈는 JOIN 기능도 알아서 구현한다. 대신 테이블 간에 어떠한 관계가 있는지 시퀄라이즈에게 알려주어야 한다.
1:N(일대다)
시퀄라이즈에서 1:N 관계를 hasMany라는 메서드로 표현한다. users 테이블의 로우 하나를 불러올 때 연결된 comments 테이블의 로우들도 같이 불러올 수 있다. 반대로 belongsTo 메서드도 있다. comments 테이블의 로우를 불러올 때 연결된 user 테이블의 로우를 가져온다.
models/user.js
... static associate(db){ db.User.hasMany(db.Comment,{foreignKey:'commenter',sourceKey:'id'}); } };
models/comment.js
... static associate(db) { db.Comment.belongsTo(db.User,{foreignKey:'commenter',targetKey:'id'}) } }
어떤 모델에 hasMany를 쓰고, 어떤 모델에 belongsTo를 쓰는지 헷갈릴 수 있다. 다른 모델의 정보(id)를 가지는 테이블에 belongsTo를 사용한다. 예제어서는 commenter 칼럼이 추가되는 Comment 모델에 belonsTo를 사용하면된다. 사용자는 한명이고, 그에 속한 댓글은 여러 개이므로 댓글 로우에 사용자(commenter)가 누구인지 적어야 한다.
시퀄라이즈는 위에서 정의 한대로 모델 간 관계를 파악해서 Comment 모델에 foreignKey(외래 키)인 commenter 컬럼을 추가한다. Commenter 모델의 외래 키 컬럼은 commenter고, User모델의 id 컬럼을 가리키고 있다.
hasMany 메서드에서는 sourceKey 속성에 id를 넣고, belongsTo 메서드에서는 targetKey 속성에 id를 넣는다. sourceKey의 id와 targetKey의 id모두 User 모델의 id이다. hasMany에서는 sourcekey를 쓰고, belongsTo에서는 targetKey를 사욯한다고 생각하면된다.
foreinKey를 따로 지정하지 않는다면 이름이 모델명+기본 키인 컬럼이 모델에 생성된다. 예를 들어 commenter를 foreignKey로 직접 넣어주지 않았다면 User(모델명) + 기본 키(id)가 합쳐진 UserId가 foreignKey로 생성된다.
설정을 마치고 서버를 시작하면 위와 같은 메시지가 나오는 것을 확인할 수 있다. 시퀄라이저가 스스로 실행하는 SQL문이다.
1대 1관계
- 예) 사용자 테이블과 사용자 정보(캐시) 테이블
db.User.hasOne(db.Cash, {foreginKey:'user', sourceKey:'id'}); db.Cash.belongsTo(db.User,{foreignKey:'user', targetKey:'id'});
1:1 관계라고 해도 belongsTo와 hasOne이 반되이면 안된다. belongsTo를 사용하는 Cash모델에 UserId 칼럼이 추가 되기 때문이다.
사용자 테이블과 1:1 관계를 가지를 테이블을 나누는 이유는 사용자 테이블 하나에 칼러이 너무 많으면 로딩하는데 시간이 너무 많이 걸리기 때문에 자주 사용되는 정보만 사용자 테이블에 같이 포함시키고, 덜 빈번하게 사용되는것 들은 나누워서 사용하는 것이 좋다.
어떤 쪽이 belongsTo 를 가질 것이냐는 어떤 테이블이 참조로 foreignKey를 가지고 있는지 여부로 결정된다.
N:M 관계
- 예) 게시글과 해시태그 테이블
- 하나의 게시글이 여러 개의 해시태그를 가질 수 있고 하나의 해시태그가 여러 개의 게시글을 가실수 있다.
- DB 특성상 다대다 관계는 중간 테이블이 생긴다.
시퀄라이즈에는 N:M 관계를 표현하기 위한 belongsToMany 메소드가 있다. 게시글 정보를 담소 있는 Post 모델과 해시태그 정보를 담고 있는 Hashtag 모델이 있다고 하면 아래 코드와 같이 표현 할수 있다.
db.Post.belongsToMnay(db.Hashtag.{through:'PostHashtag'}); db.Hashtag.belongsToMany(db.Post,{through:'PostHashtag'});
양쪽 모델 모두 belongsToMany 메서드를 사용한다. N:M 관계의 특성상 새로운 모델이 생성된다. through 속성에 그 이름을 적으면 된다. 새로 생성된 PostHashtag 모델에는 게시글과 해시태그의 아이디가 저장된다.
N:M에서는 데이터를 조회할 때 여러 단계를 거쳐야 한다. #노드 해시태그를 사용한 게시물을 조회하는 경우를 생각해보자. 먼저 #노드 해시태그를 Hashtag모델에서 조회하고, 가져온 태그 아이디(1)을 바탕으로 PostHashtag 모델에서 hashtageId가 1인 postId들을 찾아 Post 모델에서 정보를 가져온다.
[출처 - [개정3판]Node.js 교과서 - 기본부터 프로젝트 실습까지, 저 조현영]
https://www.inflearn.com/course/%EB%85%B8%EB%93%9C-js-%EA%B5%90%EA%B3%BC%EC%84%9C
[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 강의 - 인프런
노드가 무엇인지부터, 자바스크립트 최신 문법, 노드의 API, npm, 모듈 시스템, 데이터베이스, 테스팅 등을 배우고 5가지 실전 예제로 프로젝트를 만들어 나갑니다. 클라우드에 서비스를 배포해보
www.inflearn.com