wecode-bootcamp-korea / 41-2nd-PetWithU-backend

1 stars 1 forks source link

[Modify] 커뮤니티 글쓰기 API - Bulk Insert 구현 #23

Closed Judy-Choi closed 1 year ago

Judy-Choi commented 1 year ago

:: 최근 작업 주제 (하나 이상의 주제를 선택해주세요.)


:: 구현 목표 - 해당 브랜치(PR)에서 구현하고자 하는 하나의 목표 작성

:: 구현 사항 설명 - 해당 브랜치(PR)에서 작업한 내용 작성

:: 테스트 결과 이미지

  1. Server가 잘 동작하는지 확인할 수 있는 Terminal 캡쳐 이미지
  2. Postman(Client Tool)을 이용한 API 테스트 결과 이미지
  3. 작성한 Test Code가 잘 통과했는지 확인할 수 있는 이미지
  4. DB 작업 PR인 경우 Table 생성 및 수정 결과에 대해 확인할 수 있는 이미지


:: 기타 질문 및 특이 사항

Judy-Choi commented 1 year ago

[Feedback 내용] bulk insert는 for문을 대체하는 용도라고 생각하시면 됩니다. 복잡한 로직없이 for문으로 insert를 매번 한다는 것은 반대로 한 번에 집어넣는 bulk insert가 가능합니다.

for (obj of postList) {
  await appDataSource.query(
    `INSERT INTO 
    community_posts(user_id) 
    VALUES ${obj.userId}           <- 이 부분
      `
  );

작성하신 코드에서 VALUES 뒤의 형태를 for문으로 조합해서 한번에 넣으면 될 것 같네요. 지금 상황의 로직과는 전혀 연관이 없어보입니다!

Judy-Choi commented 1 year ago

멘토님 bulk insert 를 우선 가장 간단한 hash INSERT 에 적용해보려고 합니다.

  1. 쿼리를 감싸고 있던 for 문을 앞으로 빼서 bulk 데이터셋을 만들었어요.
    const bulk_arr = [];
      console.log(postObj.hashtag);
      for (hash of postObj.hashtag) {
        const tmp = [user_id, post_id, post_detail_id, hash];
        bulk_arr.push(tmp);
      }

bulk 데이터셋은 이렇게 생겼고요. image

  1. bulk 배열을 쿼리문에 인자로 전달하여 한번에 INSERT 하려 했는데 syntax 에러가 납니다 😂 VALUES IN 이 잘못된 것인지, [[ ], [ ], ...] 형태의 bulk 데이터셋이 잘못된 것인지 모르겠습니다 ㅠㅠ
    await appDataSource.query(
        `INSERT INTO community_hashtags
          (user_id, post_id, post_detail_id, hashtag) 
          VALUES IN (?)
              `,
        [bulk_arr]

이 부분만 도움 부탁드려도 될까요?

bigfanoftim commented 1 year ago

멘토님 bulk insert 를 우선 가장 간단한 hash INSERT 에 적용해보려고 합니다.

  1. 쿼리를 감싸고 있던 for 문을 앞으로 빼서 bulk 데이터셋을 만들었어요.
const bulk_arr = [];
      console.log(postObj.hashtag);
      for (hash of postObj.hashtag) {
        const tmp = [user_id, post_id, post_detail_id, hash];
        bulk_arr.push(tmp);
      }

bulk 데이터셋은 이렇게 생겼고요. image

  1. bulk 배열을 쿼리문에 인자로 전달하여 한번에 INSERT 하려 했는데 syntax 에러가 납니다 😂 VALUES IN 이 잘못된 것인지, [[ ], [ ], ...] 형태의 bulk 데이터셋이 잘못된 것인지 모르겠습니다 ㅠㅠ
await appDataSource.query(
        `INSERT INTO community_hashtags
          (user_id, post_id, post_detail_id, hashtag) 
          VALUES IN (?)
              `,
        [bulk_arr]

이 부분만 도움 부탁드려도 될까요?

이 부분 한번 확인해주세요! 데이터 형태가 다르게 보이네요.

image
Judy-Choi commented 1 year ago

멘토님!!!!!!!!! bulk insert 돼요!!!!!!!!!!!!!!!! 감사합니다!!!!!!!!!!!!!!! 🤩

단순 for 문만 적용되어 있었던 community_images 테이블 그리고 community_hashtags 테이블에 bulk insert 적용했습니다!

const image_bulk_arr = [];
      for (infoObj of infoList) {
        const tmp = [
          postId,
          postDetailId,
          infoObj.productId,
          infoObj.x,
          infoObj.y,
        ];
        image_bulk_arr.push(tmp);
      }

      const imageSql =
        "INSERT INTO community_image (post_id, post_detail_id, product_id, point_x, point_y ) VALUES ?";
      await appDataSource.query(imageSql, [image_bulk_arr]);

      const hash_bulk_arr = [];
      for (hash of postObj.hashtag) {
        const tmp = [userId, postId, postDetailId, hash];
        hash_bulk_arr.push(tmp);
      }

      const hashSql =
        "INSERT INTO community_hashtags (user_id, post_id, post_detail_id, hashtag) VALUES ?";
      await appDataSource.query(hashSql, [hash_bulk_arr]);
    }

다만 bulk insert 구현 과정에서 기존에 쓰지 않던 임시 저장 변수들을 사용하였는데 이렇게 하면 insert 속도는 빨라졌을지 몰라도 메모리를 낭비하는 셈입니다.

const image_bulk_arr = [];
const tmp
const hash_bulk_arr
const tmp

const 를 var 내지 let 으로 바꾸고 변수를 재사용하는 방법이 있겠지만 초기화를 제대로 안 해주면 쓰레기값이 들어가는 버그가 날 가능성이 있고 초기화 처리를 꼼꼼히 해주자니 다른 할 일이 많아서 일단 이렇게 짰습니다 😂

p.s) 제 코드는 더럽...... 😞🍝 멘토님은 the love..... ❤️