'삽질'에 해당되는 글 1건

  1. 2008.04.07 트랜잭션 처리시 삽질하기 쉬운 로직 (2)

아래 글의 트랜잭션 처리와 관련하여 내가 겪었던 상황을 살펴볼까한다.

- 삽질했던 상황 -

DB로부터 목록을 조회한 후 목록안의 개별 아이템에 대한 작업을 수행한 뒤
개별 아이템별로 작업결과를 DB에 반영한다.

로직은 별로 복잡하지 않다. 근데 문제는 이거 2가지다.

- 전체 작업이 아니라 개별 작업결과를 커밋하길 원한다.
- 개별 작업은 1~10초 정도 시간이 걸리는 네트워크 작업이다.

처음에 아래처럼 코드를 작성했다.

public void 전체작업() {
  전체 목록 조회;
  for (아이템 : 전체목록) {
      try {
          아이템작업(아이템);
      } catch(에러) {
         //로깅
      }
  }
}

public void 아이템작업(아이템) throws 네트워크에러, DB에러 {
    네트워크작업(아이템);
    작업결과처리(아이템);
}

@Transactional
private void 작업결과처리(아이템) {
     // 아이템 가공
     dao.save(아이템);
}

나름 트랜잭션 스코프도 최소화하고 독립적으로 개별 아이템작업을 처리하기 위해 신경썼는데,

무지막지하게 삽질을 해댔으니... RTFM이 떠오른다.

이제 위 코드에서 왜 트랜잭션이 작동하지 않는지 이유를 알았으니 해결방안을 찾아야겠다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 에코지오

댓글을 달아 주세요

  1. BlogIcon 기선 2008.04.07 13:35 신고  댓글주소  수정/삭제  댓글쓰기

    private을 public으로 바꿔버리세요. 캬캬캬. ^^;;; (농담이에요.)

    • BlogIcon 에코지오 2008.04.07 17:05 신고  댓글주소  수정/삭제

      ㅎㅎ
      public으로 바꿔도 내부적으로 호출되는 메소드라서 문제가 되네요. -.-;;

      그래서 일단은 트랜잭션이 걸려야하는 작업결과처리(아이템) 메소드를 새로운 클래스에 정의하고 그 클래스 인스턴스를 통해 호출되도록 처리했습니다. ^^

      아니면 그냥 TransactionTemplate으로 처리할까, 고민이 되는 상황이에요...



티스토리 툴바