728x90
TypeORM save() or insert() / update()
.save() 의 동작은 아래와 같다.
- 아직 존재하지 않는 엔티티를 삽입
- → INSERT, UPDATE
- 엔티티가 존재하지 않는 경우, 기존 엔티티를 업데이트 시도
- → SELECT 를 통해 객체에 정의된 PK를 사용하여 엔티티 존재여부 확인
반면에 **.insert()**와 **.update()**는 주어진 엔티티(객체) 자체를 데이터베이스에 INSERT 한다. 즉 존재여부는 파악하지 않는다. 그렇기 때문에 .save()와 비교하면 연산 자체가 짧아진다.
또한 .save()와 .inset(), .update()는 반환값의 차이가 존재한다.
- save()의 경우
await Auser = this.ARepository.save(user);
return user;
- insert() / update()의 경우
* {
* "identifiers": [
* ...
* ],
* "generatedMaps": [
* ...
* ],
* "raw": {
* "fieldCount": 0,
* "affectedRows": 1,
* ...
* }
* }
위와 같은 삽입된 레코드 수와 같은 METADATA를 포함하는 결과 객체인 insertResult, updateResult를 반환받는다.
따라서 .save() 와 .insert()의 용도를 사용하여 선택하여야 to DB 횟수가 줄어들어 상대적으로 성능이 좋아질 수 있는 것을 명심해야한다.
추가적으로,
모든 비교는 pk를 기준으로 진행한다. 옵션값이 존재하는지는 정확히 알 수 없으나, PK로 동일한 값 체크를 진행하다보니 비교하기 위한 값이 pk로 강제된다는 부분이 존재한다.
테이블을 설계할때, 보통 많은 사람들이 고유 자동 증가값인 number 혹은 guid를 사용하여 pk를 설정하는데 이렇게 설정할 경우 TypeORM의 기본 PK 비교기능이 동작하지 않아 모든 데이터가 중복저장되니 유의하여야한다.
728x90
'사이드 프로젝트' 카테고리의 다른 글
perplexity 퍼플렉시티 api 사용법, postman 호출해보기 (2) | 2025.03.18 |
---|---|
Nest.js + React.js (Next.js) 사이드 프로젝트 : Repository extend (0) | 2025.03.17 |
Nest.js + React.js (Next.js) 사이드 프로젝트 : 페이징 구현하기 (1) (0) | 2025.03.12 |
nest.js 를 이용해 크롤링 해보기 (1) - puppeteer 동적 크롤링 (0) | 2025.03.07 |
Nest.js + React.js(Next.js) 사이드 프로젝트 : 트러블슈팅 (0) | 2025.02.28 |