콘텐츠로 건너뛰기

upsert = insert + update를 처리하는 로직

DB에 데이터를 저장할 때, 빈번하게 사용되는 로직중에 insert/update가 있다.
먼저 select 한 뒤,
데이터가 존재하지 않으면 insert,
데이터가 존재하면 update를 하도록 한다.
(혹은 update를 먼저하고 exception이 발생하면 insert를 하도록 구현하는 경우도 있다)
public void renewMemberInfo(Member member) {
  Member originMember = memberRepository.selectMember(member.getId());

  if (originMember.isNotEmpty()) {
memberRepository.update(member);
  } else {
memberRepository.insert(member);
  }
}

하지만 이런 부분을 DBMS에서 처리해주는 경우가 있다.
즉, insert를 시도하다가 duplicate key 오류가 발생하면 update를 해주는 것이다.
내부 로직을 뜯어보면 위와 비슷할지 모르지만…
적어도 개발자 눈에 보이는 것은 훨씬 깔끔해진다. (캡슐화라고 볼까나…)
public void renewMemberInfo(Member member) {
  memberRepository.upsert(member);
}
<insert id=“upsert” parameterClass=“member”>
  INSERT
    INTO member
    ()
    VALUES
    ()
  ON DUPLICATE KEY UPDATE
    ()
< /insert>
큐브리드를 기준으로 한 SQL이고, 오라클에서는 merge를 제공한다고 한다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다