이번 포스팅에서는 매우 유용한 컴포넌트 몇 가지를 바탕으로 동적 쿼리를 생성하는 방법을 알아보자.
우선 이번에 처음 살펴볼 tFlowToIterate 컴포넌트는 input 데이터를 한줄 한줄 읽어 전역 변수에 저장한다. 우리는 이렇게 전역변수에 저장된 데이터를 가져다 쿼리를 조각하는데 활용할 수 있다.
tFlowToIterate를 활용하여 만든 가장 기본적인 job 완성본은 다음과 같다.
일단 개별 컴포넌트를 설명하기 전 작업을 진행할 소스 데이터의 내용은 다음과 같다. 테이블의 데이터는 employees 데이터를 담고 있으며 PK, birth_date, first_name, last_name, gender, hire_date의 여섯개의 칼럼으로 이루어져있다.
위 예시에서는 excel 파일에 저장된 데이터를 tFlowToIterate를 통해 읽어 employees 테이블에 소스 데이터를 가져오는 쿼리를 만들 때 활용하고 있다. excel 파일의 내용을 한줄 한줄 읽을 때마다 쿼리가 동적으로 변경되어 매번 다른 데이터를 가져와 output으로 출력한다.
이제 개별 컴포넌트와 그 설정 내용을 하나씩 살펴보자.
tFileInputExcel로 읽어오는 파일에는 동적 쿼리를 만들때 사용할 알파벳이 A~Z까지 포함되어 있다.
그 다음 tFlowToIterate 컴포트는 위와 같이 설정한다. 기본값은 use the default in global variables가 체크되어 있을 것이다. 이를 언체크하면 value 값을 가져올 key 값을 원하는 대로 설정할 수 있다. 나는 value와 동일하게 data로 key값을 설정했다. 이제 전역 변수 globalMap에서 data이라는 이름으로 앞서 설정한 excel 파일로 한줄 한줄 읽어오는 데이터를 가져올 수 있다.
소스 데이터를 추출할 동적 쿼리는 위와 같이 만들어진다. 쿼리의 like 절에 excel에서 읽어오는 알파벳을 추가하였다. 이때 전역변수인 globalMap에서 알파벳 데이터가 담긴 변수를 가져올 때 key 값은 tFlowToIterate 컴포넌트에서 설정한 alphabet이라는 값인 것을 주목하자. 또한 alpabet 변수를 string 타입으로 가져오기 때문에 이를 String 타입으로 형변환하고 있다.
소스 테이블에서 데이터를 가져올 동적 쿼리까지 완성이 되면 세팅은 거의 마무리 되었다. 이제는 상황에 따라 output으로 target DB를 연결하거나 Talend 내부의 log에 쿼리로 가져온 데이터를 출력하는 tLogRow를 연결하면 Job을 실행할 준비가 끝났다.
여기서 몇가지 컴포넌트를 추가하여 한 단계 더 응용해보자. 앞서 살펴본대로 우리는 계속 employees 테이블을 사용할 것이다. 이번에는 last_name 칼럼에 알파벳 별로 시작 글자로 데이터를 가져오는 방식과 더불어 입사 월 별로 데이터를 가져오는 task를 수행해야 한다고 가정해보자. 우리는 이번에도 excel 파일에 월 데이터를 추가해놓고 이를 tFlowToIterate으로 한줄 한줄 읽어가며 동적 쿼리를 만들어 볼 것이다. 그렇다면 별개의 Job을 만들어야 할까? 아래 엑셀 파일의 구조를 살펴보자.
읽어올 파일은 두 개의 시트로 나누어져있고 last_name 시트에는 위의 예시에서 본 것과 같이 last_name 칼럼에 조건으로 들어갈 알파벳들이 입력되어있다. 두번째 시트인 birth_month에는 1월~12월까지의 데이터가 들어있다. 어떻게 두 개의 다른 조건을 바탕으로 동적 쿼리를 만들 수 있을까? 첫번째, 각 시트에 입력된 데이터를 읽어올 별개의 프로그램을 만드는 방법이 있겠다. 다른 방법으로는 프로그램 실행 전 어떤 시트의 데이터를 불러올 것인지 선택하면 해당 시트의 데이터를 한줄 한줄 읽어 employees 테이블에서 가져오는 방식의 Job을 만들어보자. 우선 완성된 Job의 모습은 아래와 같다.
프로그램 실행 전 두 개의 상이한 데이터 (알파벳과 월)로 구분된 파일을 선택하기 위한 컴포넌트로 tMsgBox를 사용할 수 있다. 이는 실제 소스 DB를 읽는 작업 전에 수행되어야 하는 작업임으로 tPreJob으로 연결하여 프로그램 시작 전 선작업으로 수행되도록 설정한다.
메세지 박스로 설정은 위와 같이 마쳤다. Buttons 옵션을 Question으로 설정해야 user가 텍스트를 입력할 수 있는 textbox가 실행된다. 에러 발생여지를 줄이기 위해 입력 가능한 시트명을 메세지 박스에 표기하였다.
이제 tMsgBox로 입력 받은 시트 명을 바탕으로 동적 쿼리의 where 조건을 만들어보자. 이는 tJave 컴포넌트로 수행하였다. tJave 컴포넌트를 사용하면 해당 컴포넌트 안에서 Java 코드 작성이 가능하다. 라이브러리 import가 필요한 작업의 경우 Advanced settings를 통해 할 수 있다. 간략하게 작성해 본 코드는 위와 같다. 메세지 박스에 user가 입력한 데이터는 앞서 살펴본 전역 변수 globalMap에 tMsgBox_1_RESULT라는 key 값으로 저장된다. 이 값이 last_name이면 last_name 칼럼에 알파벳으로 조건을 주고 birth_date이면 birth_date 칼럼에 월 데이터로 조건을 주도록 했다. 마지막으로 이렇게 만든 where 조건의 일부를 query라는 변수에 저장한 후 다기 globalMap에 넣어두었다. 이 변수는 차후 실제 소스 DB에서 데이터를 가져올 때 사용될 쿼리이다.
그 다음 단계는 앞서 살펴본 예시와 거의 동일하다. 우선 위와 같이 tFileInputExcel에 설정을 변경해준다. user가 입력한 시트명에 해당하는 시트의 데이터를 가져오도록 하기 위해 필요한 설정이다. user가 last_name이라는 값을 입력했을 때 last_name 시트에서 알파벳 데이터를 한줄 한줄 읽을 것이고 birth_month를 입력한 경우 월 데이터를 한줄 한줄 읽을 것이다. 즉, 데이터를 담고 있는 엑셀의 시트 선별 또한 동적으로 가능해진다.
이제 위와 같이 소스 테이블에서 데이터를 가져오는 쿼리를 수정한다. 우선 globalMap 전역 변수에서 앞서 tJave에서 만들어 놓은 query 변수를 이어 붙이고 그 후에 tFileInputExcel에서 가져오는 알파벳 또는 월 데이터를 담고 있는 data 변수까지 이어붙인다.
이렇게 몇가지 컴포넌트의 활용법만 익히면 Talend를 활용하여 손쉽게 동적 쿼리를 만들 수 있다. 물론 각각의 쿼리에 따라 별개의 Job을 구성할 수 있지만 이렇게 하면 동일한 작업을 여러번 수행하지 않아도 되기 때문에 매우 편리하다. 또한, 이를 바탕으로 여러 가지 다양한 migration 케이스에 적용할 수 있다.
'TALEND' 카테고리의 다른 글
[TALEND] Talend 내장함수 알아보기 (0) | 2021.04.07 |
---|---|
[TALEND] 서로 다른 소스 데이터 집계하기 (0) | 2021.04.07 |
Data Migration 업무를 수행하고 (0) | 2021.04.06 |
[TALEND] sequence 만들기 (0) | 2021.01.01 |
[TALEND] 탈렌드로 간단 배치 프로그램 생성 (0) | 2020.12.30 |