프로젝트 진행 중에, 모델에서 관계 쿼리를 설정하는 부분에 대해서는 자세히 나와있었는데, 이 모델에 데이터를 등록하는 것에 대해 자료가 별로 없어서 정리해보았습니다.
먼저 user와 following 을 1대 다 관계로 설정했습니다.한 유저가 여러 명의 following을 가질 수 있는 겁니다.
DB diagram은 이렇게 될 겁니다.
이럴 경우 sequelize 모델 설정입니다.
여기까지는 문제 없이 할 수 있었는데, 이제는 테이블을 만들었으니, api가 주소가 갈대마다 이 테이블에 데이터를 조회하고 넣는게 문제 였습니다.
데이터를 조회하기 위해서는 findOne이나 findAll을 사용할 것입니다. 하지만 지금 저희가 조회해야할 내용은 user 테이블에서 follwing과 관계설정이 되어있는 user를 찾는 것입니다.
이럴 경우 include
을 사용해서 이를 해결할 수 있습니다.
const { user } = require('../models')
user.findOne({
include : { model : following, where : { name : req.body.name } }
})
위에 까지는 어찌저찌 이해할 수 있었지만 문제는 그다음, 데이터를 가지고 올 수 는 있었지만 이제는 데이터베이스에 테이블에 맞춰서 데이터를 추가하여야 했습니다.
첫 시도는 위와 같은 방식으로 했지만, 당연히 되지않았습니다. 알고보니 수정, 생성, 삭제는 sequelize관계 쿼리는 다른 방식으로 해야됬습니다.
const user = await user.findOne({ where : {name : req.body.name}})
const following = await following.create({ following : req.body.name, user_id : req.body.id})
await user.addFollowing(following);
처음에 이 코드를 보고, addFollowing
이 뭘까...나는 저런걸 선언한적이 없는데 갑자기 저런게 왜 등장할까 싶었습니다. 알고봤더니 모델에서 관계를 설정했다면 동사 뒤에 모델의 이름이 붙는 형식의 메서드를 지원한다고 합니다.( 원리는..찾아봐도 안나오네요)
위에 메서드 말고도 다른 메서드도 있습니다.
get(테이블이름) : 조회
set(테이블이름) : 수정
add(테이블이름) : 하나 생성
add(테이블이름)s : 여러 개 생성
remove(테이블이름) : 삭제