> For the complete documentation index, see [llms.txt](https://hyomee.gitbook.io/solution/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hyomee.gitbook.io/solution/page1/gen/iss/0001.md).

# 반복/중복 수행

## 1. 문제점

화면에서 저장 이벤트가 발생이 되어 처리하는데 오랜 시간이 걸린다. 이것을 일반적으로 Long Transaction이 발생되었다고 이야기 한다. Long Transaction이 발생하는 여러 사유 중 반복/중복에 의해서 발생하는 것에 대해서 이야기 한다.&#x20;

## 2. 해결 방안

### 2-1. 원인

Application에서.많이 발생하는 문제로 업무 개발을 개발자 혼자 하는 경우 보다 영역(도메인)을 나누어서 개발 하는 경우 발생 많이 발생한다.&#x20;

* 동일한 조건으로 동일한 결과를 내는 쿼리  및 RestAPI 반복 수행&#x20;
* 틀린 조건으로 동일한 결과를 내는 쿼리  및 RestAPI 중복 수행&#x20;

<figure><img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2F4KedvnQ7mIfh1d9zzKWM%2Fimage.png?alt=media&amp;token=95556d95-69f4-4f9f-90ba-6d4b14f4925d" alt=""><figcaption><p>반복/중복 예시 Sequence</p></figcaption></figure>

반복/중복 예시 Sequence에서 가입정보를 조회하는 부분이 4군데 있다. 조회 조건으로 가입번호, 전화번호, ID(PK)로 조회 하여 반복 4회, 중복 2회 이지만 실제 조회되 결과는 모두 가입정보로 동일한 결과를 가지는 것으로 빈번한 DB I/O가 발생 하여 성능이 늦어 진다.

### 2-2.  해결

반복/중복을 되지 않게 코드를 변경하는 것으로 변경하는 다음과 같은 방법으로 변경한다.

#### 2-2-1. Transaction 구간 안에 있는 모든 Method에 파라메터(인수)로 전달

가장 일반적인 방법이지만 가장 안전한 방법으로 Transaction 구간에서 사용한 내부 객체를 만들어서 인수로 전달 하여 사용하고, *데이터의 수정이 발생하면 수정 후 반환 하여* Transaction구간내에서 정합성을 보장하여 처리한다.

#### 2-2-2. Transaction 구간 안애서 사용되는 Local Cache 사용&#x20;

Transaction 구간 내부에서 메서드를 여러개 호출 하고 있는데 파라메터로 객체를 넘길 수 없는 경우 공유 되는 객체에 대해서 Local Cache를 만들어서 Transaction 구간 안에서만 사용하도록 한다.

주의할 점은 Local Cache를 사용 하므로 Key 구조이다.&#x20;

#### 2-2-2. Transaction 구간 안애서 사용되는 Local  Thread 사용

가장 좋지 않은 방법으로 Thread가 종료 될 때 지워 주어야 한다.

&#x20;
