// 에드센스

 

Typeorm 문서에는 save() 메소드를 이렇게 설명한다

  • 엔티티가 이미 존재하면 update
  • 엔티티가 존재하지 않으면 insert

 

엔티티가 이미 존재하는지 어떻게 알까?

그렇다.

save() 메소드를 호출하면 select쿼리를 한번 실행시키고 그 뒤에 insert나 update 쿼리를 실행시킨다.

 

즉, 쿼리가 두번 나간다.

 

 

 

요런 코드를 돌려보자

[1]에서 콘텐츠 엔티티를 저장하고

[2]에서 저장한 엔티티를 조회하여 수정하고

[3]에서 수정한 엔티티를 다시 저장해보자

 

 

 

쿼리는 어떻게 발생할까?

[1]에서는 기존에 없던 저장돼 있지 않던 엔티티이기에 select 쿼리 이후 insert쿼리가 발생한 것을 볼 수 있다.

[3]에서는 해당 엔티티의 pk기준으로 이미 존재하는 엔티티이기에 select 쿼리이후 update 쿼리가 발생한 것을 볼 수 있다.

 

 

 

근데 이제 select 쿼리는 계속 발생한다는 말인데 만약 저장하거나 수정해야 할 데이터가 많다면 각 쿼리마다 select 쿼리가 발생할텐데 상당히 비효율적이 아닐수가 없다.

 

 

 

직접 update() 메소드나 insert() 메소드를 사용하면 이런 문제를 개선할 수 있다.

 

 

얌전하게 하나의 쿼리만 발생했다.

 

 

 

물론 save() 메소드가 주는 편리함을 포기하고 사용하는 것이므로 update나 insert를 할 때 디비에 중복되는 데이터가 이미 존재하는지 확인된 상태에서 사용하는것을 권한다. save()는 그냥 무지성으로 사용해도 pk가 겹치는게 아닌 이상 의도한대로 동작은 했는데 update(), insert()는 아니다.

 

 

'DB' 카테고리의 다른 글

[Real MySQL] 인덱스  (1) 2024.10.31
[DB] 데이터베이스 정규화  (0) 2021.07.14

+ Recent posts