IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  Information Management  >

DB2 기초: DB2 UDB 트레이스 장치 소개 (한글)

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.


제안 및 의견
피드백

난이도 : 초급

Roman Melnyk, DB2 Information Development, IBM Canada Ltd.

2007 년 5 월 08 일

IBM® DB2® 기술 지원 팀은 DB2 트레이스(trace)를 장애 해결에 활용합니다. 이 글에서는 DB2 Universal Database™ (DB2 UDB) 트레이스 장치의 기초를 설명하고, 실행 예제들을 통해 db2trc 명령어를 사용하여 트레이스 정보를 파악하는 방법을 소개합니다.

머리말

DB2 UDB를 사용하다 보면, "get a trace and call IBM Support", "[turn] on trace [and] examine the trace record" 또는 "contact your technical [support] representative with the following information: problem description, SQLCODE, SQLCA contents (if possible), and trace file (if possible)" 같은 에러 메시지를 만나게 된다. 또는, IBM 지원팀에 문제를 보고할 때, 여러분 환경에 대한 상세한 정보를 파악하도록 트레이스를 수행할 것을 요청 받게 된다.

DB2 트레이스(trace)는 반복적으로 생성하는 문제들을 분석할 때 특히 유용하고, 지원팀의 문제 결정 작업에 많은 도움이 된다. 하지만, 정확히 말해서 무엇이 트레이스이고 a trace, and how do you take one? This article introduces you to the DB2 trace facility and the db2trc 명령어에 대해 설명하고, (실제 예제들을 통해서) 트레이스 정보를 파악하기 위해 여러분이 할 수 있는 일을 설명한다.




위로


DB2 트레이스 이해하기

DB2 트레이스는 트레이스 장치가 켜져 있는 동안 포착된 컨트롤 플로우 정보의 로그(함수와 관련 매개변수 값들)이다. 트레이스들은 에러 메시지로 리턴된 정보만 가지고는 해결하기 힘든 문제들을 진단하는데 매우 유용하다.

트레이싱(Tracing)은 (버퍼 풀 서비스 같은) 특정 컴포넌트로 제한될 수 있다. 이러한 액션은 마스킹(masking)으로 알려져 있다. 트레이스를 마스킹 하면 포착된 정보의 양을 최소화 하는데 도움이 된다. 트레이스를 모을 때, 문제를 만들어 내는 가장 작은 시나리오를 사용하도록 한다. 그렇지 않으면, 포착되는 데이터 양이 엄청나게 많아진다.

트레이스 정보가 에러를 진단할 때 언제나 유용한 것만은 아니다. 예를 들어, 다음과 같은 경우에는 에러 조건을 포착할 수 없다.

  • 전체 관련 트레이스 이벤트들을 포함할 정도로 충분하게 트레이스 버퍼가 설정되지 않았을 경우
  • 트레이스가 재생성 된 에러 상황까지 포괄하지 못할 경우

DB2 트레이스 장치는 db2trc 명령어를 사용하여 제어되는데, 이것은 트레이스를 시작 및 중지하고, 포착된 트레이스 정보를 포맷팅 하는데 사용된다.

db2trc에 대해 알아야 할 것!

DB2 트레이스 장치를 실행하면 시스템 성능에 영향을 줄 수 있다. 성능 강등의 정도는 트레이스 관련 정보를 모으는데 얼마나 많은 리소스들이 사용되는가에 따라 다르다. 실행 환경에서 트레이스를 모으는 것을 피하고, DB2 기술 지원팀에 의뢰하는 것이 좋다.




위로


db2trc 명령어 사용하기

db2trc 명령어를 사용하여 트레이스 정보를 포착하고 이 정보를 읽을 수 있는 텍스트로 포맷팅 한다. OS 명령어 프롬프트나 쉘 스크립트에서 db2trc 명령어를 실행한다. (메모리 대신) 파일을 트레이싱 하는 옵션이 있지만 파일 트레이싱은 더 느리다. 하지만, 재생성 되는 문제가 트레이스를 (메모리에서) 파일로 "덤핑"되지 않을 경우 유일한 옵션이다. 문제가 발생한 후 즉시 트레이스를 덤핑하고 트레이스를 끄고, 마지막으로 이벤트 데이터를 순차적 또는 프로세스나 쓰레드 순으로 포맷팅 한다.

db2trc 명령어의 신택스는 그림 1과 같다. 명령어 옵션은 두 개의 범주, 컬렉션(collection)과 파싱(parsing)으로 나뉜다.

  • 컬렉션 옵션에는 트레이스 켜고 끄기, 트레이스 버퍼 사이즈 지정하기, 트레이스 옵션 설정 또는 변경하기, 트레이스 덤핑, 트레이스 버퍼 피우기 등이 포함된다.
  • 파싱 옵션에는 포맷된 트레이스 기록들을 시간 순서 또는 프로세스나 쓰레드 별로 정렬하는 것이 포함된다.

트레이스 옵션에는 마스크를 설정하여 지정된 기준을 만족시키는 트레이스 기록(예를 들어, 특정 함수나 컴포넌트와 관련된 기록)들을 포착하는 기능, 지정된 프로세스와 쓰레드 조합들만 트레이스 하는 기능, 타임 스탬프 데이터를 요청하는 기능이 포함된다.

DB2 인스턴스나 DB2 Administration Server (DAS) 인스턴스를 트레이스 할 수 있다. DB2 인스턴스의 트레이스는 기본 작동이다. 이를 수행하기 위해, db2 문을 지정할 필요가 없다. 이 글에 사용되는 예제들은 기본 DB2 인스턴스만 트레이싱 하는 것으로 한정된다.

-u 옵션은 db2trc 명령어 관련 옵션의 경우 명령행에 액세스 하는 쉬운 방법이다.


그림 1. db2trc 명령어의 기본 옵션을 보여주는 신택스 다이어그램
db2trc 신택스

트레이스 시작하기

db2trc 명령어의 주요 옵션을 이해할 수 있는 가장 좋은 방법은 이들을 직접 실행해 보는 것이다. DB2 UDB에 있는 SAMPLE 데이터베이스를 사용하여 매우 간단한 예제들을 실행해 볼 것이다. 우선, 트레이스 장치를 켜고, 8-MB 트레이스 버퍼를 설정한다. 버퍼가 꽉 차면 트레이스를 중지하는 -i 옵션을 사용하여 (파일 대신) 공유 메모리를 트레이싱 할 것이다. (-l 옵션은 마지막 트레이스 기록을 보존한다. 이 버퍼는 기존 기록들의 래핑 또는 겹쳐 쓰기가 가능하기 때문이다. 이것은 기본 작동이다.) 버퍼 크기는 바이트 또는 메가바이트로 설정될 수 있다. 메가바이트를 설정하려면 값에 M (또는 m)을 붙인다.

트레이스 마스크를 설정하여 포착되는 트레이스 기록의 수를 제한 할 것이다. 이 경우, 버퍼 풀 서비스 컴포넌트만 트레이스 한다. 이것을 수행하는 데는 두 가지 방법이 있다. -m 옵션을 설정하고 그 뒤에 더블 쿼테이션 마크가 붙은 컴포넌트 이름을 붙이거나(-m "buffer pool services"), 전체 마스크 신택스 안에 컴포넌트 넘버(이 경우, 2)를 설정하는 것이다. 트레이스 마스크는 마침표로 구분되는 다섯 개의 엘리먼트가 있다.

  • 유형(Type). 이 엘리먼트는 트레이스 기록 유형을 의미한다. entry (1), exit (2), data (3), error (4), fatal error (5)가 있다.
  • 제품(Product). DB2는 product 3이다.
  • 컴포넌트(Component). 컴포넌트 이름이다. 예) buffer pool services (2). 컴포넌트의 단축 이름도 설정된다. (예, sqlb)
  • 함수(Function). 함수 이름을 의미한다. 예, sqlbpfDbheapSize (404).
  • 함수 카테고리(Function category). 이 엘리먼트는 함수가 내부 함수인지(fnc, 0), 컴포넌트 외부 인터페이스(cei, 2)인지, 또는 외부 API(api, 3)인지 여부를 지정한다.

각 엘리먼트는 콤마로 분리된 리스트, 하이픈으로 표시된 범위, 또는 단일 엔트리로 구성된다. 별표는 무엇이든 매치하는데 사용될 수 있다. 값들은 이름 또는 해당 숫자로 지정될 수 있다. 마스크를 "*.*.*.*.*" 로 설정한다면 마스크를 설정하지 않은 것이다. 트레이스 마스크를 더블 쿼테이션 마크로 인클로즈 하여 OS 쉘에 의해서 잘못 인터프리팅 하지 않도록 한다.

컴포넌트와 함수 이름과 관련 숫자들은 여러 내부 헤더 파일들에 리스팅 되는데, 이것은 여러분이 볼 수 없다. 특정 마스크를 설정하기 위해 이름 또는 숫자를 찾아야 한다면 포맷된 트레이스 아웃풋 샘플을 보도록 한다.

우리가 지정할 마지막 옵션은 -t 옵션이다. 이것은 트레이스 장치가 각 트레이스 기록과 관련된 타임 스탬프를 포착하도록 지정하는 옵션이다.

이제 우리는 트레이스를 시작할 준비가 되었다. db2trc 명령어를 실행, 기본 DB2 인스턴스를 시작하고, 트레이스 버퍼를 비운 후, SAMPLE 데이터베이스로 연결하고, 트레이스 버퍼의 내용을 dmp 파일에 작성하며 트레이스를 끈다. (Listing 1)


Listing 1. 트레이스 장치 켜기
db2trc on -i 8m -m "*.*.2.*.*" -t
db2start
db2trc clear
db2 connect to sample
db2trc dump dmp
db2trc off

트레이스 버퍼에 대해 알아야 할 몇 가지 중요한 사항들이 있다.

  • 버퍼 크기를 설정할 때, 값은 2의 제곱이 되어야 한다. 예를 들어, 7-MB 버퍼를 요청한다면, 값은 4 메가바이트로 반올림 된다. 8000000-byte 버퍼를 요청하면, 값은 4194304 바이트가 된다.
  • 최소 버퍼 크기는 1 메가바이트이다. 기본 버퍼 크기는 Windows®에서는 8 메가바이트이고, 유닉스®-기반 시스템에서는 4 메가바이트이다. 기본의 최소 트레이스 버퍼 크기는 DB2 버전에 따라 다르며, 최대 버퍼 크기는 플랫폼에 따라 다르다.
  • 성능 문제로 인해, 트레이스 장치에서는 여러분이 트레이스 버퍼 크기를 수정할 수 없게 되어있다. 공유 트레이스 버퍼에 하나의 프로세스가 있다면, 버퍼 크기를 수정할 수 없다. 다른 버퍼 크기를 설정할 수 있는 최상의 방법은 인스턴스를 시작하기 전에(다시 말해서, db2trc 명령어를 실행하기 전에) db2start 명령어를 실행하는 것이다.
  • 공유 메모리를 트레이싱 한다면, 트레이스 버퍼의 크기는 덤프 파일의 크기를 제한한다. 파일을 트레이싱 한다면, 덤프 파일의 크기는 시스템 상의 여유 공간과 최대 허용 가능한 파일 크기로 제한된다.

트레이스 포맷팅 하기

메모리에서 dmp 파일로 덤핑했던 트레이스는 db2trc 명령어의 파싱 옵션들을 사용하여 읽기 가능한 텍스트로 파싱 및 포맷될 수 있다. Listing 2는 파싱 요청 예제이고, 표준 아웃풋으로 리턴된 요약 정보가 포함되어 있다. 우리 예제에서, 트레이스는 트랜잭션이 발생하지 않을 정도로 작다. Listing 2는 다양한 아웃풋 파일의 크기를 보여준다. 덤프 파일(dmp)의 크기는 약 8 메가바이트이고, db2trc 명령어에 설정되었던 트레이스 버퍼 크기에 상응한다.


Listing 2. 트레이스 파싱하기
                db2trc format dmp fmt

Trace truncated                   : NO
Trace wrapped                     : NO
Total number of trace records     : 2846
Number of trace records formatted : 2846

db2trc flow dmp flw

Total number of trace records     : 2846
Trace truncated                   : NO
Trace wrapped                     : NO
Number of trace records formatted : 2771 (pid: 23494 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 19834 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 28780 tid 1 node: 0)
Number of trace records formatted : 15 (pid: 28396 tid 1 node: 0)
Number of trace records formatted : 30 (pid: 26332 tid 1 node: 0)

ls -l
...
-rw-r-----   1 melnyk   staff       8393432 Aug 20 15:43 dmp
-rw-r-----   1 melnyk   staff        121489 Aug 20 15:44 flw
-rw-r-----   1 melnyk   staff        541845 Aug 20 15:44 fmt
...

format 옵션은 평이한 텍스트 트레이스 아웃풋 파일을 만들며, 여기에는 트레이스 기록들이 순서대로 나타난다. 아웃풋 예제는 Listing 3에 나타나 있다. 각 기록은 트레이스 포인트에 고유의 식별 번호로 나타난다. 트레이스 포인트 넘버는 순차적으로 포맷된 아웃풋 파일에 연속적으로 나타난다. 첫 번째 기록을 검사하면(트레이스 포인트 1), 여기에는 트레이스 기록 유형 ("entry"), 제품("DB2 UDB"), 컴포넌트 ("buffer pool services"), 함수("sqlbGetTotalBufferPoolMemSize"), 함수 카테고리("cei")가 포함되어 있음을 알 수 있다. 이 정보는 마스크를 정의하는데 사용될 수 있는 엘리먼트로 매핑된다. 이러한 엘리먼트의 숫자 등가물들은 트레이스 기록들에도 나타난다. 예, "(1.3.2.537.2)" 트레이스 포인트가 probe 포인트로 되어있으면(하나의 함수 내에 명확히 구분된 정밀 위치), probe 넘버 역시 이 스트링에 포함된다. (예, 트레이스 포인트 4)

포맷된 트레이스 기록 역시 프로세스("23494"), 쓰레드("1"), 동반 프로세스 ("-1"), 노드("0")를 구분한다. db2trc 명령어에 -t 옵션을 설정했기 때문에 관련 타임 스탬프들도 아웃풋에 포함된다. 관련 타임 스탬프는 트레이스 시작 이후 경과된 시간을 보여준다. 이 경우, 전체 트레이스는 361,858,476 나노초(nanoseconds) 또는 1/3 초이다.

신택스 다이어그램에서 보듯(그림 1), format 옵션은 한 개 이상의 특정 프로세스와 제휴된 트레이스 포인트들만 파싱 하는데 사용될 수 있다. 예, db2trc format dmp fmt1 -p 19834.


Listing 3. 포맷된 트레이스 기록들은 시간 순서대로 나타난다. 처음 여섯 줄은 아웃풋의 일부이고, 나머지는 파일에 있는 트레이스 포인트이다.
1	entry DB2 UDB buffer pool services sqlbGetTotalBufferPoolMemSize cei (1.3.2.537.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 0

2	entry DB2 UDB buffer pool services sqlbpfDbheapSize fnc (1.3.2.404.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 5659

3	entry DB2 UDB buffer pool services sqlbGetBPConfig cei (1.3.2.310.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 10319

4	data DB2 UDB buffer pool services sqlbGetBPConfig cei (3.3.2.310.2.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 11629 probe 0
	bytes 12

	Data1 	(PD_TYPE_HEXDUMP,4) Hexdump:
	0000 0000                                  ....


5	exit DB2 UDB buffer pool services sqlbGetBPConfig cei (2.3.2.310.2)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 19329
	rc = 0

6	exit DB2 UDB buffer pool services sqlbpfDbheapSize fnc (2.3.2.404.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 22358
	rc = 0x000448BC = 280764

...

2846	exit DB2 UDB buffer pool services sqlbCheckBPFConsistancy fnc (2.3.2.273.0)
	pid 23494 tid 1 cpid -1 node 0 sec 0 nsec 361858476
	rc = 0

flow 옵션은 평이한 텍스트 아웃풋 파일을 생성하고, 여기에서 트레이스 기록들이 프로세스 별로 시간 순서대로 기록된다. 이것은 컨트롤 플로우 다이어그램을 만들어 낸다. 아웃풋 예제는 Listing 4에 나타나 있다. 이 아웃풋 파일에 포함된 정보에는, 프로세스, 쓰레드, 노드 넘버, 트레이스 포인트 넘버, 함수 이름, 트레이스 기록 유형, 어떤 경우에는, 프로브(probe) 넘버들이 포함된다. 각각의 새로운 함수 엔트리의 경우 들여쓰기를 해 두었다.

신택스 다이어그램에서도 보듯(그림 1), flow 옵션은 한 개 이상의 특정 프로세스와 제휴된 트레이스 포인트들만 파싱 하는데 사용될 수 있다. 예, db2trc flow dmp flw1 -p 19834.


Listing 4. 컨트롤 플로우 다이어그램의 일부
...

pid = 19834 tid = 1 node = 0

846         sqlbPFPrefetcherEntryPoint entry
847         sqlbPFPrefetcherEntryPoint data [probe 0]
848         | sqlbPFInitPrefetcher entry
849         | sqlbPFInitPrefetcher data [probe 0]
850         | | sqlbConnectToSharedMemory entry
851         | | sqlbConnectToSharedMemory exit
852         | | sqlbInitEDU entry
853         | | | sqlbGetBPConfig entry
854         | | | sqlbGetBPConfig data [probe 0]
855         | | | sqlbGetBPConfig exit
856         | | | SqlbFileTbl::SqlbFileTbl entry
857         | | | SqlbFileTbl::SqlbFileTbl exit
858         | | sqlbInitEDU exit
859         | sqlbPFInitPrefetcher exit
860         | sqlbpfRemoveFromQ entry

...

db2trc 명령어의 info 옵션은 특정 덤프 파일과 관련된 트레이스 매개변수들의 요약을 리턴한다. dmp라는 덤프 파일을 사용하여, db2trc info dmp 명령어는 다음을 리턴한다.


Listing 5. db2trc 명령어의 "info" 옵션으로 리턴된 정보
Marker                  :  @TRACE@
Trace version           :      6.0
Platform                :      AIX
Build level             :  s040811
maxBufferSize           : 8388608 bytes (8 MB)
auxBufferSize           : 6291456 bytes (6 MB)
allocationCount         : 2
DB2TRCD pid             : 0
Trace destination       : <shared memory buffer>
crash                   : disabled
crash runtime passno    : 0
numSuspended            : 0

Buffer size             : 8388608 bytes (8 MB)
Allow buffer to wrap    : no
Mask                    : *.*.2.*.*
Timestamps              : enabled
PID.TID mask            : all
Fixed data mask #1      : all
Fixed data mask #2      : all
Max system errors       : infinite
Treat this rc as sys err: none

기타 트레이스 옵션

db2trc 명령어(그림 1)에 사용할 수 있는 몇 가지 옵션들은 다음과 같다.

  • -perfcount. 성능 카운터는 각 함수가 호출된 회수를 기록하는 컬렉션 옵션이다. 이것과 관련된 -t 옵션은 각 함수가 포착되는데 걸린 총 시간을 나타낸다. 성능 카운터 역시 마스크를 설정할 수 있는 -m 옵션을 지원한다.
  • perffmt. 성능 트레이스 포맷터는 성능 카운터를 포함하고 있는 덤프 파일을 가독성 있는 텍스트로 포맷팅 하는 파싱 옵션이다. (Listing 6).
  • change. 실행 중인 트레이스 옵션을 수정할 수 있는 컬렉션 옵션이다.
  • -resume. 중지된 프로세스를 다시 실행할 수 있도록 해주는 컬렉션 옵션이다. -suspend가 실행되지 않는다면 재실행 될 수 없다.
  • dump -q. The -q (quiet mode) 옵션은 "Trace has been dumped to file..." 메시지가 표준 아웃풋으로 프린팅 되지 않도록 한다.
  • stop. 이 컬렉션 옵션은 트레이싱을 요청 시 마다 중지한다. 모든 프로세스들은 트레이싱을 중지하지만, 트레이스 버퍼의 콘텐트는 보존되어 나중에 덤핑된다. 이 액션은 트레이스 장치를 모두 실행 불가로 만드는 off 옵션과는 반대되는 옵션이다.
  • -c cpid . 지정된 동반 프로세스만 트레이스 되도록 요청한다.
  • -rc return-code . 지정된 값(서명된 정수이어야 함)이 시스템 에러로 취급되도록 요청한다.
  • -e max-sys-errors . 정해진 시스템 에러가 발생했을 때 트레이싱을 중지하도록 요청한다.
  • -crash point . 지정된 트레이스 포인트에서 프로세스가 충돌하도록 요청한다. 트레이스 포인트는 "product-name.component-short-name.function-name.entry | exit | probe"처럼 지정된다. 예, "DB2.SQLE.sqleFirstConnect.entry". probe 엘리먼트는 엔트리 또는 종료 트레이스 포인트 외 다른 트레이스 포인트를 나타낸다. DB2 UDB Version 8.2는 -crash와 똑 같은 의미의 -debug 옵션을 도입했다.
    주: -crash 옵션을 사용할 때 주의해야 한다. DB2 기술 지원팀에서 지시한 대로 따라야 한다.
  • -passno i . 크래시 포인트가 i 회 실행된 후에 프로세스가 충돌하도록 요청한다.
  • -sleep s . 프로세스가 충돌 대신 s 초 동안 휴면 상태에 있도록 요청한다.
  • -signum n . 프로세스가 충돌 대신 n 시그널을 발생하도록 요청한다.
  • -pause. 충돌 대신 신호를 받을 때까지 프로세스가 중지하도록 요청한다.
  • -suspend. 프로세스가 충돌 대신 실행을 중지하도록 요청한다.
  • -softcrash. 프로세스가 충돌 대신 에이전트를 인터럽트 하도록 요청한다.

Listing 6. 성능 카운터를 켜고 포착된 데이터를 포맷팅 한다. 처음 다섯 개의 포맷된 기록들은 샘플 아웃풋이다.
db2 connect reset
db2stop

db2trc on -i 8m -perfcount -t -m "*.*.2.*.*"

db2start
db2trc clear
db2 connect to sample

db2trc dump dmp1
db2trc off

db2trc perffmt dmp1 pfmt


13	(0 sec, 28978 nanosec)	 sqlbReducePagesPinned
8	(0 sec, 114614 nanosec)	 sqlbLoadContainerList
1	(0 sec, 6309 nanosec)	 sqlbAllocateBuckets
1	(0 sec, 28228 nanosec)	 sqlbpfCreateQ
4	(0 sec, 195840 nanosec)	 sqlbConnectToSharedMemory
...




위로


요약

소셜 북마크

mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

이 글에서, DB2 트레이싱의 기초와, db2trc 명령어를 사용하는 방법을 실행 예제를 통해 설명했다. 테스트 환경(실행 환경이 아님)에서 여러분이 직접 이 예제를 실행해 보면 DB2 트레이스 장치에 대해 더욱 잘 이해할 수 있을 것이다.

기사의 원문보기



참고자료



필자소개

Roman Melnyk photo

Roman B. Melnyk 박사는 DB2 Information Development 팀 멤버로서, 데이터베이스 관리, DB2 유틸리티, SQL 전문가이다. IBM에서 11년 이상을 근무하면서, 다양한 DB2 관련 서적, 아티클 등을 집필했다. Roman coauthored DB2 Version 8: The Official Guide (Prentice Hall Professional Technical Reference, 2003), DB2: The Complete Reference (Osborne/McGraw-Hill, 2001), DB2 Fundamentals Certification for Dummies (Hungry Minds, 2001), DB2 for Dummies (IDG Books, 2000)도 공동 집필했다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



아니오잘 모르겠음
 


 


12345
 



위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.

    IBM 소개개인정보 보호정책문의