• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

nodebird express clone

21.09.17 22:50 작성 조회수 193

1

공부삼아 혼자서 이것저것 clone 을 하고있는데여 

hashtag 부분에서 

typeorm 에서는 findOrCreate 가 없는것 같은데 무슨 메서드를 사용해야할까요 ?

답변 1

답변을 작성해보세요.

1

SJ님의 프로필

SJ

2021.09.18

안녕하세요 ! ㅎㅎ 가르쳐주신대로 잘 되지않아서 ㅠㅠㅠ 다시 코드를 고쳐봤는데요 .

질문자가 많으셔서 다시 얘기해드리면 , node express 강좌를 nest 로 클론하고 있구용

hash 부분을 할려고합니다.

 

현재 이렇게 작성을해서 

hashtag 가 테이블에 존재하지 않는다면 , hashtag 를 insert 하고 있구요 .

hashtag 가 테이블에 존재한다면 insert 하지 않고 해당하는 hashtag 를 find 해서 가져오게 됩니다. 

그렇게 해서 manytomany 테이블에 boardId 와 hashId 를 insert 하고 있습니다.

 

현재 정상적으로 데이터베이스에 insert 되는것을 확인했는데여 .

코드가 너무... 길어진것 같아서 혹시나 다른 방법으로 코드를 효율적으로 짤수있을까해서 질문남깁니다. ㅎ

그럼 즐건 추석되세요 

사실 반복문 안에서 쿼리를 돌리는 게 좋지 않습니다. 저라면 먼저 select 한번으로 해시태그를 검색하고, 없는 해시태그를 찾아낸 뒤 insert로 한번에 생성하고, 다시 걔네들을 find한 뒤 postHashtag에 관계설정해줄 것 같습니다. 그럼 네번에 됩니다

SJ님의 프로필

SJ

2021.09.19

감사합니다 ㅎ 다시 해보고 답변 다시 남기겠습니다 ㅎㅎ 감사합니다 ! 

SJ님의 프로필

SJ

2021.09.20

말씀하신대로 한번 바꿔봤는데 리뷰 다시 가능할까요 ?? ㅠ ㅎ

 반복문 안에서 쿼리 돌리는것을 제거해 봤습니다.

작동은 정상적으로 돌아가고 있습니다.

HashSliceLowcase.map 안에 getMany 하는 것도 반복문 내부 쿼리입니다. hashtag.hash IN(...hash)을 사용해서 한 방에 쿼리하세요.

SJ님의 프로필

SJ

2021.09.21

엇.. 감사합니다 ! :)

 

그리고 또 질문할것이 , hashtag 를 할때 , board 에서 body 로 받을땐 , hash 에 대한 값도 받기에 , 

1. boardService 에다가 hash 테이블에 insert 하는것까지 했는데 , 

그렇게 되면 , hash Controller 와 hash Service 에서는 사실 hash 리스트를 받고 get 하는 코드 밖에 없을것같은데 , 그래도 board Service 에 만들지 말고 

nest g mo hash

nest g s hash

nest g co hash

생성한뒤에 구현하는게 맞는거죠 ? 

2. 정상적으로 돌아가긴 했지만 .. 반복문 내에서 쿼리를 돌리는것이 왜 안좋은가요 ? 

1. 분리하셔도 되긴합니다. 다만 라우터는 없으니 컨트롤러는 안 만드셔도 됩니다.

2. 쿼리를 많이 날리면 db에 무리가 많이 갑니다. 네트워크 비용도 만만치않고요. 그런데 반복문은 특성상 몇 번 반복될지 사용자의 입력에 따라 다릅니다. 해시태그가 백만 개면 쿼리를 백만 개 날리는 겁니다. 그런데 IN을 쓰면 한 방에 쿼리를 날릴 수 있습니다.

SJ님의 프로필

SJ

2021.09.22

답변 감사합니다 :)