본문 바로가기

회고/TIL

2023 - 07 - 04 TIL

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