// getCuration
router.post('/curation/:id', async (req, res) =>{
const { isSong, object } = req.body;
try {
const check = await Curation.findOne({songoralbumid:req.params.id})
if(check == null){
const curation = new Curation({isSong, object, songoralbumid:req.params.id});
await curation.save();
res.send([curation,[]]);
}else{
const curationpost = await Curationpost.find({songoralbumid:req.params.id}).populate('postUserId')
res.send([check,curationpost]);
}
} catch (err) {
return res.status(422).send(err.message);
}
});
안녕하세여 형님들, 앱개발 서비스를 공부ㅜㅇ인 학생입ㄴㅣ다.. 제가 만든 서버속도가 조금 느려서 질문드립니다.
다음은 간단한 서버 예시입니다.
Curation은 게시글이고 CurationPost는 댓글 정도라고 생각하면 됩니다.
곡마다 공유의 아이디가 있어서 그것을 통해 큐레이션을 구분하는데, 만약 큐레이션이 존재하지 않다면
그것을 만들어서 디비에 저장해주고, 존재하다면 디비에서 그 정보를 가져오고 그 밑에 댓글들도 불러오는 것입니다.
유튜부를 예시를 들자면 메인화면에 여러 동영상들이 있고, 그 중에 어떤 동영상을 클릭하면 더 많은 정보들을 볼수 있듯이,
메인화면에서 큐레이션을 클릭할때 사용하는 함수라고 생각하시면 됩니다. 혹시 이 코드에서 잘못 된 점이 있다면 알려주시면 감사 드리겠습니다.
id로 인덱스는 만듬? findone 하면서 upsert하면 안댐?
일단 어디서 느려지는지 하나하나 시간 체크부터 해보셈
null일때 응답부터 해주고 디비 업뎃하면 클라입장에서 빠르다고 느낄수도있겠지
혹시 근데 응답부터 해주고 디비 업뎃을 하는게 맞는건가요??
그렇게 되면 만약 제대로 업뎃이 안되었을 경우에도 클리 입장에서는 잘 된거처럼 진행이 되는건데 응답부터 먼저 해주면 빠르다고 클리 입장에서 더 빨리 느낄수는 있어도 안전성? 같은 부분에서는 안좋은 코드 아닌가요?
경우에따라 다르겠지. 응답에 실패했을때 클라가 보고있는 정보가 잘못되었다능 상황이 크리티컬한 시나리오인가? 예를 들어 주식 가격 같은 거? 근데 저거는 그냥 비어있다거 알려주는거고 디비 업뎃이 싱패해도 다음 똑같은 요청에 같은 응답을 해주니까 큰 영향이 없다고 생각되는데
너가 결정할 문제인거지 머. 근데 일단 너 코드는 이미 안전하지 않음.
음 그렇군요! 근데 저기 위에서 check가 null이 아닌 경우 (else)인 경우도 반응이 느린편이라 ㅠㅠ 제가 무료판을 쓰고 있어서 느린건지 아니면 curationpost에 사진 정보같은게 있어서 무거운 데이터라 그런건지 아니면 제가 코드 구조자체를 잘못 짜고 있는건지 궁금해서요 ㅠ
db에 비어있는걸 확인하고 엠티 오브젝트를 추가했는데 그 시간이 10이 걸린다고 치자. 근데 다른 인스턴스에서 1이라는 시간동안 엠티 오브젝트 추가하고 다른 추가 op까지 다했는데 그 후에 10 걸린놈이 완료되면 이전 작업 날아가는거임
혹시 어느부분에서 안전 하지 않은건가요?ㅠㅠ
이 문제 해결하려면 upsert쓰명 댐
사진 데이터까지 다 가져오는거임? 필요없으면 쿼리로 걸러내셈.
아하 그부분은 제가 다시 생각해봐야곘네요....
내가 말한 문제가 잘 와닿지 않으면 db 트랜잭션 검색해보셈.
사진데이터가 다 필요해요!
넵넵 트랜잭션 부분 찾아보겠습니다 감사합니다!
아니면 사진 있다고 먼저 응답해주고 사진 차례대로 가져갈수있는 api 제공하셈.
사진은 어따 저장함? gridfs에 저장한거맞음? 거 코드상으론 안그런거같은데
보통 사진에 접근가능한 api따로 만들어놓고 저런 함수에서는 해당 사진에 접근가능 한 키값망 던져주지. 사진은 키가지고 클라에서 알아서 다시 api요청하는거고.
제가 apple music api에서 주는 모델을 그대로 저장하는거라
근데 제가 생각하기엔 else 부분만을 봤을때 제가 더 효율을 높일수 있게 바꿀만한 코드는 없다고 생각하는데 지금 속도가 맘에 안들면 디비 무료버전을 업그레이드 하는 방법밖에 없을것 같네요
엔터프라이즈랑 커뮤니티랑 성능상의 차이는없을걸? 딱히 느릴부분도 없는거처럼 보이는데... id인덱스는 했음? db에 도큐먼트 몇개있나여?
혹시 새로운 글에 사진을 다시 올려드려도 괜찮을까요?
일단 올려보시져
올렸씁니다!!
애초에 몽고디비는 속도 느림, 관계형처럼 쓸거면 걍 갈아엎는게 나을듯