Talend 면접에서는 보통 두 가지를 봅니다. 하나는 합리적인 데이터 통합 잡(job)을 설계할 수 있는지, 다른 하나는 잡이 왜 느리거나 깨졌는지 원인을 찾아낼 수 있는지입니다. 구성 요소(컴포넌트, 서브잡, tMap, 컨텍스트 변수)에 대한 질문이 나오고, 이어서 오류, 성능, 배포에 관한 시나리오가 나온다고 예상하세요.
Talend는 이제 Qlik의 일부가 되었고, 제품 라인도 여러 해에 걸쳐 바뀌었습니다. 채용 공고를 확인해서 팀이 데이터 통합 또는 빅데이터 라이선스가 있는 Talend Studio를 쓰는지, Talend Cloud를 쓰는지, 아니면 예전 오픈 소스 구성을 쓰는지 파악하세요. 아래 개념들은 모두에 적용되지만, 컴포넌트 이름과 배포 세부 사항은 다릅니다.
가장 많이 듣게 될 질문들
Talend란 무엇이고 어떻게 코드를 생성하나요?
Talend는 데이터 통합 도구입니다. 캔버스에서 컴포넌트를 연결해 잡을 만들면 Talend Studio가 그 설계로부터 Java 코드를 생성합니다. 잡을 실행하면 그 코드가 컴파일되어 실행됩니다. 이 점이 면접에서 중요한 이유는, tJava나 tJavaRow 컴포넌트에 커스텀 Java를 넣을 수 있는 이유, 루틴이 Java 클래스인 이유, 메모리 설정이 JVM 설정인 이유를 설명해 주기 때문입니다.
잡, 서브잡, joblet의 차이는 무엇인가요?
잡은 전체 워크플로입니다. 서브잡은 데이터 흐름 링크로 연결된 컴포넌트 그룹이고, 하나의 잡은 보통 트리거로 연결된 여러 서브잡으로 이루어집니다. joblet은 한 번 저장해 여러 잡에서 쓰는 재사용 가능한 컴포넌트 그룹으로, 함수와 비슷합니다.
OnSubjobOk와 OnComponentOk의 차이는 무엇인가요?
둘 다 무언가가 성공한 뒤에 실행되는 트리거 링크입니다. OnSubjobOk는 서브잡 전체가 성공적으로 끝났을 때 발생합니다. OnComponentOk는 단일 컴포넌트가 끝나는 즉시 발생하므로, 서브잡 중간에 있을 수도 있습니다. 실패를 위한 OnSubjobError와 OnComponentError, 조건부 경로를 위한 Run if도 있습니다.
tMap은 무엇을 하나요?
tMap은 대표적인 변환 컴포넌트입니다. 메인 흐름을 하나 이상의 룩업 흐름과 조인하고, 표현식을 적용하고, 행을 필터링하고, 데이터를 여러 출력으로 보냅니다. 언급해야 할 주요 기능은 다음과 같습니다.
- 룩업에 대한 inner join과 left outer join
- 조인이나 필터에 실패한 행을 위한 reject 출력
- 입력과 출력의 필터 표현식
- 변수(variable), 즉 계산을 한 번만 작성해 재사용 가능
- 룩업 모델 옵션: load once, reload at each row, reload at each row with a key
tMap에서 큰 룩업은 어떻게 처리하나요?
기본적으로 룩업 데이터는 메모리에 로드됩니다. 룩업이 크면 "Store temp data"를 설정해 tMap이 디스크에 쓰도록 하거나, JVM 메모리를 늘리거나, 아니면 데이터베이스에서 조인해 문제 자체를 피합니다. 들어오는 행에 따라 달라지는 룩업에는 "Reload at each row"를 쓸 수도 있지만, 행마다 쿼리가 실행되므로 메인 흐름이 작을 때만 적합합니다.
컨텍스트 변수란 무엇이고 왜 쓰나요?
컨텍스트 변수는 호스트 이름, 스키마, 파일 경로, 자격 증명처럼 환경마다 달라지는 값을 담습니다. 한 번 정의하고 컨텍스트(Dev, Test, Prod)로 묶은 다음, 실행 시점에 컨텍스트를 선택합니다. 좋은 답변이라면 비밀번호를 잡에 평문으로 저장해서는 안 된다는 점, 그리고 컨텍스트 파일만 바꾸면 같은 내보낸 잡이 모든 환경에서 실행되어야 한다는 점을 덧붙입니다.
잡 간에 값은 어떻게 전달하나요?
tRunJob으로 자식 잡에 컨텍스트 파라미터를 전달할 수 있고, 자식 잡은 tBufferOutput 컴포넌트나 전역 변수를 사용해 부모에게 값을 반환할 수 있습니다. 하나의 잡 안에서는 값이 globalMap에 저장되는데, 이는 Java 맵으로 (String) globalMap.get("key")로 읽고 globalMap.put으로 씁니다.
tFlowToIterate와 일반 흐름의 차이는 무엇인가요?
일반 흐름은 모든 행을 컴포넌트들을 통해 함께 이동시킵니다. tFlowToIterate는 각 행을 하나의 반복(iteration)으로 바꾸어, 다음 컴포넌트들이 행마다 한 번씩 실행되게 합니다. 파일 이름이나 테이블 목록을 반복 처리할 때 유용하지만, 반복마다 서브잡이 시작되므로 큰 데이터 세트에는 느립니다.
Talend에서 오류는 어떻게 처리하나요?
여러 계층을 언급하세요.
- OnSubjobError, OnComponentError 같은 트리거 링크로 실패를 별도 경로로 보내기
- tDie로 오류 코드와 함께 잡을 중단하고, tWarn으로 경고 로깅하기
- tLogCatcher로 tDie, tWarn, Java 예외가 발생시킨 경고와 오류 수집하기
- tMap이나 데이터베이스 출력 컴포넌트 같은 컴포넌트의 reject 링크로 잘못된 행 처리하기
- tPreJob과 tPostJob으로 리소스를 열고 항상 정리하기
실패하는 잡은 어떻게 디버깅하나요?
Debug 모드로 실행하거나, tLogRow를 추가해 컴포넌트 사이의 데이터를 확인합니다. 콘솔에서 정확한 오류와 컴포넌트 이름을 확인한 다음, 연결 설정과 사용 중인 컨텍스트 값을 점검합니다. 데이터 문제라면 reject를 파일로 보내 살펴봅니다. tStatCatcher나 잡의 통계를 사용하면 컴포넌트별 행 수와 소요 시간도 볼 수 있습니다.
성능 관련 질문
백만 건의 행을 로드하는 작업이 느립니다. 무엇을 확인하시겠습니까?
- 시간이 어디에 쓰이는지 확인합니다. 컴포넌트별 행 수와 소요 시간을 보면 병목 지점이 드러납니다.
- 해당 작업이 데이터베이스에서 처리되어야 하는지 따져봅니다. 조인과 집계는 tMap보다 SQL에서 더 빠른 경우가 많습니다.
- 커밋 크기를 확인합니다. 매 행마다 커밋하면 느리므로 배치 단위로 커밋합니다.
- 벌크 컴포넌트를 활용합니다. 많은 데이터베이스에는 행 단위 삽입보다 훨씬 빠른 벌크 로드 컴포넌트가 있습니다.
- tMap 조회를 점검합니다. 대용량 인메모리 조회는 가비지 컬렉션 지연이나 메모리 부족 오류를 일으킬 수 있습니다.
- JVM 설정을 확인합니다. 메모리가 한계라면 최대 힙(Xmx 값)을 높입니다.
- 병렬 처리를 검토합니다. 일부 컴포넌트와 작업은 병렬로 실행할 수 있지만, 순서에 의존하지 않는 작업에만 해당합니다.
새로 추가되거나 변경된 레코드만 어떻게 로드하시겠습니까?
last-modified 타임스탬프나 증가하는 ID 같은 하이워터마크(high-water mark)를 유지하고, 이를 컨트롤 테이블이나 컨텍스트 변수에 저장한 뒤 그 값보다 큰 행만 추출합니다. 타깃의 업데이트는 키를 비교해 insert 또는 update 액션을 사용하거나 데이터베이스의 merge 문을 사용합니다. 삭제의 경우 전체 키 비교나 변경 데이터 캡처(CDC) 피드가 필요할 수 있습니다.
중복은 어떻게 제거하시겠습니까?
tUniqRow는 선택한 컬럼을 기준으로 중복을 제거하고, 중복된 행을 별도 출력으로 보낼 수 있습니다. tAggregateRow는 그룹화하여 값을 선택할 수 있습니다. 대용량 데이터셋의 경우 데이터베이스에서 윈도우 함수로 처리하는 것이 더 나은 경우가 많습니다.
이름을 알아둘 만한 컴포넌트
| 컴포넌트 | 기능 |
|---|---|
| tFileInputDelimited, tFileOutputDelimited | 구분자로 나뉜 파일 읽기 및 쓰기 |
| tDBInput, tDBOutput | 데이터베이스 테이블 읽기 및 쓰기 (데이터베이스마다 자체 버전이 있음) |
| tMap | 조인, 필터링, 변환 |
| tAggregateRow | 그룹화 및 집계 |
| tSortRow | 행 정렬 |
| tUniqRow | 중복 제거 |
| tReplicate | 동일한 흐름을 여러 출력으로 전송 |
| tNormalize, tDenormalize | 컬럼을 행으로 분할하거나 행을 컬럼으로 병합 |
| tRunJob | 다른 작업 호출 |
| tJava, tJavaRow, tJavaFlex | 사용자 정의 Java 코드 |
| tLogRow | 콘솔에 행 출력 |
| tDie, tWarn, tLogCatcher | 오류 처리 및 로깅 |
| tPreJob, tPostJob | 메인 흐름 전후에 실행되는 코드 |
배포 및 스케줄링
Studio에서 프로덕션으로 작업을 어떻게 옮기는지 설명할 준비를 하세요. 일반적인 단계는 작업을 독립 실행형 패키지로 빌드하거나 리포지토리에 게시하고, 프로덕션 컨텍스트를 설정한 뒤, Talend 자체 관리 도구든 cron이든 다른 오케스트레이터든 팀의 스케줄러로 스케줄링하는 것입니다. 버전 관리, 명명 표준, 작업 문서화도 모두 좋은 답변의 일부입니다.
연습해볼 수 있는 시나리오
"매일 고객 파일을 받습니다. 일부 행에는 이메일이 누락되어 있고 일부 고객은 이미 웨어하우스에 존재합니다. 이 작업을 설계하세요."
좋은 답변 개요:
- 정의된 스키마로 tFileInputDelimited를 사용해 파일을 읽습니다.
- tMap에서 이메일이 누락된 행을 거부 파일로 필터링하고, 웨어하우스 테이블에서 고객 키를 조회합니다.
- 기존 고객은 업데이트 경로로, 신규 고객은 삽입 경로로 보냅니다.
- 적절한 커밋 크기로 데이터베이스에 배치 단위로 씁니다.
- tLogCatcher와 컨트롤 테이블을 사용해 각 실행의 행 수와 오류를 기록합니다.
- 파일 경로와 데이터베이스 연결에 컨텍스트 변수를 사용해 동일한 작업이 모든 환경에서 실행되도록 합니다.
파일 크기나 이력 보관 필요 여부 등 가정을 소리 내어 말하세요. 면접관은 여러분이 어떻게 사고하는지 보고 싶어 합니다.
준비 방법
가능하다면 작은 작업을 처음부터 끝까지 만들어 보세요. 파일을 읽고, tMap에서 테이블과 조인하고, 거부 행을 처리하고, 데이터베이스에 쓰는 것입니다. 50만 번째 행에서 실패하면 어떻게 할지 설명할 수 있어야 합니다. 실행당 행 수나 절약한 시간 같은 수치와 함께 경험에서 나온 실제 사례를 한두 개 알고 있으세요. 관련 데이터 엔지니어링 주제는 Databricks와 Snowflake 면접 가이드를 참고하세요.
소리 내어 연습하면 도움이 됩니다. 모의 면접을 활용해 작업 설계를 설명한 뒤, 녹취록을 읽으며 설명에서 어떤 단계를 건너뛰었는지 확인하세요. 실제 면접에서는 AI 도구에 관한 고용주의 규칙을 따르세요.
YesToTheOffer와 함께 Talend 인터뷰 답변을 연습하세요
모의 기술 인터뷰를 진행하고, 잡 설계를 소리 내어 설명하고, 이후에 녹취록을 검토하세요. 30분 무료, 구독 없음.



