컨테이너 이해하기
컨테이너라는 개체는 Integration Service에서 매우 막강하면서도 중요한, 또한 알면 많이 편한 기능입니다.
컨테이너는 쉽게 말해,
“반복적인 작업을 수행하기 위한 작업 공간이며,
관련 있는 작업들을 그룹화 해서 관리하기 위한 관리 개체이며,
실행 속성이나 트랜잭션 등의 작업 수행 속성을 설정할 수 있는 개체”
|
입니다.. (써 놓고 보니 쉽지 않네요~! 뒷부분에서 구체적으로 설명하겠습니다.)
그럼 어떤 경우에 컨테이너가 이용될 수 있는지를 먼저 살펴보고 자세한 단계로 넘어가겠습니다.
개발자 : 이 작업을 1000번 반복해서 수행하고 싶습니다. DBA : 흠..2000의 DTS에서는 루핑이 제공 안되니깐, 할 수 없이 쿼리를 이용해서 해야 겠군.. |
è For 루프 컨테이너
현업 : D:\TextResult 폴더에 동일한 형태의 텍스트 파일이 123,456개 있습니다! 이걸 DB에 좀 넣어 주십쇼. DBA : 우선 xp_cmdshell로 잘 조작해서 파일명 읽어서 임시테이블에 넣고.. 루핑 돌리고..아후~! |
è Foreach 루프 컨테이너
개발자 : 수행되어야 할 배치 쿼리가 무지하게 많습니다.. DBA : 할 수 없지요. 하나의 텍스트 파일로 붙여 주시믄 기꺼이..아후~! |
è Foreach 루프 컨테이너
개발자 : 여기 이 작업들 중 하나라도 실패 나면 작업은 멈추어야 되고,이 외의 것들은 그냥 무시하면 됩니다. DBA : 쩝.. 패키지를 두 개로 나누어야 하나… |
è 시퀀스 컨테이너
SSIS에는 총 4개의 컨테이너가 있습니다.
A. For 루프 컨테이너
첫 번째의 경우와 같이, 동일한 작업을 반복적으로 수행해야 하는 경우 이용할 수 있는 작업 개체입니다.
SQL 2000의 DTS에서는 기본적으로 루핑(Looping) 기능이 없었습니다. 물론, ActiveX 스크립트를 이용해서 구현할 수는
있었지만, 간단하지는 않았습니다.
프로그래밍을 조금이라도 해 본 사람이라면, For … Next 구문을 잘 아실 것입니다..
for I = 1 to 10 step 1
… 수행할 명령들 …
next
따라하기) 처음이라 조금 자세히 설명하겠습니다.
1) SSIS 빈 프로젝트를 하나 엽니다.
2) 화면의 중앙 빈 곳에 마우스 오른쪽을 클릭하여 변수(S)를 선택합니다. 그러면 화면 왼쪽에 변수 창이 생길 것입니다.
3) AAA 라는 변수를 추가합니다. (데이터 형태는 Int32)
4) 도구 상자에서 For 루프 컨테이너를 끌어서 작업 공간에 넣습니다.
5) 이름을 변경하고 싶으면 변경하고(테스트인데 뭐 그냥 대충 합시다~), 더블 클릭해서 속성창을 엽니다.
6) 다음 그림과 같이 설정한 후 확인을 누릅니다.
a. InitExpression : 변수의 초기값.
b. EvalExpression : 루핑을 계속 수행할 지를 평가하는 계산식. (참일 때 까지 반복적으로 수행됩니다.)
c. AssignExpression : 증가 또는 반복 시키는 식
7) 왼쪽의 도구 상자에서 스크립트 작업을 끌어서 For 루프 컨테이너 안에다가 넣습니다.
요렇게~!
8) 스크립트 작업을 더블 클릭하여 속성을 연 다음, 스크립트 탭에서 ReadOnlyVariables에 AAA를 넣어줍니다.
(정확히는 [사용자::AAA] 이렇게 넣어줘야 합니다~!. 이 부분은 나중에 변수에 관련해서 다시 언급)
9) 그런 후, 아래에 있는 스크립트 디자인(S)를 클릭하여 스크립트 편집기를 엽니다.
10) Main() 함수 안에 다음과 같은 스크립트 추가합니다. (그냥 확인하기 위해 메시지 창만 뿌리는 역할입니다.)
MsgBox(Dts.Variables("AAA").Value.ToString)
11) 스크립트 편집기를 닫고, 스크립트 속성 창에서 확인을 눌러 속성 창도 닫습니다.
12) 자~! 이제 실행해 봅시다~!
더 이상 설명하면 지루해질 것 같으니깐, 다음 단계로 넘어가겠습니다.^^
B. Foreach 루프 컨테이너
이 컨테이너는 앞의 경우보다 할 말이 좀 많습니다. 구현되는 방식은 앞의 For 루프 컨테이너와 유사하지만,
열거자(Enumerator)라는 반복적인 작업을 지정해주는 무엇인가(~)가 있어서, 몇번~! 이라는 한정 없이 조건에
맞는 만~큼 반복해서 수행하도록 하는 것입니다.
이 작업 방식 역시 VB Script의 For…each 구문과 비슷합니다.
Integration Service에서의 열거자 유형은 다음과 같습니다.
Ÿ File 열거자 : 많이 사용될 수 있는 열거자 유형입니다. 앞서 사용할 수 있는 사례에서 나온 것과 같이 특정 폴더 내에 있는 모든 파일을 대상으로 작업을 한다든지, C:\Script\ 폴더 내의 *.sql 파일을 이용하는 경우 사용될 수 있습니다. File 열거자를 이용하는 경우는 따라하기를 참고하기 바람.
Ÿ Item 열거자 : 개발자가 칼럼 유형을 정하고, 직접 입력한 데이터를 이용하는 경우입니다.
아래 쪽에 있는 열(C) 버튼을 클릭하여 입력할 데이터의 열을 미리 정한 후, 직접 데이터를 입력하면 됩니다.
Ÿ ADO 열거자 : Object형의 변수에 들어있는 데이터를 순차적으로 나열합니다. 예를 들어, ResultSet 이라는 Object 형 변수에
SELECT ADDRESSID FROM ADVENTUREWORKS.PERSON.ADDRESS WHERE ADDRESSID<=10
라는 명령의 결과 집합이 저장되어 있다고 합시다. (이러한 작업은 SQL 실행 작업으로 간단히 만들 수 있습니다.)
이 단계 후, ResultSet이라는 변수에 들어있는 결과 집합의 값들을 차례로 꺼내서 쓸 때 이용하는 열거자 입니다.
Ÿ ADO.NET 스키마 행 집합 열거자 : .NET공급자로 만들어진 연결에 대한 스키마 정보를 이용하는 열거자 입니다. 예를 들어, .NET 공급자로 AdventureWorks 데이터베이스를 지정해 놓은 경우, 해당 DB의 모든 테이블 명을 출력하는 데에 이용할 수 있습니다.
Ÿ From Variable 열거자 : 이용할 수 있는 여러 가지 방법이 있을 수 있지만, 간단히 하나만 설명하자면, InputStr 이라는 String 변수에 abcdefg 라는 값이 대입되어 있다고 가정합니다. 이 경우, a, b, c, d, e, f, g로 값을 나누어서 작업을 수행해야 하는 경우, 이 열거자를 이용할 수 있습니다. 이 때, Foreach 루프 컨테이너 내에 변수 매핑 탭에서 매핑이 되는 변수의 유형은 Object 타입이어야 합니다.
Ÿ Nodelist 열거자 : XML 형태의 데이터를 이용할 때 사용되는 열거자 입니다. XPath(XML Path Language) 식의 결과 집합을 읽어서 이용할 수 있습니다. 예를 들어 /authors/author[@period=’classical’]로 XPathString을 지정했다면, classical 기간의 모든 저자 목록을 읽어와서 열거자로 이용하게 됩니다.
Ÿ SMO 열거자 : SMO는 SQL Server Management Object를 지칭합니다. SQL 2000의 DMO와 같은 역할을 수행하는 개체이며, 스키마나 테이블 목록, 뷰 목록 등과 같이 데이터베이스의 여러 형태의 정보를 읽어올 수 있는 개체입니다. 예를 들어, 특정 데이터베이스의 모든 테이블에 대해 작업을 수행해야 하는 경우, 이 열거자를 이용하면 됩니다.
따라하기) Foreach 루프 컨테이너를 이용하여 C:\Windows\ 폴더 아래에 있는 모든 bmp 파일을 C:\로 복사하기.
1) 빈 프로젝트 화면에서 Foreach 루프 컨테이너를 하나 놓고는, ImagePath라는 String 형 변수를 하나 추가합니다.
이 때, 이 변수의 값을 임의로 지정해 주도록 합니다. (예 : C:\Windows\aaa.bmp)
2) Foreach 루프 컨테이너의 속성을 연 후, 컬렉션 탭에서 다음과 같이 지정합니다.
Enumerator : Foreach File 열거자
폴더 : C:\Windows
파일 : *.bmp
3) 자, 이제 잠시 설명을 할 시간입니다. C:\WINDOWS 내에 *.bmp라는 파일명을 읽어온 후, 이 정보를 특정 변수에 넘겨줘야 합니다. 파일 리스트를 읽어오라고 한 것이지, 해당 파일들(여기서는 bmp 파일)을 직접 읽어와서 어떤 작업을 하는 것이 아님을 명심합시다~!. 파일의 디렉토리 정보와 파일 명을 읽어서 앞서 정의한 ImagePath 변수에 대입하도록 지정하는 단계입니다.
변수 매핑 탭을 누른 후, 다음과 같이 변수 칼럼의 밑 부분을 클릭하면 변수를 선택할 수 있습니다. 앞 단계에서 만들지 않았다면 여기서 만들어줘도 됩니다.
추가한 후 확인.
4) 도구 상자에서 파일 시스템 작업을 Foreach 루프 컨테이너 내로 끌어 넣습니다.
5) 그런 후, 다음과 같이 설정합니다다.
a. DestinationConnection 부분에서 <새 연결..> 로 대상을 추가합니다.
b. IsSourcePathVariable을 True로 지정한 후, SourceConnection을 사용자::ImagePath 로 지정합니다.
c. Operation을 파일 복사로 지정한 후 확인
6) 패키지를 실행하면, C:\ 에 *.bmp 파일들이 마구 복사되어 있을 것입니다..(꼭 지워주세요~!)
C. 시퀀스 컨테이너
시퀀스 컨테이너는 특별한 기능을 하지 않습니다. 단지, 관련된 작업들을 하나로 묶어주는 기능을 합니다.
예를 들어, 하나의 패키지에 테이블을 준비하는 작업들, 데이터를 변환하는 작업들, 데이터를 적재하는 작업들이 있을 경우, 각각의 관련이 있는 개별 작업들을 하나로 그룹화 해 줍니다. SSIS에서는 그룹을 엮어 주는 기능으로 그룹(G)라는 것이 있기는 합니다.
다음 그림을 보면서 비교하면서 설명하겠습니다. 참고로, 그룹을 만드는 방법은 그룹을 만들 작업들을 선택한 후(CTRL키를 누른 상태로 클릭하면 각각 선택됨) 마우스 오른쪽 버튼을 누르면 그룹(G)이라는 메뉴가 나타납니다.
![]() |
![]() |
같은 그룹핑 역할이지만, 왼쪽의 시퀀스 컨테이너는 하나의 작업으로 간주됩니다. 즉, 컨테이너 안의 작업들이 모두 수행이 되어 해당 컨테이너 내의 결과가 실패든, 성공이든 종료가 되는 경우 이 상태를 가지고 다음 단계로 보내게 됩니다. 하지만, 그룹은 그냥 시각적으로 묶어주는 역할만 하며 패키지의 실행에 아무런 영향을 주지 않습니다.
또한 시퀀스 컨테이너는 다음과 같은 속성을 가지지만, 단순 그룹은 이러한 속성을 지정할 수가 없습니다.
D. 작업 호스트
지금까지 세 가지의 컨테이너는 도구 상자의 메뉴에 있는 것입니다. 나머지 하나인 작업 호스트는 그럼 어디에 있을까요?
작업 호스트 컨테이너는 앞의 경우와는 달리 별도로 존재하는 것이 아니라, 작업 그 자체가 하나의 컨테이너 입니다. 즉, FTP 작업이나 스크립트 작업, 데이터 처리 작업 등과 같이 개별 작업이 컨테이너인 것입니다.
그럼 왜 굳이 이것을 컨테이너로 간주를 할까요?
글쎄.. 필자의 추측으로는, 데이터 처리 작업이라는 놈 때문이 아닐까가 첫 번째 생각입니다. 데이터 처리 작업은 다른 작업들과는 달리, 별도의 작업 공간을 가지며, 내부에는 여러 원본 및 변환 작업들을 포함하게 됩니다. (이것 역시 다음에 자세히 다룰 예정..^^) 또 다른 생각으로는, 실행 속성이나, 강제 실행 값, 트랜잭션 등을 지정할 수 있는 개체 단위를 컨테이너로 보기 때문이 아닐까 생각됩니다.
이 외에도 필자는 패키지 자체도 하나의 컨테이너가 되지 않을까라고 생각됩니다. 각 작업을 포함하고 있으며, 속성을 지정할 수 있다는 점에서..물론 필자가 먼저 생각한 건 아니고, 외국의 유명하신 분께서 그렇지 않냐~라꼬 글 올리신 것 보니, 음..그럴 수도 있겠네~ 라는 생각이 든 것입니다..
지금까지 SSIS에서의 컨테이너 들에 대해 대~충 알아봤습니다. 시간이 된다면, 각 컨테이너 별, 그리고 Foreach 루프 컨테이너 내에 있는 열거자 들에 대한 데모도 올릴 계획입니다..
'연구개발 > DTS & SSIS' 카테고리의 다른 글
기본 강좌 4 - 외부 컴포넌트 등록 및 Foreach 루프 컨테이너 이용하기 (0) | 2009.06.20 |
---|---|
기본 강좌 3 - 조회(Lookup) 변환 작업 (0) | 2009.06.20 |
[실습강좌5] SSIS 실습5 - 오류 출력 추가하기 (0) | 2009.06.20 |
[실습강좌4] SSIS 실습4 - 로깅 추가하기 (0) | 2009.06.20 |
[실습강좌3] SSIS 실습3 - UNION 및 집계 변환 만들기 (0) | 2009.06.20 |