insert, update 두 테스트 모두 번거로움

데이터 업데이트에서 레코드가 있으면 update,
없으면 insert 라는 논리는 자주 있다고 생각합니다.

이때 두 테스트를 모두 해야 하는 것이 귀찮습니다.
insert가 정상이라도 update에 버그가 있을지도 모르기 때문입니다.
//レコードが無ければ insert
if ( $exist == false ) {

    $sql = "insert into 社員マスタ ( ShainNo, Name, Address, Tel ) values ( $ShainNo, '$Name', '$Address', '$Tel' )";

//レコードがあれば update
} else {

    $sql = "update 社員マスタ set Name = '$Name', Address = '$Address', Tel = '$Tel' where ShainNo = $ShainNo";

}

//ホントはプリペアドステートメントにしてね
$dbh->exec($sql);

그렇지만, 본 기사의 마지막에 말하는 「즈보라 방식」으로 하면,
테스트 공수도 줄일 수 있고 편합니다.

정규 코딩의 경우



예를 들면 「사원 마스터」의 갱신이라면,
직원 번호/이름/주소/전화 번호 ...
하나씩 문제없이 저장되는지 확인합니다.

먼저 insert 를 테스트합니다. 문제가 없으면 update 테스트이지만,
같은 값으로 그대로 update 하는 것은 안됩니다.
insert 로 등록한 값과는 다른 값으로 update 합니다.

예를 들어, [야마다]로 insert하면,
[야마다 2]에서 update 하고, 확실히 update 했는지를 체크합니다.

이렇게 하지 않으면
「버렸다! update 로 주소만 갱신이 몰레 했다!」
그리고 나중에 깨달을 수도 있습니다.



만약 테이블 정의로부터 자동으로 SQL을 생성한다.
O/R 매퍼? (← 고멘 잘 모르는 것)이 있으면
코딩도 테스트도 편합니다만, 그런 것도 없고,
SQL을 직접 고리고리 쓰는 회사도 아직도 있습니다.

다음은 그러한 회사의 프로그래머를 위해,
「즈보라 방식」의 소개입니다.

즈보라 방식



insert에서는 한 번에 모든 열을 등록하는 대신
기본 키만 등록(insert)하고, 직후에 다른 컬럼을 update 합니다.

「사원 마스터」의 경우, 이름이나 주소는 공백인 채,
우선 기본 키의 직원 번호만 값을 설정하고 insert 합니다.
그런 다음 바로 이름과 주소에 값을 설정하고 업데이트합니다.

(처음부터 update의 경우 update 처리만 수행합니다.)

//レコードが無ければ 主キーのみ insert
if ( $exist == false ) {
    $sql = "insert into 社員マスタ ( ShainNo ) values ( $ShainNo )";
    $dbh->exec($sql);
}

//レコードの有無にかかわらず update
$sql = "update 社員マスタ set Name = '$Name', Address = '$Address', Tel = '$Tel' where ShainNo = $ShainNo";
$dbh->exec($sql);

//しつこいけどプリペアドステートメントでね

즈보라 방식의 장점은 insert 의 코딩과 테스트 공수를
줄일 수 있습니다.
insert 와 update 의 로직이 거의 같기 때문입니다.

문제점?



●insert일 때는 insert와 update로 2회 액세스가 발생한다.

자주 갱신하는 테이블이라면 1회의 액세스로 억제해야 합니다만,
마스터 등록과 같이 가끔 갱신하는 정도라면,
두 번 액세스해도 문제 없다고 생각합니다.

● 단 한 순간이지만, 이름이나 주소가 빈 레코드가 존재하게 된다.

궁금하다면 insert ~ update를 트랜잭션으로 설정하면
빈 레코드가 다른 사용자에게 보이지 않도록 할 수 있습니다.

●다른 즈보라 방법으로서 delete 후 insert 해도 좋습니까? ( update 생략을 위해 )

이것은 ... 가능한 한 그만둡시다.
어쨌든.

좋은 웹페이지 즐겨찾기