현재 Node.js로 API서버를 구축하고 있는데 통신하는 모듈로 Sequelize.js를 이용하고 있다. Django Rest framework를 사용할때는 또 그것만의 ORM문법을 배워서 사용했는데, 이젠 또 다시 문법을 공부해야한다. 심지어 document도 중구난방이라 배우기가 쉽진 않았다고 생각한다. 먼저 환경은 Node.js + Express + MySQL이다. 관계형 데이터베이스를 사용하고 있으므로 Sequelize의 Association 부분을 잘 살펴봐야 한다. 먼저 테이블의 구조는 다음과 같다.
[article]
- no(PK)
- subject
- content
- created_at
- updated_at
[comment]
- no(PK)
- content
- created_at
- updated_at
- article_no(FK to article)
심플하다. 단순히 이러한 구조로 되어있을 때 어떻게 해줘야 하는지에 대한 글을 작성하기 위함이라.
또한 두개의 테이블을 아래와 같이 관계를 맺어줬다.
다음으로 article과 comment테이블에 몇개의 데이터를 삽입한 후 테스트를 진행한다.
먼저 다음과 같은 코드를 작성한다.
작성된 모든 글이 잘 나올것이다.
{
"status":true,
"result":[
{
"no":1,
"content":"comment test",
"created_at":"2018-07-18T05:00:45.000Z",
"updated_at":"2018-07-18T05:00:45.000Z",
"article_no":1
}
]
}
아마 이러한 구조로 값이 나올 것이다.
하지만 아래처럼 게시글에 달린 모든 댓글도 같이 표현해주고 싶다.
{
"status":true,
"result":[
{
"no":1,
"content":"comment test",
"created_at":"2018-07-18T05:00:45.000Z",
"updated_at":"2018-07-18T05:00:45.000Z",
"article_no":1,
"comments": [
// 관련 댓글
]
}
]
}
위처럼 말이다.
sequelize 공식 문서(http://docs.sequelizejs.com/manual/tutorial/models-usage.html#eager-loading)를 읽어보면 Eager Loading이라는 것이 있다.
무슨 뜻인지는 모르겠고, 요약하자면 find()나 findAll()을 사용할 때 include옵션을 함께 줘서
관계가 설정된 테이블의 값을 끌어올 수 있다.
위에 작성했던 getArticle을 아래와 같이 바꿔준다.
findAll()로 바꿔줬고 include옵션에 Comment 모델을 넣어줬다.
위처럼 수정해준 후 값을 출력해보면,
{
"status":true,
"result":[
{
"no":1,
"subject":"test",
"content":"hihi",
"created_at":"2018-07-18T05:40:52.000Z",
"updated_at":"2018-07-18T05:40:52.000Z",
"comments":[
{
"no":1,
"content":"comment test",
"created_at":"2018-07-18T05:40:58.000Z",
"updated_at":"2018-07-18T05:40:58.000Z",
"article_no":1
}
]
},
{
"no":2,
"subject":"asksakkas",
"content":"hihiasd",
"created_at":"2018-07-18T06:00:15.000Z",
"updated_at":"2018-07-18T06:00:15.000Z",
"comments":[
{
"no":3,
"content":"aaaatest",
"created_at":"2018-07-18T06:00:38.000Z",
"updated_at":"2018-07-18T06:00:38.000Z",
"article_no":2
},
{
"no":4,
"content":"node",
"created_at":"2018-07-18T06:00:59.000Z",
"updated_at":"2018-07-18T06:00:59.000Z",
"article_no":2
}
]
}
]
}
이렇게 원하는대로 comments라는 값이 추가되어 관련된 댓글을 모두 불러오는걸 확인할 수 있다.
'Coding > Etc' 카테고리의 다른 글
Sequelize.js Incorrect table definition; there can be only one auto column and it must bedefined as a key 오류해결 (0) | 2018.07.18 |
---|---|
Node.js Express Json Beautifier (0) | 2018.07.18 |
Sequelize.js Association belongsToMany 정리 (0) | 2018.07.16 |
Sequelize.js Association OneToMany(hasMany) 정리 (0) | 2018.07.16 |
Sequelize.js Association belongsTo 정리 (0) | 2018.07.15 |