포스트

노드 학습 15일차

안녕하세요 🐸

관계 쿼리

SQL의 JOIN의 역할을 하는 기능을 시퀄라이즈에서도 사용할 수 있으며 크게 두 가지 방법을 사용할 수 있습니다.

include

시퀄라이즈의 조회 기능에 include 를 통해 JOIN 과 비슷한 기능을 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
const user = await User.findOne({
	include:[
		{
			model:Comment
		}
	]
});
console.log(user.Comments);

여기서 했갈리기 쉬운 포인트 입니다.

  1. user.Comment 가 아닌 user.Comments 로 복수형을 사용함.
  2. include 는 배열을 전달. 여러 관계 모델을 포함할 수 있기 때문.
  3. 변수가 user 는 첫 글자가 소문자이지만, 관계 모델 Comment 의 첫 글자는 대문자

Comments 인 이유는 User 모델과 Comment 모델이 일대다 관계이기 때문에 User는 다수의 Comment 를 가질 수 있기 때문에 시퀄라이즈가 이를 자동으로 이름을 지어 사용합니다.

get 함수 사용

시퀄라이즈에서 모델의 관계를 함수로 만들어줍니다.

1
2
3
const user = await User.findOne({});
const comments = await user.getComments();
console.log(comments);

시퀄라이즈에서 User 모델과 Comment 모델의 관계를 처리하여 getComments() 함수가 생성되어 이를 사용할 수도 있습니다.
여기서도 두 모델의 관계가 일대다 관계이기 때문에 getComment 가 아닌 getComments 임을 주의합니다.

as 구문으로 별칭 설정

모델의 관계를 설정할 때 as 구문을 통해 모델의 별칭을 지어줄 수 있습니다.
여기서 지어진 별칭은 앞서 설명한 get함수에도 영향을 끼칩니다.

예시로 관계를 설정할 때 다음과 같이 설정했다고 가정합니다.

1
db.User.hasMany(db.Comment,{foreignKey:'commenter',sourceKey:'id',as:'Answers'})

위와 같이 했다면 이제 Comment 모델은 Answer 로 이름을 사용하기로 했으므로 관계 쿼리에도 다음과 같이 영향을 끼칩니다.

1
2
const user = await User.findOne({});
const answers = await user.getAnswers();

주의할점
include 구문을 사용하는 경우에는 모델의 원래 이름을 사용해야 합니다. as 구문을 통해 모델의 별칭을 지어줘도 모델의 이름은 변함이 없기 때문입니다.

생성 쿼리

관계 모델의 생성 쿼리는 크게 두 가지 방법이 있습니다.

  1. create 할 때 부터 관계를 명시 하는 방법
  2. create 한 자료의 관계를 만들어주는 방법

create 할 때 부터 관계를 명시 하는 방법

다음 예시에서 User 모델과 Comment 모델의 FK는 commenter 입니다.

1
2
3
4
const user = await User.findOne({});
const comment = await Comment.create({
	commenter : user.id
});

이렇게 되면 Comment 데이터는 생성됨과 동시에 user에 관계를 가집니다.

create 한 자료의 관계를 만들어주는 방법

add+모델명 함수를 사용하여 관계를 정의할 수도 있습니다.

1
2
3
4
5
const user = await User.findOne({});
const comment = await Comment.create();

await user.addComment(comment);
await user.addComment(comment.id);

위의 예시와 같이 comment 자체를 사용할수도 있고, comment의 id를 사용할 수도 있습니다.

그리고 여러 개를 추가할 때에는 다음과 같이 배열로 추가할 수 있습니다.

1
2
3
4
const user = await User.findOne({});
const comment1 = await Comment.create();
const comment2 = await Comment.create();
await user.addComment([comment1,comment2]);

여기서 했갈릴 수 있는게, 앞서 시퀄라이즈가 일대다 관계 모델들의 관계 쿼리는 복수형으로 이름을 만들어줬는데 여기서는 단수형입니다. 이 점에 주의합니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.