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

한국 developerWorks  >  AIX와 UNIX  >

Speaking UNIX: rsync 고급 애플리케이션

developerWorks
문서 옵션
PDF format - Fits A4 and Letter

PDF - Fits A4 and Letter
42KB (11 pages)

Get Adobe® Reader®

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

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

Martin Streicher, Software Developer, Pixel, Byte, and Comma

원문 게재일 : 2009 년 9 월 22 일
번역 게재일 : 2009 년 10 월 27 일

다수의 시스템을 동기화하는 작업은 매우 힘든 일입니다. 다행히도 rsync라는 강력한 도구가 있어서 이러한 작업을 쉽게 할 수 있습니다.

지난 20년 동안 컴퓨터 네트워크의 사용이 폭발적으로 늘어났다. 인터넷의 성장과 그에 따른 국내 및 해외 백본 인프라스트럭처에 대한 투자 그리고 네트워킹 및 컴퓨팅 하드웨어 가격의 급격한 하락으로 인해 네트워크 사용량이 대폭 늘어났다. 오늘날 네트워크는 보편화되고 일반화되었으며 애플리케이션 여전히 대규모의 네트워크와 빠른 전송 속도를 필요로 한다. 인터넷은 몇 대 안되는 작은 워크스테이션에서 비롯되었지만 이제 인터넷 및 그와 유사한 서비스로 인해 셀 수 없이 많은 컴퓨터가 서로 연결되고 있다.

자주 사용하는 약어
  • FTP: File Transfer Protocol
  • WebDAV: Web-based Distributed Authoring and Versioning

같은 기간 동안 UNIX®도 성장을 해서 점차 유익한 네트워킹 소프트웨어와 보조를 맞추게 되었다. FTP는 시스템 간에 파일을 공유하기 위한 첫 번째 도구 중 하나이며 여전히 널리 사용되고 있다. "원격 복사(remote copy)"를 의미하는 rcp는 FTP를 개선한 것이며 기존의 cp 유틸리티와 유사하지만 시스템 간에 파일을 복사한다는 점이 다르다. rcp를 기반으로 한 rdist는 한 시스템에서 다수의 시스템으로 파일을 자동으로 분배한다.

오늘날 rcprdist와 같은 유틸리티는 보안상의 결함이 있어 더 이상 사용하지 않는다. 대신 scp를 사용한다. FTP를 여전히 널리 사용하듯이 FTP에서 보안을 강화한 SFTP(Secure FTP)도 가능하면 사용해야 한다. 달리 선택할 수 있는 도구에는 WebDAV와 BitTorrent™와 같은 것도 있다. 물론 시스템이 많아 질수록 모든 시스템을 동기화하거나 최소한 특정 상태로 유지하는 것이 더욱 어려워지며 사용자가 직접 솔루션을 작성하지 않는 한 scp와 WebDAV는 원하는 결과를 제공하지 않는다.

파일을 배포하는 데 가장 좋은 도구는 rsync이다. rsync는 전송이 중단되고 나서도 다시 재개할 수 있고 소스와 대상을 비교하여 다른 파일만을 전송하며 전체 백업이나 증분 백업을 할 수도 있다. 더욱이 rsync는 Mac OS X는 물론 모든 UNIX 계열에서 사용할 수 있으며 따라서 사실상 모든 시스템을 서로 편리하게 연결할 수 있다.

rsync에 대한 몇 가지 일반적인 사용례를 검토한 후에 보다 우수한 애플리케이션을 살펴보도록 하자. 여기서 사용한 데모 시스템은 Mac OS X 버전 10.5 Leopard(FreeBSD 변종) 및 Ubuntu Linux® 버전 8이다. 다른 운영 체제를 사용하거나 그럴 가능성이 있는 경우 여기에 있는 대부분의 예제를 포팅할 수 있으며 사용 시스템의 rsync 매뉴얼 페이지를 검토하여 동작이 제대로 되는지 확인한다.

퀵 리뷰

cp와 마찬가지로 rsync는 소스에서 대상으로 파일을 복사한다. cp와 달리 rsync 조작의 소스와 대상은 로컬 서버나 원격 서버가 된다. 즉 Listing 1과 같이 명령을 실행하면 /tmp/photos 디렉토리와 전체 내용이 홈 디렉토리로 직접 복사된다.


Listing 1. 디렉토리의 내용을 직접 복사하기
	
$ 	rsync -n -av /tmp/photos ~
building file list ... done
photos/
photos/Photo 2.jpg
photos/Photo 3.jpg
photos/Photo 6.jpg
photos/Photo 9.jpg

sent 218 bytes  received 56 bytes  548.00 bytes/sec
total size is 375409  speedup is 1370.11

-v 옵션을 사용하면 자세한 메시지가 출력된다. -a 옵션(여기서 aarchive를 의미함)은 -rlptgoD(재귀, 기호 링크를 기호 링크로 복사, 사용 권한 보존, 파일 시간 보존, 그룹 보존, 소유자 보존 및 장치와 특정 파일 보존)를 줄인 것이다. 일반적으로 -a는 파일을 미러링하며 대상에서 같은 속성을 지원할 수 없는 경우에는 예외가 발생한다. 예를 들어 UNIX에서 Windows®로 디텍토리를 복사하면 속성이 완벽하게 복사되지는 않는다. 특별한 경우를 위한 몇 가지 제안사항이 아래에 제시되어 있다.

rsync에는 옵션이 다양하다. 옵션 또는 소스나 대상 지정이 정확한지 확인하려면 -n 옵션을 사용하여 가상으로 동작을 확인한다. 이렇게 하면 실제로 데이터는 이동하지 않지만 각 파일에 대한 실행 결과를 확인할 수 있다. 모든 설정 사항을 확인한 경우 -n 옵션을 삭제한 후 명령을 실행한다.

Listing 2에는 -n이 필요 없는 예가 표시되어 있다. Listing 1에 있는 명령과 다음 명령은 결과가 다르다.


Listing 2. 이름이 지정된 디렉토리 내용 복사
	
$ rsync -av /tmp/photos/ ~
./
Photo 2.jpg
Photo 3.jpg
Photo 6.jpg
Photo 9.jpg

sent 210 bytes  received 56 bytes  532.00 bytes/sec
total size is 375409  speedup is 1411.31

어떤 차이가 있을까? 소스 인수의 끝에 슬래시가 있다는 점이 다르다. 소스 인수의 끝에 슬래시가 있으면 이름이 지정된 디렉토리 자체가 아닌 디렉토리의 내용이 복사된다. 대상의 끝에 있는 슬래시는 관련이 없다.

그리고 Listing 3에는 동일한 디렉토리를 다른 시스템에 복사하는 예가 있다.


Listing 3. 디렉토리를 다른 시스템에 복사하기
	
$ rsync -av /tmp/photos example.com:album
created directory album
Photo 2.jpg
Photo 3.jpg
Photo 6.jpg
Photo 9.jpg

sent 210 bytes  received 56 bytes  21.28 bytes/sec
total size is 375409  speedup is 1411.31

원격 시스템의 로그인 이름이 동일하다고 가정한 상태에서 rsync를 실행하면 암호 입력 창이 표시되며 해당 암호를 입력하면 album 디렉토리가 작성되고 해당 이미지가 이 디렉토리에 복사된다. rsync 기본적으로 SSH(Secure Shell)를 전송 메커니즘으로 사용하며 사용자는 시스템 별칭과 공개 키를 rsync와 함께 재사용할 수 있다.




위로


rsync 모드

Listing 2Listing 3에 있는 예에는 rsync의 네 가지 모드 중 두 가지가 표시되어 있다. 첫 번째 예는 쉘 모드이며 로컬 모드라고도 한다. 두 번째 예는 원격 쉘 모드이며 기본 연결과 전송이 SSH를 통해 수행되기 때문에 이러한 이름이 붙었다. rsync에는 두 가지 옵션이 더 있다. 목록 모드ls 처럼 동작하며 Listing 4와 같이 소스의 내용을 표시한다.


Listing 4. 소스 내용 표시하기
	
$ 
drwxr-xr-x         238 2009/08/22 18:49:50 photos
-rw-r--r--        6148 2008/07/03 01:36:18 photos/.DS_Store
-rw-r--r--       71202 2008/06/18 04:51:36 photos/Photo 2.jpg
-rw-r--r--       69632 2008/06/18 04:51:45 photos/Photo 3.jpg
-rw-r--r--       61046 2008/07/14 00:31:17 photos/Photo 6.jpg
-rw-r--r--      167381 2008/07/14 00:31:56 photos/Photo 9.jpg

네 번째 모드는 서버 모드이다. 여기서는 rsync 디몬이 서버에서 계속 실행하면서 파일 전송 요청을 수락한다. 전송 과정을 통해 디몬에 파일을 보내거나 디몬에서 파일을 요청할 수 있다. 서버 모드는 중앙에 백업 서버나 프로젝트 저장소를 두는 경우에 유용하다.

원격 쉘 모드와 서버 모드 간의 차이는 서버 모드에서는 소스와 대상 이름에 두 개의 콜론(:)을 사용한다는 점이다. whatever.example.com이 있다고 가정하면 다음 명령은 소스에서 로컬 대상으로 파일을 복사한다.

$ rsync -av whatever.example.com::src /tmp

그러면 src는 무엇일까? 이는 rsync 모듈이며 디몬의 호스트에서 정의하고 구성한다. 모듈은 내용이 수정되지 않도록 보호하는 read only와 같은 매개변수, 파일을 포함한 경로 그리고 이름을 갖고 있다.

rsync 디몬을 실행하려면 다음을 입력한다.

$ sudo rsync --daemon

rsync 디몬을 반드시 수퍼 사용자나 root로 실행할 필요는 없지만 이렇게 하면 시스템에 있는 다른 파일을 보호할 수 있다. root로 실행하면 rsyncchroot를 사용하여 수행 범위를 모듈의 디렉토리 계층으로 제한한다. chroot 뒤에 있는 기타 모든 파일과 디렉토리는 보이지 않게 된다. rsync 디몬을 특정 사용자 특권으로 실행하는 경우 사용하지 않는 소켓을 선택한 후 해당 모듈에 다운로드하거나 업로드할 수 있는 권한이 있는지 확인한다. Listing 5에는 sudo를 사용하지 않고 사용자의 홈 디렉토리에서 일부 파일을 공유하는 데 필요한 최소한의 구성이 표시되어 있다. 구성 내용은 rsyncd.conf 파일에 저장된다.


Listing 5. 파일 공유를 위한 간단한 구성
	
motd file = /home/strike/rsyncd/rsync.motd_file
pid file = /home/strike/rsyncd/rsyncd.pid
port = 7777
use chroot = no

[demo]
path = /home/strike
comment = Martin home directory
list = no

[dropbox]
path = /home/strike/public/dropbox
comment = A place to leave things for Martin
read only = no

[pickup]
path = /home/strike/public/pickup
comment = Get your files here!

이 파일에는 두 개의 세그먼트가 있다. 첫 번째 세그먼트(처음 네 라인)는 rsync 디몬의 동작을 구성한다. (다른 옵션도 사용할 수 있다.) 첫 번째 라인은 해당 서버를 식별할 수 있는 메시지가 있는 파일을 가리킨다. 두 번째 라인은 서버의 프로세스 ID를 기록할 수 있는 파일을 가리킨다. 이 파일은 다음과 같이 rsync 디몬을 직접 제거해야 할 경우에 유용하다.

kill -INT `cat /home/strike/rsyncd/rsyncd.pid`

이 예제에서는 rsync를 실행하기 위해 수퍼 사용자 특권을 사용하지 않으므로 두 파일은 홈 디렉토리에 있게 된다. 마찬가지로 디몬에서 사용할 포트는 모든 애플리케이션에서 사용할 수 있는 1000 이상의 번호를 선택한다. 네 번재 라인은 chroot를 끈다.

나머지 세그먼트는 작은 섹션 즉, 모듈당 하나의 섹션으로 세분된다. 각 섹션은 차례로 헤더 라인과 각 모듈의 옵션을 설정하기 위한 키-값 쌍 목록으로 구성되어 있다. 모든 모듈은 기본적으로 읽기 전용이며 쓰기 조작을 허용하려면 read only = no를 설정한다. 또한 모든 모듈은 기본적으로 모듈 카탈로그에 표시되며 모듈을 숨기려면 list = no를 설정한다.

디몬을 시작하려면 다음과 같이 실행한다.

$ rsync --daemon --config=rsyncd.conf 

이제 모듈 이름을 지정하지 않고 다른 시스템에서 디몬에 연결한다. 그러면 다음과 같이 표시된다.

rsync --port=7777 mymachine.example.com::
Hello! Welcome to Martin's rsync server.

dropbox        	A place to leave things for Martin
pickup         	Get your files here!

콜론(::) 뒤에 모듈 이름을 지정하지 않으면 디몬은 사용할 수 있는 모듈 목록을 표시한다. 모듈을 지정하면서 모듈 내에 있는 파일이나 디렉토리 이름을 입력하지 않으면 디몬은 모듈 내용의 카탈로그를 Listing 6과 같이 표시한다.


Listing 6. 모듈 내용의 카탈로그 출력
	
rsync --port=7777 mymachine.example.com::pickup
Hello! Welcome to Martin's rsync server.

drwxr-xr-x        4096 2009/08/23 08:56:19 .
-rw-r--r--           0 2009/08/23 08:56:19 article21.html
-rw-r--r--           0 2009/08/23 08:56:19 design.txt
-rw-r--r--           0 2009/08/23 08:56:19 figure1.png

Listing 7과 같이 모듈과 파일 이름을 지정하면 해당 파일을 로컬로 복사한다.


Listing 7. 모듈 이름을 지정하여 파일을 로컬로 복사하기
	
rsync --port=7777 mymachine.example.com::pickup/
Hello! Welcome to Martin's rsync server.

drwxr-xr-x        4096 2009/08/23 08:56:19 .
-rw-r--r--           0 2009/08/23 08:56:19 article21.html
-rw-r--r--           0 2009/08/23 08:56:19 design.txt
-rw-r--r--           0 2009/08/23 08:56:19 figure1.png

또한 Listing 8과 같이 쓸 대상을 모듈로 하여 소스와 대상을 바꿔서 업로드할 수 있다.


Listing 8. 소스와 대상 디렉토리 바꾸기
	
$ rsync -v --port=7777 application.js mymachine.example.com::dropbox
Hello! Welcome to Martin's rsync server.

application.js

sent 245 bytes  received 38 bytes  113.20 bytes/sec
total size is 164  speedup is 0.58

이 작업은 간단하지만 철저히 검토해야 한다. 이제 rsync를 일상 작업에 적용할 수 있는 방법을 살펴보자. rsync는 백업에 특히 유용하다. 로컬 파일을 원격 대상과 동기화할 수 있으며 전체 파일 시스템을 대상으로도 그렇게 할 수 있기 때문에 부분적으로라도 동일하게 유지되어야 하는 시스템의 대규모 클러스터를 관리하는 데 적합하다.




위로


rsync를 사용한 데이터 백업

백업은 수시로 해야 하지만 일반적으로 무시된다. 아마도 매일 긴 백업 작업을 수행해야 하거나 파일을 저장할 대용량 미디어가 필요하고 안전하게 보관할 수 있는 장소에 일상적으로 데이터를 복사해야 하기 때문이다.

이러한 작업을 수월하게 하려면 rsync를 사용하여 서비스 제공자가 호스트하고 백업하는 원격 서버에 백업을 한다. UNIX 시스템은 각각 동일한 기술을 사용하며 랩탑에 있는 데이터를 안전하게 유지하는 데 적합하다.

원격 시스템에 SSH 키와 rsync 디몬을 설정하고 쓰기가 가능하도록 백업 모듈을 작성한다. 설정이 완료되면 Listing 9와 같이 rsync를 실행하여 거의 공간이 필요 없는 일별 백업을 작성한다.


Listing 9. 일별 백업 작성
	
#!/bin/sh
# This script based on work by Michael Jakl (jakl.michael AT gmail DOTCOM) and used 
# with express permission.
HOST=mymachine.example.com
SOURCE=$HOME
PATHTOBACKUP=home-backup

date=`date "+%Y-%m-%dT%H:%M:%S"`

rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date

ssh $HOST "rm $PATHTOBACKUP/current && ln -s back-$date $PATHTOBACKUP/current" 

HOSTSOURCE를 각각 백업 호스트 이름과 저장할 디렉토리로 바꾼다. PATHTOBACKUP을 모듈 이름으로 변경한다. (또한 이 스크립트의 마지막 세 라인을 루프 안에 삽입하여 SOURCE를 동적으로 변경하고 같은 시스템에 있는 일련의 별도 디렉토리에 백업을 할 수 있다.) 백업 과정은 다음과 같다.

  • 먼저 date가 현재 날짜와 시간을 설정하고 백업을 고유하게 식별하도록 2009-08-23T12:32:18과 같은 문자열을 표시한다.
  • rsync 명령은 고용량 데이터 전송을 수행한다. -az는 모든 파일 정보를 보존하고 전송 데이터를 압축한다. --link-dest=$PATHTOBACKUP/current를 지정하면 변경되지 않은 파일은 백업이 되지 않는다.대신에 기존 백업에 있는 동일한 파일을 가리키는 하드 링크를 새 백업에 작성한다. 다시 말해서 새 백업에는 변경된 파일만 있으며 그 나머지는 링크이다.

    더 구체적으로 들어가서 모든 변수를 확장해 보면 mymachine.example.com::home-backup/current는 현재 아카이브를 말한다. /home/strike의 새 아카이브 대상은 mymachine.example.com::home-backup/back-2009-08-23T12:32:18이다. /home/strike에 있는 파일이 변경되지 않으면 해당 파일은 현재 아카이브에 대한 하드 링크로 새 백업에 표시된다. 그렇지 않은 경우에는 변경된 파일이 새 아카이브에 복사된다.

    하루에 몇 개의 파일이나 일부 디렉토리만 변경되는 경우 효과적으로 전체 백업을 하기 위해 필요한 추가 공간은 쓸모가 없어진다. 더욱이 맨 처음을 제외하고는 일별 백업량이 매우 작아서 긴 파일 히스토리를 편리하게 유지할 수 있다.

  • 마지막 단계에서는 원격 시스템의 백업 구조를 변경하여 새로 작성된 아카이브가 현재 아카이브가 되도록 하여 이 스크립트가 다음에 실행되었을 때 기록할 내용이 최소화되도록 한다. 마지막 명령은 현재 아카이브(단지 기호 링크임)를 제거하고 새 아카이브를 가리키는 동일한 기호 링크를 다시 작성한다.

하드링크에 대한 하드링크는 동일한 파일을 가리킨다는 점을 유의해야 한다. 하드 링크는 작성하고 유지하기가 매우 쉬워서 완전 백업은 증분 스킴만을 사용하여 가상으로 처리된다.




위로


기타 고급 기법 및 팁

일상 작업에서 원격 rsync를 사용하기 시작하면 디몬이 항상 실행 중이어야 한다는 점을 알게 된다. Linux와 UNIX 시스템에는 통상 /etc/init.d/rsync에 rsync 시작 스크립트가 있다. 운영 체제에서 구성요소를 설정할 수 있는 유틸리티와 시작 스크립트를 확인한다. 이와는 반대로 자체적으로 사용하기 위해 rsync를 디몬으로 실행 중이거나 시작 스크립트에 대한 액세스 권한이 없는 경우에는 rsynccron을 함께 사용해야 한다.

@reboot /usr/bin/rsync --daemon --port=7777 --config=/home/strike/rsyncd/rsyncd.conf

이 명령을 사용하면 시스템이 다시 시작할 때마다 디몬이 실행된다. 이 라인을 cronbab 파일에 삽입한 후 파일을 저장한다.

-n 옵션을 사용하여 사전에 문제를 확인할 수 있는 방법을 앞서 살펴보았다. 또한 --progress--stats, 이 두개의 옵션을 사용하여 전송 상태를 모니터할 수 있다. 전자는 진행 표시줄을 표시한다. 후자는 압축 및 전송 상태를 표시한다. 또한 --compress 옵션을 사용하여 두 시스템 간의 전송을 빠르게 할 수도 있다. 원시 데이터를 보내는 대신 송신측에서 데이터를 압축하여 보내고 수신측에서 압축을 풀면 보다 적은 데이터가 전송되기 때문에 시간이 절약되고 전송 속도가 빨라진다.

rsync는 기본적으로 소스에 있는 모든 파일이 대상에 복사되는지 확인한다. 이 기능을 복제라고 한다. 미러링을 할 경우 --delete 옵션을 사용하여 대상과 소스의 사본을 정확히 일치시켜야 한다. 예를 들어 소스에 A, B, C 파일이 있는 경우 표준 rsync는 대상에 A, B, C를 복제한다. 그러나, 소스에서 B를 제거하고 다시 복제하면 대상은 더 이상 소스를 미러링하지 않게 되며 B는 더 이상 유효하지 않다. --delete 명령은 미러링을 통해 더 이상 소스에 존재하지 않는 파일을 대상에서 제거한다.

때로는 백업이나 아카이브로 복사하고 싶지 않은 파일이 있다. 이러한 파일로는 편집기에서 작성된 임시 작업 파일(일반적으로 끝에 틸드[~]가 표시되어 있음)과 기타 유틸리티 및 홈 디렉토리에 있는 MP3와 같은 불필요한 파일(필요하면 다시 작성할 수 있는)을 들 수 있다. 이러한 파일은 패턴을 사용하여 제거할 수 있다. 명령행에서 패턴을 지정하거나 텍스트 파일로 패턴 목록을 지정할 수 있다. 또한 패턴을 --delete-excluded 명령과 결합하여 대상에서 파일을 제거할 수도 있다.

명령행을 이용하여 패턴을 기반으로 파일을 제거하려면 --exclude 옵션을 사용한다. 패턴에 있는 특정 문자(*)가 해당 쉘에서 특정 의미를 갖고 있는지 확인하여 해당 패턴을 작은따옴표로 둘러싸야 한다.

$ rsync -a --exclude='*~' /home/strike/data example.com::data

/home/strike/excludes 파일에 이와 같은 패턴 목록이 있다고 가정한다.

*~
*.old
*.mp3
tmp

다음 명령을 사용하여 특정 패턴과 일치하는 모든 파일을 제거할 수 있다.

$ rsync -a --exclude-from=/home/strike/excludes /home/strike/data example.com::data




위로


동기화 개선하기

이제까지 rsync에 관해 살펴보았으며 백업을 충실히 하지 않을 구실이 없어졌다. 무슨 일이야? 갑자기 하드 디스크가 고장났어! (그럴듯 하다고? 요즈음은 그렇지 않다.) 확인해 보라! 데이터가 괜찮을 거라고 했었다. FIDOnet는 유익한 파일이 있다.



참고자료

교육
  • rsync에서는 rsync에 관한 자세한 정보와 그 개발 과정을 확인할 수 있다.

  • rsync 튜토리얼에서는 rsync에 대한 다양한 사용법과 팁을 확인할 수 있다.

  • rsync 매뉴얼 페이지에서는 rsync 매뉴얼을 볼 수 있다.

  • Speaking UNIX에서는 이 시리즈의 다른 부분을 볼 수 있다.

  • UNIX 쉘에서는 UNIX 쉘에 관한 자세한 정보를 볼 수 있다.

  • AIX and UNIX 영역에서는 AIX 시스템 관리의 모든 기능에 관한 다양한 정보와 UNIX 능력을 개선할 수 있는 정보를 볼 수 있다.

  • New to AIX and UNIX? AIX와 UNIX에 대한 자세한 정보를 확인할 수 있다.

  • 기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.


토론


필자소개

author photo - martin streicher

Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 예술 작품과 장난감 수집을 좋아한다.




기사에 대한 평가


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



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


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