정말 오랜만에 일기를 쓴다. 근 한달만인가?
그동안 여러 일이 있었고 최종프로젝트에 몰두하다보니 많이 소홀해 진 것 같다..
게다가 오랜만에 들어와서 보니까 그 전 일기들이 2022년으로 적혀있었다... ㅠㅠ
일단 최종프로젝트 하면서 insert bulk라는걸 처음 써봤는데 꼭 알아두어야 할 기능이라서 적도록 하겠다.
insert bulk를 적용하면서 시행착오가 많았다.
먼저 DB는 gym테이블과 이미지를 넣을 수 있는 gymImg테이블을 분리시켜놨다.
컨트롤러의 모습
nestjs 공식 Docs를 참고해서 멀터를 설정했고 우리 조는 외부저장소인 S3를 사용하기로 했다.
초기 서비스 코드
처음 설정했던 서비스 코드이다. 테이블이 따로 분리되있기 때문에 transaction을 사용해 한번에 데이터를 등록하고자 했다.
다만 여기서 문제가 발생했는데 여러개의 이미지를 선택하고 POST요청을 보내도 결국 DB에 저장되는 이미지는 하나만 들어갔다.
그래서 두 번째로 생각했던게 배열로 저장하는 방법이었다.
gymImgs라는 배열안에 여러개의 이미지를 반복문으로 돌리면서 하나씩 추가하는 방법
이렇게 저장할려고 했을 시 entity타입도 바꿔줘야 하고 무엇보다 따로 이미지 테이블을 분리한 의미가 전혀 없어보였다. 근본적으로 작동이 되는지도 의문이었다.
최종 코드
외래키까지 묶어 반복문을 돌리면서 gymImgs 배열에 넣었고 그걸 그대로 DB에 저장시키는 코드를 짰다.
여러개의 이미지를 넣고 코드를 작동시켰을 때 DB에 저장되는 모습이다.
Insert bulk의 이점은 대량의 데이터를 한번에 처리 할 수 있어 속도가 빨라지고 오버헤드를 줄일 수 있다고 한다. 또한 여러개의 파일을 처리할 때는 save대신 insert가 좋다고 알고있어서 최종 프로젝트 전까지 테스트해보고 서버에 좋은 방법을 채택할 예정이다.
p.s insert 대신 save를 써야하는 이유는 save의 경우 documents를 select 해오고 존재하지 않으면 insert 기능을 수행하고 존재한다면 documents 전체를 update시킨다.
즉 순수하게 데이터를 생성해서 넣고싶다면 insert가 좋다. select를 수행하지 않기 때문에 아무래도 빠르기 때문. 이게 데이터를 한두개넣는거면 딱히 상관이 없을텐데 여러개를 넣을때는 속도차이가 분명 존재할 것 같다.