upsert는 "update"와 "insert"의 합성어로, 데이터베이스 작업에서 흔히 사용되는 기술이다. upsert 작업은 주어진 데이터가 이미 데이터베이스에 존재하는지를 체크한 후, 데이터가 존재하면 업데이트를, 존재하지 않으면 새로운 레코드를 삽입하는 과정을 단일 작업으로 수행한다. 이 방식은 데이터의 중복을 방지하고, 애플리케이션 로직을 더 단순화할 수 있는 장점이 있다.
Supabase에서 upsert 메서드는 PostgreSQL의 INSERT ... ON CONFLICT 구문을 추상화한 것으로, 사용자가 복잡한 SQL 문법을 직접 작성하지 않고도 upsert 작업을 쉽게 수행할 수 있도록 해준다.
Supabase의 upsert 메서드는 대상 테이블에 데이터를 삽입하려고 시도하며,
만약 주어진 고유 키(예: 기본 키(primary key))에 해당하는 레코드가 이미 존재한다면,
해당 레코드를 새 데이터로 업데이트한다.
const { data, error } = await supabase
.from('your_table')
.upsert({ id: 1, column_name: 'value' }, { onConflict: 'id' })
이 예시에서는 'your_table'에 id가 1인 레코드를 탐색하고, 해당 레코드가 존재하면 column_name을 'value'로 업데이트를 한다. 만약 레코드가 존재하지 않는다면, 새로운 레코드를 추가해준다.
onConflict: 이 옵션은 어떤 열(또는 열의 조합)이 충돌을 감지하는 데 사용될지 정의한다. 일반적으로 이것은 테이블의 기본 키나 고유 제약 조건이 적용된 열이다.
주의사항
성능: upsert 작업은 내부적으로 데이터의 존재 여부를 체크하기 때문에, 단순한 insert나 update 작업보다는 다소 오버헤드가 발생할 수 있다.
그러나 이는 데이터의 일관성과 무결성을 유지하는 데 필수적인 작업이다.
충돌 감지: upsert는 충돌을 감지할 기준이 필요하다. Supabase와 같은 시스템에서는 이를 위해 주로 기본 키나 고유 제약 조건이 사용된다.