본문 바로가기
카테고리 없음

[TALEND] 동적 파일 스키마 읽어오는 방법

by escaper101 2021. 4. 7.

 

이번 포스팅에서는 파일 등의 비정형 데이터를 input으로 가져올 때 파일의 스키마를 동적으로 읽어오는 방법을 알아보자. 실무에서 사용한 Talend는 커뮤니티 버전으로 Open Source Tool이었다. 이 오픈 소스 버전 Talend는 매우 다양한 기능을 제공하지만 동적 스키마를 읽어오거나 Job에 scheduler를 걸어 특정 시간에 반복되도록 만드는 기능 등은 제공하지 않는다. 하지만 비슷한 기능을 오픈 소스 버전을 이용해서도 만들어 볼 수 있다. 

 

나의 경우는 20여개의 파일을 읽어 DB 테이블에 이관하는 케이스가 있었는데 이때, 파일의 칼럼명 자체를 DB의 한 칼럼에 데이터로서 저장해야했다. 이때, 사용한 방법을 공유하려고 한다. 완성된 Job은 다음과 같다. 

 

완성된 Job

칼럼명을 DB에 넣어주는 로직은 생략하였고 이 포스팅에서는 비정형 데이터 이관 시 동적으로 스키마를 읽어오는 작업에 중점을 두어 완성된 Job은 비교적 심플해보인다. 

 

tSetGlobalVar 설정

우선 tSetGlobalVar 컴포넌트를 사용해 읽어올 칼럼명을 담을 변수를 생성한다. 나는 아래와 같이 HashMap 자료구조를만들었고 columnMap이라는 key 값을 주었다. 이렇게 설정하면 Job 내에서 전역으로 사용할 수 있는 globalMap에 columnMap이라는 key 값으로 HashMap 변수가 생성된다. 추후 해당 Map을 사용하려면 globalMap에서 가져올 수 있다. 

 

tFileInputExcel 설정

tFileInputExcel 컴포넌트의 설정을 주목하자. 여기서 limit의 값을 1로 입력한 이유는 해당 파일의 header 즉, 칼럼명만 읽어올 것이기 때문이다. 그리고 Edit schema를 클릭하여 왼쪽 사진과 같이 임의로 이름을 설정한 칼럼을 추가해준다. 이 부분이 오픈소스 버전의 한계로 보여진다. 칼럼명은 동적으로 읽어올 수 있지만 해당 파일의 칼럼 수 만큼 미리 임의로 스키마를 만들어놓아야 한다. 읽을 파일의 칼럼명이 최대 50개라면 50개 만큼 임시 칼럼을 추가하여 대략적인 스키마를 구성해놓아야 한다는 것을 기억하자. 

 

tJavaRow

tJavaRow의 코드는 다음과 같다. 첫번째로 앞서 tSetGlobalVar 컴포넌트로 만들어놓은 HashMap을 key 값을 이용해 globalMap에서 가져온다. 다음은 for 문으로 row1의 필드값에 접근하여 해당 field의 필드명을 읽어온다. Java 의 reflection으로 동적 타입을 가져오는 방식과 동일하다. 위 두 작업을 수행할 때 필요한 라이브러리 util과 reflect는 tJavaRow의 Advanced settings에서 import할 수 있다. Talend는 IDE가 아니기 때문에 툴 자체에서 라이브러리를 자동으로 import해주지 않는다. 이 작업을 해주지 않으면 Map, Set 등의 자료구조를 사용할 수 없고 더 나아가 Job 실행이 안될 수 있으므로 잊지말고 해주어야 한다. 

 

동적 스키마 결과

이제 Job을 실행하면 col1, col2 등의 이름으로 임시로 만들어 놓은 칼럼에 대한 실제 엑셀 파일의 칼럼명을 동적으로 불러오는 것을 확인할 수 있다. Talend Open Studio 버전에서 사용할 수 없는 동적 스키마 기능을 대략 비슷하게 구현해보는 방법을 알아보았다. 상황에 따라 유용하게 쓰일 수 있으니 기억해두면 칼럼을 하나하나 매핑하는 노가다 성 업무를 줄일 수 있을 것이다.