Node.js 를 사용하며 정말 예상치도 못한 부분에서 헤매었다.
그것은 바로 " 순환참조 " 때문인데,
하나의 예시를 들어 게시판을 생각해보자
게시판의 구조를 위해 필요한 3가지 ( Post , Comment , User ) 를 있다 가정해보고, 각각의 연관관계를 생각해 보았을때
User는 여러개의 Post, 여러개의 Comment를 작성할 수 있고, Post는 여러개의 Comment를 갖고 있을 수 있다.
나는 Sequelize 라는 ORM 을 사용했는데, 시퀄라이즈 메서드 중에 hasMany 와 belongsTo 라는 메서드를 동시에 사용할 경우 발생할 수 있다.
User.js 에서 hasMany 를 통해 Post, Comment 를 각각 연결 해주고, Post 와 Comment 에서도 belongsTo 를 해주면 무한 루프에 빠지게 되는것이다.
왜❓
👉 우리는 연관관계를 맺어주기 위해 require('....') 를 통해 import 해오게 된다. User 에선 Post,Comment를 해오고 반대로 Post,Comment 에선 User를 import 해오기 때문에 연관관계를 맺으러 들어갔다가 다시 또 돌아오게 되는 그런 현상이 반복되어지게 되는것이다.
// User.js
const Post = require('./post.js');
const Comment = require('./comment.js');
const User = sequelize.define('user',{
...
});
User.hasMany(Post);
User.hasMany(Comment);
module.exports=User;
// Post.js
Const User = require('./user.js'); // 순환참조의 발생지점
const Post = sequelize.define('post',{
...
});
Post.belongsTo(User);
module.exports=Post
근데 여기서 알아야 할 점 !
Node.js 는 자체적으로 이 순환참조를 해결해주는 기능을 가지고 있다. 다만 이것이 완벽히 처리를 해주지 않기때문에 에러가 발생하는 것을 인지해야 한다. 그럼 Node.js는 그것을 어떻게 해결해주느냐 를 알아보자면 " 빈 객체 👉 {} 를 반환해준다. " 그래서 에러 자체는 발생하지만 혹시 반환을 받은 그 값을 활용해 다시 무언가를 행하려 한다면, 빈 객체이기에 정상적으로 수행이 안되기에 계속 에러가 발생하는것!
참고 링크 : https://blog.outsider.ne.kr/1283
'회고 > TIL' 카테고리의 다른 글
Typescript - Generic (0) | 2023.07.28 |
---|---|
2023 - 07 - 05 TIL (0) | 2023.07.05 |
2023-06-20 TIL (0) | 2023.06.20 |
2023-06-19 TIL (0) | 2023.06.20 |
2023-06-13 TIL (0) | 2023.06.14 |