무선 USB: 초광대역(UWB) 기술을 사용한 다양한 접근 방식의 이해


개요
USB(Universal Serial Bus)는 현재 시장에서 가장 널리 사용되는 연결 기술 중 하나다. 초광대역(UWB)은 고속 데이터 전송 기술로, 실내 무선 환경에서 유선과 같은 수준의 성능을 제공한다. UWB 기술은 컴퓨터 주변기기, 캠코더, 휴대폰 및 기타 여러 가지 전자 제품을 연결하느라 복잡하게 얽힌 USB 케이블을 대체할 잠재력을 갖추고 있다. 이 문서에서는 무선 USB를 실현하기 위한 세 가지 접근방식을 검토한다.



무선 USB를 위한 접근방식
현재 가장 유용하고 널리 사용되는 연결 방법 중 하나는 USB(Universal Serial Bus)다. 시중의 카메라, 캠코더, 녹음기, 컴퓨터, 스캐너, 프린터, 휴대폰, 전화기, 키보드, 디스플레이를 비롯한 많은 전자 제품에서 USB 연결 기술이 사용된다. 실제로 컴퓨터에 있는 USB 포트의 수보다 더 많은 기기를 연결할 수 있게 해주는 허브라는 장치가 개발될 만큼 USB 지원 연결 방식은 광범위하게 사용되고 있다. 시장 조사 회사인 인스태트(In-Stat)에 따르면 현재 시장에서의 USB 지원 장치 규모는 7억 개 정도이며, 그 규모가 2009년까지 약 21억 개로 증가할 전망이다. 이러한 모든 기기를 연결하면 연결선도 당연히 많아질 것이다. 각각의 연결선은 소비자에게는 제약을 의미한다. 한 가지 예로, 기기 간에는 물리적 연결이 서로 일치해야 하는데, 현재 시중에는 물리적으로 다양한 유형의 USB 커넥터가 존재하고 있다. 가정과 직장에서 USB 장치의 사용이 더 증가하고 있기 때문에 기기를 더 적절히 배치하고 복잡함과 혼란을 덜기 위해서는 배선을 줄이는 것이 바람직하다. 연결선을 줄이는 한 가지 명확한 해결책은 무선 연결을 사용하는 것이다. 여러 시장의 다양한 업체로부터 많은 기기가 출시되고 있으며, USB 케이블을 제거하기 위한 다양한 해결책도 제시되고 있다.


USB 신호를 무선으로 전송하는 기본적인 세 가지 방법은 다음과 같다.
1. USB 직렬 데이터 스트림을 초광대역(UWB) 무선 신호로 직접 변환한다. 기기는 USB가 케이블을 통해 전송되는지, 무선 신호를 통해 전송되는지 알지 못한다.
2. USB 커넥터만 사용하되, 데이터를 다시 패키징하여 커넥터에서 다른 신호(일반적으로 TCP/IP)로 전송하도록 한다.
3. USB를 전자 시스템 내부적으로 재정의하고, 소프트웨어의 애플리케이션 계층에서만 호환성을 유지한다. 이 방법은 최소한의 하위 호환성을 유지하는 솔루션이다.


현재 시장에는 무선 USB를 위한 여러 가지 솔루션이 있으며, 2006년부터 새로운 솔루션들이 등장할 전망이다.


무선(Cable-Free)™ USB
프리스케일 반도체의 솔루션인 무선(Cable-Free)™ USB는 이미 사용되고 있는 광범위한 USB 장치를 이용해 진정한 USB 무선 연결을 구현한다. 이 솔루션은 DS-UWB(Direct Sequence Ultra-Wideband)라는 무선 기술을 사용하여 USB 신호를 전송한다. 이 무선 기술은 기본적으로 매우 낮은 전송 전력에서 상당히 높은 데이터 전송률을 제공하며, 아울러 시스템 소비전력이 극히 낮다는 장점을 갖고 있다. 프리스케일의 경험에서 도출된 최선의 소비전력은 시스템 소비전력 1 밀리와트 당 1 메가비트의 전송률이다.프리스케일은 한 걸음 더 나아가 "진정한 USB" 인터페이스를 고성능 DS-UWB 무선 시스템에 구현시켰다. USB 2.0 인터페이스는 다음과 같은 여러 가지 장점을 제공한다.


• 프리스케일 DS-UWB 지원 시스템은 USB 2.0 표준을 기반으로 하기 때문에 소프트웨어 업데이트 없이 USB 지원 시스템에 연결할 수 있다.
• 프리스케일 DS-UWB 지원 시스템은 미니 카드 규격에 배치할 수 있으며, 호스트 시스템을 수정하지 않고 직접 USB 연결을 사용할 수 있다.
이러한 접근방식은 현재 시중에 나와 있는 7억 개 이상의 USB 장치를 현재 상태 그대로, 즉 변경하지 않고 연결할 수 있도록 해주며 USB 무선 운영을 구현하기 위한 솔루션을 제공한다.


현재 프리스케일은 상용 UWB 솔루션을 공급 중이며 고객들은 USB 솔루션 설계에 이를 사용하고 있다(보다 자세한 정보는 www.freescale.com/uwb 사이트에서 확인할 수 있다).


허브 설계
두 번째 방법은 허브 및 이 허브와 짝을 이루는 호스트 동글을 통해 UWB 신호를 다시 패키징하는 것이다. 호스트 측(일반적으로 PC)에 동글이 연결되고 PC에 소프트웨어가 설치된다. 이렇게 하면 PC는 소프트웨어 수준에서 USB 통신을 가로챈 다음 이를 다시 구성하여 TCP/IP 신호 형태로 USB 커넥터를 거쳐 공중으로 전송할 수 있다. 이 신호는 다시 허브에 수신되는데, 이것이 실질적으로 TCP/IP-USB 컨버터 박스다. 이 방법은 기존 USB 커넥터를 사용하므로 일부 하위 호환성을 제공하지만 드라이버 업데이트가 필요하며 TCP/IP-USB 변환 계층을 추가해야 한다. TCP/IP 솔루션의 단점은 등시성 통신을 사용할 수 없다는 점인데, 이는 캠코더, 텔레비전, 스테레오 시스템 또는 디지털 카메라와 같은 시청각 시스템을 위한 원활한 성능을 구현하려면 시스템 엔지니어가 상당한 통신 성능 여유를 구축해야 하며, 이로써 추가적인 비용이 발생하게 됨을 의미한다.


프리스케일은 이 솔루션 유형을 시험하였다. 프리스케일은 기존 USB 커넥터의 사용이 시장 관점에서는 매우 유익한 일이지만, 셀 수 없이 많은 기기 유형과 수백 만의 코드 라인을 고려할 때 결국 최적의 시장 솔루션은 드라이버 수준에서 많은 소프트웨어 변경을 요구해서는 안 된다고 판단하였다. 이 솔루션의 또 다른 중요한 제약 사항은 TCP/IP가 전송되기 때문에 이 유형의 시스템은 다른 인증된 무선 USB 시스템과의 상호운용에 있어서 중간적인 솔루션밖에 될 수 없다는 점이다. 이 기능을 내장하거나 동글로 구현하는 제품은 새로운 무선 USB 표준과 호환되지 않기 때문에 소비자 입장에서는 또 하나의 "새로운 변종" USB가 생기는 것일 뿐이다.


USB를 무선으로 재정의
세 번째 솔루션은 USB를 무선으로 재정의하고 기기 간의 로컬 무선 연결을 허용하는 것을 목표로 두는 것이다. 본질적으로, 원래의 USB에서 그대로 유지되는 것은 애플리케이션 계층에서 소프트웨어 드라이버 계층으로의 소프트웨어 연결 뿐이며, 하드웨어, 드라이버, 시스템 아키텍처 등 다른 모든 부분은 변경된다. 어떤 면에서 보면 이와 같은 시스템 유형은 이름만 USB라고 할 수 있다.
이 솔루션은 MB-OFDM(멀티 밴드 직교 주파수 분할 다중화)이라고 하며, UWB와는 다른 접근방식이다. 이 접근방식의 장점은 시스템을 이 사양에 맞춰 설계하고 솔루션에 최적화할 수 있다는 것이다. 이러한 장점은 거의 모든 신규 시스템 설계에 적용된다. 그러면 수익을 내기 위해 시스템 공급업체가 해야 할 것은 무엇인가? 대부분의 공급업체는 미래에 맞춰 솔루션을 설계하고 판매되기를 기다리기보다는 유선 USB 솔루션과 무선 USB 솔루션을 모두 갖추고, 시스템에서 이 두 가지를 모두 적절히 다룰 수 있는 타당한 수준의 복잡성과 솔루션을 확보해야 한다.


예를 들어, PC에 미니 카드를 구현하려면 유선 USB 신호가 반드시 있어야 하는데, 이는 이 사양이 USB와 PCI Express 상호 연결 기술을 모두 사용할 수 있게 해주기 때문이다. 따라서 대부분의 시스템은 어떤 경우에도 USB 버스를 없애지 않을 것이다. 사실 USB 커넥터는 PC 시스템에서 제거할 수 있겠지만 USB 버스가 그대로 유지되면 소프트웨어 개발자는 여전히 새로운 소프트웨어를 작성해야 한다.


즉, 이러한 무선 USB 구현 방법은 대체 방식이 아니라 항상 시스템에 추가하는 방식이다. 마지막으로 소프트웨어 문제의 중요성을 강조하자면, 캠코더나 전화기의 시스템 등의 대부분의 임베디드 시스템이 Microsoft?? Windows?? 외의 운영 체제를 구동한다는 사실을 알아야 한다. 이는 USB를 위해 소프트웨어 드라이버를 재정의한다는 것은 수없이 많은 임베디드 소프트웨어 시스템에 영향을 미치게 됨을 의미한다.



7. ClickOnce Deployment Limitations

Although ClickOnce deployment works well for most applications, there are some situations where Windows Installer is more appropriate.The following are some limitations that you should be aware of:

ClickOnce

Windows Installer

Application installation location

ClickOnce application cache

Program Files folder

Install for multiple users

No

Yes

Install shared files

No

Yes

Install drivers

No

Yes (with custom actions)

Install to Global Assembly Cache

No

Yes

Add application to Startup group

No

Yes

Add application to Favorites menu

No

Yes

Register file types

No

Yes

Access registry

No (can access HKLM with Full Trust permissions)

Yes

Binary patching of files

Yes

No

Install assemblies on demand

Yes

No


Scott S.
FarPoint Technologies, Inc.

ClickOnce, 사용자 정의 필수 구성 요소 포함하기

배경

ClickOnce는 닷넷 프레임웤 2.0에서 추가된 새로운 어플리케이션 배포방법입니다. 닷넷 프레임워크 1.X 버전에서 지원했던 NTD(No touch deployment)나 Windows Installer 방식에 더해(2.0에서도 여전히 지원합니다.) 두 배포방식의 장점을 취합하고 단점을 보완하여 소개한 것이 ClickOnce입니다. 하지만 여전히 NTD와 Windows Installer가 필요한 이유는 ClickOnce가 다른 두 개의 배포방식을 대체하는데 목적이 있는 것이 아니기 때문입니다. NTD는 Sandbox 내에서 배포되고 수행되는 어플리케이션을 위한 것이기 때문에(Smart Client Application) 강력한 보안을 지원하는 대신 많은 제약이 뒤따릅니다. 예를 들면 부트스트래퍼 미지원, GAC에 공용어셈블리 설치 불가, 설치위치 임의 변경 등이 되겠네요. 또한 NTD의 고질적인, 달리 말해 많은 개발자가 고민하는 문제가 보안설정변경(CAS – Code Access Security)이겠죠. CAS 변경을 위해 별도의 ActiveX에 의존하게 됩니다. 또한 클라이언트 머신에 닷넷 프레임워크가 설치되어 있어야 하는데 NTD는 부트스트래퍼를 지원하지 않으므로 닷넷 프레임워크를 설치과정에 포함시킬 수가 없죠. 반면에 Windows Installer는 굉장히 강력하죠. 자동업데이트 및 온라인실행 지원이 되지 않는 것을 제외하곤 상상가능한 모든 설치작업이 가능합니다. 그렇다면 ClickOnce는? 앞에서 거론한 NTD의 대표적인 단점인 부트스래퍼와 CAS 변경 자동화 기능을 지원하며 Windows Installer의 단점인 자동업데이트와 온라인/오프라인 실행 및 설치를 지원합니다. 물론 단점도 있죠. 이 문서에서 다루려는 내용도 ClickOnce의 단점 중에 하나를 보완하기 위한 방법을 알리기 위한 것입니다. 단점이라기 보다는 까다로운 점이라고 하는 게 정확할 듯 합니다. 구현 가능한 것이니까요.

주제

이 문서의 주제는 ClickOnce에 사용자 정의 필수 구성요소 추가하는 방법에 대한 것입니다.

사전지식

ClickOnce는 별도의 설정을 하지 않는 이상 어플리케이션이 참조하는 공용어셈블리에 대해 설치작업을 지원하지 않습니다. 즉, A라는 어플리케이션이 Ref.A라는 공용어셈블리(여기에서 언급하는 공용어셈블리는 써드파티 제품을 의미합니다. 즉, 로컬어셈블리로 변환 불가한 어셈블리입니다. – 추1 : 개발자가 생성한 공용어셈블리 배포에 대해서는 테스트가 필요합니다.)를 참조하는 프로젝트를 게시할 경우 Ref.A는 기본설정에 배포될 응용프로그램 파일리스트에서 제외됩니다. 임의로 포함되도록 변경하더라도 설치과정에서 오류가 발생합니다. (대표적인 것으로 Microsoft.mshtml.dll, Infragistics Winform controls이 있습니다.) 그렇다면 ClickOnce로는 방법이 없는걸까요? 그렇지는 않습니다. 게시하려는 프로젝트의 속성 창을 열고 게시 속성 탭을 열면 필수구성요소를 변경하는 버튼이 있습니다. 이 버튼을 클릭하면 다음과 같은 다이얼로그가 출력됩니다. (항목은 개발자 머신마다 다를 수 있습니다.)

사용자 삽입 이미지

설치할 필수 구성 요소 리스트를 살펴보면 .NET Framework, MDAC, Crystal Reports 등이 있음을 알 수 있습니다. 이 필수 구성 요소들은 ClickOnce 게시한 제품이 설치되기 전에 먼저 설치되어야 하는 요소들입니다. 대표적인 요소가 .NET Framework 2.0 이겠죠.

필수 구성 요소를 추가하는 방법은 다음과 같습니다.

  1. 프로젝트 속성 창에서 게시 속성을 엽니다.
  2. <설치 모드 및 설정> 그룹에서 <필수 구성 요소> 버튼을 클릭합니다.
  3. 필수 구성 요소 다이얼로그에서 <필수 구성 요소를 설치하기 위한 설치 프로그램 만들기> 체크박스를 체크합니다.
  4. <설치할 필수 구성 요소 선택> 리스트에서 필요한 구성 요소를 선택합니다.
  5. <필수 구성 요소의 설치 위치를 지정하십시오.> 라디오 버튼 그룹에서 다운로드 위치를 선택합니다.
  6. <확인> 버튼을 클릭하여 작업을 완료합니다.
  7. 게시합니다.

위의 작업을 수행하여 게시할 경우 필수 구성 요소들이 제품이 설치되기 전에 먼저 설치됩니다. 간단하죠. 하지만 문제가 있습니다. 위 절차 중 4. <설치할 필수 구성 요소 선택> 리스트에 없는 요소를 추가하려면 어떻게 해야 할까요? 위에서 언급했던 Microsoft.mshtml.dll 이나 써드파티 컴포넌트의 경우 말이죠. 이런 경우를 위해 MS에서는 사용자 정의 필수 구성 요소 선택하는 방법에 대해 친절히 설명하고 있습니다. 관련 MSDN URL은 참고문헌을 참고하세요.


하지만 위 문서에서 결정적으로 빠진 내용이 있습니다. 위 문서 중반 부분에 이런 내용이 있습니다.

새 구성 요소 패키지를 만들려면 다음을 제공해야 합니다.

  • EXE 또는 MSI 파일 형식의 재배포 가능 구성 요소
  • 패키지의 모든 언어 중립 메타데이터가 포함된 제품 매니페스트(product.xml). 이 매니페스트에는 모든 지역화된 재배포 가능 구성 요소 버전에 공통되는 메타데이터가 포함되어 있습니다.
  • 언어별 메타데이터가 포함된 패키지 매니페스트(package.xml). 이 매니페스트에는 일반적으로 지역화된 오류 메시지가 포함되어 있습니다. 구성 요소에는 지역화된 버전의 해당 구성 요소별로 최소한 하나의 패키지 매니페스트가 있어야 합니다.

첫 번째 항목은 Windows Installer로 설치파일을 만드는 것을 말합니다. Windows Installer로 설치파일을 만드는 방법은 문서 마지막 참고문헌을 참고하세요.
문제는 두 번째와 세 번째 항목입니다. 제품 매니페스트와 패키지 매니페스트 파일을 구성하는 것인데 구성하는 방법이 쉽지 않습니다. 자세한 내용은 제품 및 패키지 스키마 참조 문서에 있지만 살펴보면 이해하기가 만만치 않습니다. 무엇보다 우리가 원하는 것은 PackageFile이 msi(Windows Installer)일 경우 <InstallChecks> 작성하는 방법과 <Commands> 작성하는 방법인데 말이죠, 이와 관련해서는 예문이 없습니다. 그래서 이것 저것 장님 문고리 잡듯이 MSDN에 있는 샘플 매니페스트를 수정해가면서 게시하는데 3~4분 걸리는 프로젝트를 테스트해 보았습니다. 근 15여 차례 정도? 계속 Install error가 생겨서 install log를 살펴보니 product.xml(제품 매니페스트)의 <InstallChecks>와 <Commands>의 <InstallConditions>에서 오류가 생기더군요. 도저히 이런 방법으론 안되겠다 싶어 제품 및 패키지 스키마 참조를 다시 읽어 보았습니다. 살펴보니 <InstallChecks> 하위 요소에 <MsiProductCheck>란 놈이 있더군요. MsiProductCheck를 사용해서 구글에서 검색해 결국 답을 얻었습니다. MS 포럼에 질문이 올라와 있더군요. 링크는 다음과 같습니다. http://forums.microsoft.com/msdn/showpost.aspx?postid=5396&siteid=1 위 링크에서 얻은 내용을 토대로 MSI 설치 파일(Windows Installer 설치 파일)을 사용한 사용자 정의 필수 구성 요소를 구성하는 방법을 정리해 보았습니다.

솔루션

ClickOnce에 MSI 설치 파일 필수 구성 요소 추가하는 절차는 다음과 같습니다.
편의상 msi 파일은 미리 만들어져 있고 파일명은 PreInstall.msi로 합니다.

  1. \Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Package 폴더로 이동합니다.
  2. 폴더를 만듭니다. (예: PreInstall)
  3. 새로 만든 폴더에 PreInstall.msi 파일을 복사합니다.
  4. product.xml 파일을 새로 만듭니다. (표-1)의 코드를 복사해 넣습니다.
  5. (표-1)의 코드에서 PreInstall 문자열을 적절하게 변경하시면 되고, 중요한 부분은 <InstallChecks><MsiProductCheck>의 Product 속성입니다. 이 곳에는 Visual Studio 2005의 설치 프로젝트 속성에 있는 ProdcutCode 값을 복사해 넣으면 됩니다. 중괄호({…})를 포함한 값입니다.
  6. PreInstall 폴더에 Ko폴더를 새로 만듭니다. 새로 만든 Ko폴더로 이동합니다.
  7. eula.txt 파일을 만들고 소프트웨어 사용권 내용을 입력합니다.(아무런 내용이든 상관없습니다.)
  8. package.xml 파일을 만들고 (표-2)의 내용을 복사해 넣습니다.
  9. PreInstall 문자열을 적절하게 변경시키면 됩니다.

(표-1)

<?xml version="1.0" encoding="utf-8" ?>

<Product

xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"

ProductCode="PreInstall">

<!-- Defines list of files to be copied on build -->

<PackageFiles>

<PackageFile Name="PreInstall.msi"/>

</PackageFiles>

<RelatedProducts>

<DependsOnProduct Code="Microsoft.Net.Framework.2.0" />

</RelatedProducts>

<InstallChecks>

<MsiProductCheck

Property="PreInstall"

Product="{XXXX…}"

/>

</InstallChecks>

<Commands Reboot="Defer">

<Command PackageFile="PreInstall.msi" Arguments="/quiet /qn" EstimatedInstallSeconds="10" EstimatedInstalledBytes="1000000">

<InstallConditions>

<BypassIf Property="PreInstall" Compare="ValueEqualTo" Value="5"/>

<!-- Block install if there is no .NET Framework -->

</InstallConditions>

<ExitCodes>

<ExitCode Value="0" Result="Success"/>

<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure"/>

</ExitCodes>

</Command>

</Commands>

</Product>


(표-2)

<?xml version="1.0" encoding="utf-8" ?>

<Package

xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"

Name="DisplayName"

Culture="Culture"

LicenseAgreement="eula.txt">

<PackageFiles>

<PackageFile Name="eula.txt"/>

</PackageFiles>

<!-- Defines a localizable string table for error messages-->

<Strings>

<String Name="DisplayName">PreInstall</String>

<String Name="Culture">ko</String>

<String Name="GeneralFailure">

A failure occurred attempting to install PreInstall

</String>

</Strings>

</Package>



위의 절차는 내가 만든 MSI 설치파일을 ClickOnce 게시 프로젝트에 추가하는 최소한의 절차입니다. 좀 더 자세한 내용은 MSDN을 참조하십시오.


참고문헌

1. MSDN : ClickOnce와 Windows Installer 비교
2. MSDN : 사용자 지정 필수 구성 요소 추가
3. MSDN : 제품 및 패키지 스키마 참조
4. MSDN : Use the Visual Studio 2005 Bootstrapper to Kick-Start Your Installation
5. MS Forums : MsiProductCheck element

Fusion 7 : Loading Assemblies Dynamically


오늘은 동적으로 어셈블리를 로드하는 기법에 대해 알아본다.Assembly.LoadFrom(), Assembly.Load()와 같은 Reflection 메서드를 사용하는데, 이게 내부적으로 동작하는게 만만치 않게 복잡한 편이다. 현업에선 주로 LoadFrom()/Load()를 사용해 어셈블리를 동적으로 로딩한 후, 이를 활성화 하여 사용하는데, 이렇게 하는 이유는, 어플리케이션의 재컴파일없이 구성정보 등를 통해 어플리케이션의 기능을 확장(메뉴를 추가하거나 화면을 추가함)할 수 있고, 또 NTD(No-Touch Deployment)가 가능하다는 점이라 생각한다.
일반적인, 정적으로 참조가 걸린 라이브러리 형태에서, 후에 새로운 라이브러리를 생성해 기존 어플리케이션에 기능 또는 화면으로 추가하고 싶다면, 기존 어플리케이션을 개발환경에서 열고, 새 라이브러리에 대한 참조를 추가 한후 다시 컴파일 해서 다시 클라이언트에 ClickOnce 등을 통해 배포해야 한다.
그러나 동적으로 어셈블리를 로딩하는 구조라면? 구성(파일 또는 DB)을 통해 로딩할 기능(화면)을 정의해 두고, 이를 어플리케이션 시작 시에 읽어들여, 필요한 기능(화면) 에 대한 라이브러리 어셈블리를 공용의 저장소로 부터 동적으로 로딩해 사용한다면, 기존 어플리케이션을 재 컴파일할 필요가 없고, 배포할 필요도 없어진다.
그러나 당연히 이 아키텍쳐도 단점이 있으며 모든 환경에 적합한 절대 "참"의 구조라곤 할 수 없다..(아래에 조금 설명됨)

즉 자주 수정될 수 있는 어플리케이션 모듈은 서버 상의 공용 저장소에 올려두고 클라이언트 어플리케이션은 이를 LoadFrom/Load 해서 동적으로 가져다 쓰게 되면, 모듈이 수정되더라도 클라이언트 측에 새로 배포할 부담이 (거의) 없다. 그러나 클라이언트에 내려와 있는 모듈이 아니므로 이 모듈에 대한 초기 로딩 시에 동적 로딩으로 인해 발생하는 지연은 감수해야만 한다. 한 번 로딩 후에는 클라이언트 (Internet Explorer) 캐시 상의 모듈이 사용되므로 초기 지연이 다시 발생하진 않지만, 캐시 상의 모듈이 언제 다시 refresh 될지는 ..... 예측 가능한 부분, 신뢰할 수 있는 부분이 아니다. 한가지 확실한 건, 모듈이 변경되지 않는 이상, 최소한 프로그램 실행 동안에는 캐시에 존재하는 모듈을 사용한다. 종료 후 다시 시작하면?.. 사용될 수도, 그렇지 않을 수도...-_-! .. 오늘 쫌 길다..맘 단디 무라...

* 용어 : 라이브러리 - Library 형태의 닷넷 어셈블리, 즉 *.dll

라이브러리가 정적으로 연결되었다 하더라도(static linked) 지연된 로딩이 발생하게 된다. 이는 라이브러리의 풀 네임으로 참조하는 어셈블리라 하더라도, 라이브러리는 처음 사용되기 직전에 로딩된다는 의미이다.
라이브러리가 strong name을 가지고 있지 않다면, 이는 어플리케이션 폴더나 그 하위의 폴더에 존재할 수 있다. 만일 strong name을 가지고 있다면, 어플리케이션 폴더, 로컬 디스크 상의 어떤 위치, GAC 또는 다른 머신 상에 위치할 수 있다.

.NET Framework은 코드 상에서 어셈블리를 로드할 수 있는 방법을 제공한다. 하지만 이는 컴파일 타임에 해당 라이브러리의 메타데이터를 알 수 없으므로 자주 사용되어 지는 방법은 아닐 것이다. 이 경우 타입과 멤버의 메터데이터 정보가 요청하는 어셈블리내에 저장되지 않는게 되는 것이다.그리고 new 키워드를 사용해 객체를 생성할 수도 없다. 또는 타입의 멤버를 직접 호출할 수도 없다. 대신, 객체를 생성하기 위해 Framework의 활성화(Activation) 클래스를 사용해야 하며, 객체의 멤버에 접근하기 위해 Reflection을 사용해야 한다. 이는 Visual Basic의 "late 바인딩"과 같은 개념이면서 동일한 문제를 내포하고 있다.
Late 바인딩은 타입 검사가 런타임 시에 코드의 사용자, 즉 고객에 의해 수행된다. 가급적 late binding은 지양해야 할 방법이라 할 수 있다.
라이브러리는 어플리케이션 도메인 상에 로드되는데 라이브러리 로드를 위한 메커니즘은 존재하지만 언로드를 위한 메커니즘은 존재하지 않는다. 하지만 라이브러리들이 적재되어 있는 전체 어플리케이션 도메인을 언로드 하는 메커니즘은 존재한다. 라이브러리를 동적으로 로드할 때 발생할 수 있는 몇가지 흥미로운 이슈들이 존재한다.


■ Reflection을 이용해서 어셈블리 로드하고, 메서드 호출하기

아래의 strong name을 가지고 버전이 1.0.0.0인 lib.cs를 사용한다.
만일 프로세스 어셈블리(lib을 참조하고 있는 어셈블리) 코드가 아래와 같다면,


using System;
using System.Reflection;
class App
{
static void Main()
{
try
{
object obj = FromAssembly("lib");
InvokeObject(obj);
}
catch(Exception e1)
{
Console.WriteLine(e1.Message);
}
}
static object FromAssembly(string shortName)
{
Console.WriteLine("Use Assembly.Load");
AssemblyName name = new AssemblyName();
name.Name = shortName;
Assembly a = Assembly.Load(name);
Type type = a.GetType("LibraryCode");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
return ctor.Invoke(null);
}
static void InvokeObject(object obj)
{
Type type = obj.GetType();
MethodInfo mi = type.GetMethod("GetVersion");
string version = (string)mi.Invoke(obj, null);
Console.WriteLine(version);
}
}

위 코드에서 FromAssembly 메서드는 객체를 로드하고, InvokeOjbect 메서드는 객체의 GetVersion 메서드를 호출한다.
이 코드 내에서 FromAssembly는 어셈블리 명을 생성한 후 Assembly.Load() 를 이용해서 어셈블리를 로드한다.
컴파일 하고 실행; 라이브러리가 로컬 폴더에서 로드되는 것을 볼 수 있다. Private 어셈블리를 위해 Fusion은 오직 Short Name만을 확인한다.

라이브러리의 public key 토큰을 추출한다.

C:\TestFolder>sn -T lib.dll
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Public key token is 3bf941bb1f722efe


이제 라이브러리를 GAC에 추가하고 로컬 폴더에 있는 라이브러리 어셈블리(lib.dll)를 제거한다. 그리고 실행한다.
FileNotFoundException이 발생한다. 이유는 Assembly.Load()을 이용해서 GAC으로부터 어셈블리를 로드할 때, Fusion은 어셈블리의 Full Name을 요구하기 때문이다.

그러므로 코드를 변경하여 Full Name을 명시하도록 한다.

static object FromAssembly(string shortName)
{
Console.WriteLine("Use Assembly.Load");
AssemblyName name = new AssemblyName();
name.Name = shortName;
name.Version = new Version("1.0.0.0");
name.CultureInfo = new CultureInfo("");
byte[] pkt
= new byte[] {0x3b,0xf9,0x41,0xbb,0x1f,0x72,0x2e,0xfe};
name.SetPublicKeyToken(pkt);
Assembly a = Assembly.Load(name);
Type type = a.GetType("LibraryCode");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
return ctor.Invoke(null);
}


배열 pkt는 public key 토큰의 바이트 배열이다. 이 경우 어셈블리가 culture 정보를 가지지 않는다. 하지만 neutral culture로 간주되어야 하므로 CultureInfo 객체가 공백문자열로서 초기화 되어 할당되어 진다.(CultureInfo 를 사용하기 위해서 System.Globalization 네임스페이스를 사용해야 함)
다시 컴파일 하고 실행 이제 GAC으로 부터 라이브러리가 로드되는 것을 알 수 있다.

Assembly.Load()에는 스트링을 인자로 받는 overload된 메서드를 제공한다.

어셈블리의 short name을 제공하여 호출하는 경우, 라이브러리가 private assembly 인 경우에만 로드가 된다. Short name을 제공했지만 private assembly가 아닌 경우 로드는 실패하게 된다.

□ 호출 : Assembly a = Assembly.Load("lib");

lib.dll : 어플리케이션 폴더에 존재하고 GAC에도 등록
결과 : GAC으로 부터 로드됨

l ib.dll:GAC에만 존재
결과 : 예외 발생 : Could not load file or assembly "lib" or one of its dependencies.

어셈블리에 대한 full name을 알고 있다면 아래 처럼 full name을 인자로 전달함으로써 GAC에서 로드할 수 있다.

호출 : Assembly a = Assembly.Load("lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bf941bb1f722efe");

lib.dll : 어플리케이션 폴더에 존재하고 GAC에도 등록
결과 : GAC으로 부터 로드됨

l ib.dll:GAC에만 존재
결과 : GAC으로 부터 로드됨

큰 그림 보려면 클릭하세요!(돋보기도 같이 활용)

결론:

Assembly.Load를 호출 시,

short name 을 사용해서 호출할 경우 반드시 어플리케이션 폴더에 참조하는 라이브러리 어셈블리가 존재해야 함.
이때 동일한 short name의 어셈블리가 GAC에도 등록되어 있다면, GAC에서 로드함. (그러나 어플리케이션 폴더에 참조하는 어셈블리가 없다면 예외 발생함.)
이때, 어플리케이션 폴더에 있는 라이브러리 어셈블리의 버전과 동일한 버전이 GAC에 존재하면 GAC에서 로드하지만, 존재하지 않는 경우(다른 버전만 GAC에 존재하는 경우) 어플리케이션 폴더 내의 라이브러리를 로드한다.

어플리케이션 폴더에는 short name과 일치하는 어셈블리가 존재하다면, 어떤 버전이든 상관없이 로드하게 된다.
full name을 사용해서 호출할 경우 반드시 일치하는(버전, public key 토큰) 라이브러리가 GAC또는 어플리케이션 폴더에 존재해야 함.
Full name을 사용해서 호출할 경우 GAC에 full name에 일치하는(버전, public key 토큰)의 라이브러리가 존재하면, GAC에서 로드함. 그러나 GAC에 존재하지 않으면 어플리케이션 폴더에서 full name에 일치하는(버전, public key 토큰)의 라이브러리를 로드함.어떤 경우든 full name과 버전, public key 토큰이 일치하는 게 없다면 예외 발생함.

어셈블리를 로드하는 다른 방법도 존재한다.
Assembly a1 = Assembly.LoadFile(@"c:\TestFolder\lib.dll");
Assembly a2 = Assembly.LoadFrom("lib.dll");

LoadFile은 Fusion을 사용해 파일을 찾지 않는다. 대신 이 메서드에는 인자로서 어셈블리에 대한 전체 경로를 전달해야 한다. 이는 어떤 위치에 있는 어셈블리도 로드할 수 있다는 의미가 된다. 예를 들면, 파일의 win32 폴더(GAC의 물리적 위치)로 파일에 대한 경로를 지정한다면 GAC으로 부터의 로드도 가능하다는 의미이다.
LoadFrom 역시 전체 경로를 인자로 받지만, 상대 경로를 허용한다.
이들 메서드의 문제는 어셈블리가 반드시 private assembly 여야 한다는 것이다. GAC으로 부터 로드할 수 있는 충분한 정보를 제공할 수 없기 때문이다.
추가로, Load 메서드는 또한 byte[] 배열 인자를 취하는 overload 도 제공한다. 이 배열은 어셈블리의 실제 바이트들을 포함해야 한다.

static object FromFile(string fileName)
{
System.IO.FileStream fs = System.IO.File.OpenRead(fileName);
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
fs.Close();
Assembly a = Assembly.Load(data);
Type type = a.GetType("LibraryCode");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
return ctor.Invoke(null);
}


위의 Load(byte() 사용해 라이브러리를 로드하면 해당 경로에 반드시 어셈블리 파일이 존재해야 한다.
그러나, GAC에 동일한 어셈블리가 등록된 상태라면? 위의 Load(shortname) 처럼 GAC에서 로드할까? 그러하다(?)..
큰 그림 보려면 클릭하세요!(돋보기도 같이 활용)
.NET Framework 3.0에서는 두 개의 새로운 메서드 ReflectionOnlyLoad(), ReflectionOnlyLoadFrom()을 제공한다. 이들은 코드 검사만을 위한 어셈블리를 리턴하므로 코드를 실행할 수는 없다.

■ 객체 활성화(Activating Objects)

Assembly 함수들을 사용하는 데 있어서의 다른 주요한 문제는 reflection을 통해 객체를 활성화 해야 하다는 점이다.
객체를 활성화 하는 두 개의 다른 방법이 존재한다. : 아래 함수들은 내부적으로 Assembly.Load()에 의해 수행되는 어셈블리 로딩 작업을 포함하므로 Assembly.Load() 대신 사용해도 된다.

1. Activator 사용

static object UseActivator(string name)
{
ObjectHandle oh
= Activator.CreateInstance(name, "LibraryCode");
return oh.Unwrap();
}

Activator는 리모팅에 의해 사용되며 ObjectHandle은 객체 참조를 어플레케이션 도메인 간에 전달하는 메커니즘을 제공한다.
위에서 보듯이 객체를 사용하기 전에 반드시 ObjectHandler 을 unwap 해야 하는 것을 볼 수 있다. AppDomain은 객체를 활성화 하고 핸들을 unwrap 하는 메서드를 제공한다.
다른 하나의 코드이다.

2.AppDomain 사용
static object UseAppDomain(string name)
{
AppDomain ad = AppDomain.CurrentDomain;
return ad.CreateInstanceAndUnwrap(name, "LibraryCode");
}

1 번 방법보다 간단하게 호출할 수 있다.


■ 로컬 어셈블리와 GAC 어셈블리

메인 메서드를 아래와 같이 변경해서 실행한다고 가정한다.

static void Main()
{
object obj = null;
try
{
obj = UseAppDomain("lib, Version=1.0.0.0, "
+ "Culture=neutral, PublicKeyToken=3bf941bb1f722efe");
InvokeObject(obj);
}
catch(Exception e1)
{
Console.WriteLine(e1.GetType().ToString());
}
try
{
obj = UseAppDomain("lib");
InvokeObject(obj);
}
catch(Exception e2)
{
Console.WriteLine(e2.GetType().ToString());
}

static object UseAppDomain(string name)
{
AppDomain ad = AppDomain.CurrentDomain;
return ad.CreateInstanceAndUnwrap(name, "LibraryCode");
}
static void InvokeObject(object obj)
{
Type type = obj.GetType();
MethodInfo mi = type.GetMethod("GetVersion");
string version = (string)mi.Invoke(obj, null);
Console.WriteLine(version);
}
}


GAC에는 lib 어셈블리 등록된게 없다.(gacutil -u lib)
위 코드 상의 두 호출 모두 lib.dll을 어플리케이션 폴더에서 로드할 것이다.
이제 GAC에 lib.dll을 등록하고 로컬 파일 명을 lib.old.dll로 변경한다.
그러면, full name을 이용한 호출은 성공할 것이지만, short name 호출은 실패(FileNotFoundException)할 것이다. 이유는 위에서 설명되었다.
이제 다시 lib.old.dll을 lib.dll로 원상복구 한다.
이렇게 한 후 호출을 하면, 예상컨데, 위의 full name호출은 GAC으로 부터, 아래의 short name 호출은 어플리케이션 폴더(로컬)로 부터 로드될 것이다. 그러나. 결과는 두 호출 모두 GAC으로 부터 로드된다.
이는 Fusion은 주어진 short name으로 로컬 버전을 찾고, 존재하면 로컬 버전의 정보를 이용해 full name을 얻는다 그리고 이를 가지고 GAC으로부터 어셈블리를 로드하려고 하기 때문이다.

결론적으로 Load() 의 작동메카니즘은,

먼저 (검색할) 어플리케이션 폴더를 확인한다. 이를 위해 구성 파일의 codeBase 항목을 확인하여 존재하는 경우 그 하위 폴더도 포함된다.
어셈블리에 Culture 정보가 명시된 경우, culture 명으로 된 하위 폴더를 검색함. Culture 정보가 명시되지 않은 경우 어플리케이션 폴더 내에서 검색됨.

1. 기본 어플리케이션 폴더 검색

i. Short name을 가진 DLL을 어플리케이션 폴더에서 검색. --> /appFolder/lib.dll
ii. 존재하지 않는다면,short name 명을 가진 하위 폴더를 검색함. --> /appFolder/lib/lib.dll
iii. 존재하지 않는다면, EXE 가 검색됨.(어플리케이션 폴더, short name 명을 가진 하위 폴더)

--> /appFolder/lib.exe
--> /appFolder/lib/lib.exe

2. Private Path 검색
그런 후 Fusion은 <probing> 요소 내에 privatePath가 존재하는지 확인함. 존재하는 경우 명시된 그 폴더와 short name 명을 가지 그 하위폴더들에 대해 DLL/EXE 검색을 수행함.

i. /appFolder/private/lib.dll
ii. /appFolder/private/lib/lib.dll
iii. /appFolder/private/lib.exe
iv. /appFolder/private/lib/lib.exe

현재 테스트 중인 라이브러리는 strong name을 가진다. 그리고 GAC과 어플케이션 폴더 모두에 존재한다.
위의 어셈블리 찾기 과정은 private assembly을 로드 할 것이다. 하지만 Load는 찾은 라이브러리가 strong name을 가지는지 확인 후, 가지는 경우, 그 정보를 이용해 다시 어셈블리를 검색하게 된다.

3. Binding policy 확인(Version Redirection 확인)
어플리케이션 구성, publisher policy, machine 구성을 확인하여 버전 redirect가 있는지 확인한다.

4. 그리고 어셈블리가 이미 로드되었는지를 확인한다.
5. 이미 로드되지 않았다면, GAC을 확인한다.
6. 만일 GAC에서 어셈블리가 발견되면 그것을 리턴하게 된다. --> GAC 버전
7. 그렇지 않으면 어플리케이션 폴더의 로컬 버전이 리턴된다. --> 어플리케이션 폴더 버전

■ Partial Names

Assembly 클래스는 LoadWithPartialName 메서드를 제공한다. 이 방법은 권장되지 않는다.
이 메서드를 사용할 때 완전한 full name을 전달하지 않으면 Fusion은 가장 먼저 찾은(가장 높은 버전의) 어셈블리을 리턴하게 된다.

static object UsePartialName(string name)
{
Assembly a = Assembly.LoadWithPartialName(name);
Type type = a.GetType("LibraryCode");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
return ctor.Invoke(null);
}

■ <qualifyAssembly>

Partial name을 사용하는 다른 방법으로서 구성 파일 설정을 포함하는 방법을 제공한다.
<assemblyBinding> 내의 <qualifyAssembly> 요소를 추가할 수 있는데 이는 partial name을 해당하는 full name으로 매치시켜 준다.
이를 위해 직접 구성파일을 편집해야 한다.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly
partialName="lib"
fullName="lib,version=1.0.0.0,culture=neutral, ¶
publicKeyToken=3bf941bb1f722efe"
/>
</assemblyBinding>
</runtime>
</configuration>

호출을 아래와 같이 partial name(short name) 으로 하더라도 매치되는 full name으로 어셈블리가 로드된다.
object obj = UsePartialName("lib");

■ AssemblyResolve Event

어셈블리를 로드 시 Fusion은 특정 어셈블리를 찾지 못하면 AssemblyResolve 이벤트를 현재 AppDomain 상에 발생시킨다. 이 이벤트는 다른 .NET 이벤트와 달리 값을 리턴한다. 그러므로 오직 하나의 델리게이트 만이 이벤트를 처리해야 한다.
하나 이상의 이벤트 핸들러를 가진다면 가장 마지막 이벤트 핸들러로 부터의 리턴 값이 사용된다. 다른 이벤트 핸들러는 무의미 해진다.
AssemblyResolve 이벤트는ResolveEventHandler 델리게이트 이다.:
public delegate Assembly ResolveEventHandler( object sender, ResolveEventArgs args);

델리게이트는 하나의 ResolveEventArgs 인자를 취하며, 이 ResolveEventArgs 는 Name이라는 string 속성을 가진다. 이 속성은 요청된 어셈블리의 full name 값을 가진다. 이벤트 핸들러는 이 속성(Name)을 이용해 요청된 어셈블리를 찾고 로드하게 된다.
이 시점에서 Fusion이 어셈블리를 찾을 수 없는 경우에 임의로 어셈블리를 로드하기 위해, Fusion을 내부적으로 이용하는 특정 메서드를 사용해서는 안된다.
예를 들어, 아래와 같이 샘플의 main 메서드를 변경하고,

static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve
+= new ResolveEventHandler(ResolveAssembly);
try
{
object obj = FromAssembly("lib");
InvokeObject(obj);
}
catch(Exception e)
{
Console.WriteLine(e.GetType().ToString());
}
}
static object FromAssembly(string shortName)
{
Console.WriteLine("Use Assembly.Load");
AssemblyName name = new AssemblyName();
name.Name = shortName;
name.Version = new Version("1.0.0.0");
name.CultureInfo = new CultureInfo("");
byte[] pkt
= new byte[] {0x3b,0xf9,0x41,0xbb,0x1f,0x72,0x2e,0xfe};
name.SetPublicKeyToken(pkt);
Assembly a = Assembly.Load(name);
Type type = a.GetType("LibraryCode");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
return ctor.Invoke(null);
}


이벤트 핸들러가 어셈블리를 로드하도록 시도하게 할 것이다. 일단 아무 일도 하지 않도록 하고 테스트 한다.
static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
return null;
}


(GAC 에 등록된 lib 이 없는 상태에서)
컴파일 후 lib.dll을 lib.old로 rename 하고 실행을 하면, FileNotFoundException 예외가 발생할 것이다. Short name을 가진 어셈블리가 어플리케이션 폴더에 존재하지 않고, full name을 가진 어셈블리가 GAC에 존재하지 않기 때문이다. 하지만 우리는 요청하는 어셈블리가 로컬 폴더에 존재한다는 것을 알고 있다. 단지 이름만 변경되었다는 것을 알고 있다. 그래서 우리는 이벤트 핸들러를 이용해서 실제의 이름으로 로드 해보기로 한다.

static Assembly ResolveAssembly(
object sender, ResolveEventArgs args)
{
string[] name = args.Name.Split();
string assem = name[0].Substring(0, name[0].Length-1);
return Assembly.LoadFrom(assem + ".old");
}


Name 속성이 full name을 전달할 것이므로 이를 파싱하여 파일명을 얻는 과정이 필요하다.
실행을 하면, 이름 변경된 lib.old가 로드된다.

큰 그림 보려면 클릭하세요!(돋보기도 같이 활용)

끝.

RegFreeCOM : 등록(regsvr32)이 필요없도록 COM 참조하기

원문 : http://msdn.microsoft.com/msdnmag/issues/05/04/RegFreeCOM/

닷넷 개발환경에서 개발을 하더라도 항상 managed 코드나 어셈블리만을 다루는 것은 아니다.

아직까지 COM에 대한 의존도를 무시할 수 없다. 더군다나 우리가 꼭 사용해야 하는 윈도우/오피스 관련 컴포넌트들은 거의 COM 기반 인 경우가 많다. 이들을 가지고 개발을 하기 위해서 우리는 Interop 과정을 통해 interop.*.dll 과 같이 COM을 닷넷 환경에서 사용할 수 있도록 wrapping한 모듈을 생성해서 이를 참조 사용한다. (MS에서는 주요 COM 컴포넌트에 대해서는 PIA라고 해서 개발자들을 위해 미리 Interop 된 어셈블리를 제공하기도 한다.)
물론 우리의 고마운 Visual Studio는 이 작업을 대신 해 주므로 우리는 그냥 참조 추가만 해 주면 된다.
요컨대 아직 우리의 닷넷 기반 개발은 COM을 사용해야 할 때가 많다는 것이고, 그렇다면 우리가 이전에 “DLL Hell”이라 부르던 문제(?)에 대해 아직 완전하게 자유로울 수 없다는 이야기 되겠다. 그렇다면 닷넷 어셈블리처럼 자기 완결적인 정보를 스스로 가지고 있어서 XCOPY 만으로 배포가 가능한 그러한 COM을 만들 수는 없을까? 그러면 DLL Hell을 피하면서 맘 푹 놓고 COM을 참조해 개발을 하고, 클라이언트에 배포할 수 있을 텐데…
우연히 발견한 msdn 매거진의 아티클 하나가 참으로 가려운 곳을 긁어 주었다. 또한 이 기술인 이미 Windows XP와 함께 소개되었다는 사실은 나에게 한 소리한다. “너…시..공부 안할래?.... 남들 다 아는 사실을 니만 모르고 있다..무슨 노다지라도 캔 양…”, “알았다… 지금이라도 알았으니까 모른척 알고 있었던 척 하면 데잖아……-_-!”.

이 내용을 아시는 분은 그저 썩소 한방씩 보내기 바란다…..이번 글은 번역 수준으로 글을 올린다.
naive assembly 부분은 역자의 소질이 미약하여 번역이 어색할 것이다. 이해 바란다.

우리가 VB6나 ATL을 이용해 작성한 사용자컨트롤이나 또는 다른 객체를 작성하는 것은 COM을 이용하는 것이다. 닷넷 이전에 COM은 윈도우 상의 어플리케이션들을 위한 기본적인 컴포넌트 모델이었다.

그러나 COM 컴포넌트를 배포하는 것은 그것을 개발하는 것보다 힘이 들때가 많았다. COM 컴포넌트들은 머신내의 모든 어플리케이션들이 사용할 수 잇도록 전역적으로 등록되어진다. 불행히도, 이 전역적인 등록은 아주 주의 깊게 관리되지 않으면 이들을 사용하는 어플리케이션에 원치않는 부작용을 야기시키게 된다. 이러한 부작용을 우리는 DLL Hell이라 부른다.

이러한 요소들은 닷넷 환경에서 문제가 되지 않는다. 왜냐하면 컴포넌트는 등록되어질 필요가 없으며, 어플리케이션에 분리된 형태로 존재하고, 또한 GAC에 도움으로 잘 정의된 side-by-side 방식에 의해 관리되어 지기 때문이다.

다양한 마이그레이션 마법사는 우리의 코드를 닷넷 프레임웍로 변환하게끔 도와줄 수 있지만, 반드시 실행되는 것은 아니다.

윈도우 XP는 registration-free COM(Reg-Free COM) 이라 부르는 COM 액티베이션 모델을 소개한다. Ref-Free COM은 COM 컴포넌트를 위한 레지스트리에 대한 대안으로서 등장했다. 이는 일반적으로 레지스트리에 설치되는 모든 표준 컴포넌트 등록 정보를 파일로서 표현하도록 한다. 그리고 이 파일은 어플리케이션과 동일한 폴더에 저장되어 진다.

이 문서는 VS2005의 새로운 Reg-Free COM 지원 기능을 이용해서 기존 COM 컴포넌트를 이용하는 어플리케이션을 어떻게 배포하는지 보여줄 것이다. 이 기능은 우리가 XCOPY나 ClickOnce와 같은 간단한 배포 모델로서 이러한 어플리케이션을 배포할 수 있도록 해준다.

Reg-Free COM Overview

전통적으로, 어플리케이션이 COM을 사용하는 경우, 컴포넌트는 작동되기 위핸 등록되어져야만 한다. Figure 1에 보여지는 것 처럼.
이는 어플리케이션이 네이티브 코드이거나 또는 닷넷 프레임웍 기반이냐에 상관 없이 적용되는 규칙이다.

Figure 1 Traditional COM Activation

Figure 1 Traditional COM Activation

시스템 레지스트리에 컴포넌트 정보를 등록하는 것의 이점은 여러 어플리케이션에 의해 공유되어 질 수 있다는 것이다. 또한 컴포넌트를 네트웍의 다른 컴퓨터 상에 설치하고 이를 활성화 하는 것 역시 가능하다. 만일 우리의 어플리케이션이 이러한 기능이 전혀 필요없다면, 즉 오로지 특정 어플리케이션 만이 해당 컴포넌트를 사용하는 상황이라면, 이 머신에 대해 적역적으로 등록하는(시스템 레지스트리에 등록하는) 과정 자체는 불필요한 부담이 된다.

먼저, 모든 컴포넌트가 적절하게 등록되었음을 확인하는 것은 대게 별도의 MSI 또는 EXE 인스톨러와 같은 셋업 프로그램이 필요하다는 것을 의미하게 된다. 또한, 컴포넌트 등록은 12개에서 수천개 까지 방대한 양의 레지스트리 키를 등록시킬수 있다. 만일 이중의 하나라도 잘못되면, 어플리케이션은 작동을 하지 않는다. 이런식으로 등록정보가 머신에 산재하게 된다면 설치제거나 업데이트를 매우 어렵게 한다. 특히나 컴포넌트가 여러 어플리케이션에 의해 공유된다면 더욱 그럴것이다.

Ref-Free COM은 전통적인 COM과는 달리, 시스템 레지스트리에 별도로 컴포넌트가 등록될 필요가 없다. 따라서 이전에 언급된 문제들을 피할 수 있다. 이는 모든 정보를 시스템 레지스트리가 아닌 XML manifest에 표현한다. 이 XML은 단지 어플리케이션 폴더 상에 존재하는 하나의 파일일 뿐이다.

컴포넌트가 manifest를 가지고 있다면, 컴포넌트의 Activation 과정에서 운영체제는 레지스트리를 보기 전에 먼저 manifest를 보게 된다.

Figure 2 Isolated COM Activation

Figure 2 Isolated COM Activation

Reg-Free COM 컴포넌트 모델을 활성화하기 위해서 프로그램(WindowsApplication1.exe)의 일부로서 어플리케이션 manifest(WindowsApplication1.exe.manifest)가 존재하기만 하면 된다.

이는 프로그램이 실행될 때 마다, Native Assembly Loader는 실행파일의 이름에 기반한 manifest 파일을 찾기 때문에 가능하다.

닷넷 어셈블리를 위한 컴포넌트 모델과 같이, 어플리케이션 폴더 외부에 다른 별도의 추가 정보가 존재할 필요가 없다. 윈도우는 컴포넌트 파일과 일치하는 각 식별자(CLSID)에 맵핑 정보 테이블을 내부적으로 구축한다. 이는 어플리케이션 코드가 실행되기 전인, CreateProcess 과정에서 수행된다. 그 후에, 어플리케이션이 컴포넌트를 인스턴스화(메모리내에 객체로서 생성) 할때 CoCreateInstance는 는 시스템 레지스트리를 보기 전에 이 내부의 맵핑 테이블을 먼저 보게 된다. 만일 모든 컴포넌트가 하나 또는 그 이상의 manifest에 의해 완전하게 표현되어 있다면, 어떠한 컴포넌트 등록도 필요치 않게 된다.!!

이 모델의 주요한 이점은 COM 컴포넌트가 완전하게 어플리케이션으로부터 분리되어 진다는 것이다. 다른 어플리케이션이 동일한 COM 컴포넌트( 혹은 다른 버전의 동일 컴포넌트)가 등록되어 지기를 요구한다 할 지라도, 이 어플리케이션은 어떤 방식으로도 간섭을 받지 않는다. 다른 어플리케이션과 완전히 독립적으로 컴포넌트를 사용하게 되는 것이다.

그래서 다른 한편으로는 이 어플리케이션을 위한 COM 컴포넌트를 다른 어플리케이션이 접근할 수 있는 방법도 없다. 그러므로, 버전 충돌 이나 컴포넌트의 GUID 변경으로 인해 야기되는 문제들은 Reg-Free COM를 명시적으로 사용하므로써 피할 수 있게 되는 것이다. (그러나 이러한 점이 컴포넌트의 versioning 전략을 포함한 분배의 회피 수단으로서 사용될 수 없다 할지라도)

결국 업데이트와 설치제거는 어플리케이션 폴더를 제거하거나 대체하는 것이 가장 간단하다.

덧붙이면, Reg_Free COM의 이점을 얻기 위해 기존 코드를 수정할 필요는 없다.적합한 manifest 구성을 설정하는 것만으로 충분하다. 사실, Reg-Free COM의 원래 의도는 기존 VB6, C++ 과 같은 언어로 작성된 네이티브 어플리케이션을 위한 것이었다. 이 글은 닷넷 기반 어플리케이션에서 Reg-Free COM을 사용하는 것에 초점을 두고 있다.

언급했듯이 Native Assembly Loader가 COM 컴포넌트를 manifest를 이용해 바인딩하는데 실패하면, 이전 방식대로 시스템 레지스트리에서 컴포넌트 등록정보를 찾게 된다. 이러한 행동은 Reg-Free COM 어플리케이션으로 적절하게 구성되지 않은 어플리케이션도 작동될 수 있도록 한다. 그러므로, 어플리케이션이 Reg-Fress COM을 위해 올바르게 구성되었는지를 검증하기 이해서 Clean 머신에서 테스트를 하는 것이 가장 좋다.

Isolation COM Components

Visual Studio 2005는 간단한 스위치 기능으로서 COM 컴포넌트를 격리시키도록 하는 새로운 기능을 제공한다. 이는 컴포넌트의 Type Library와 등록 정보로부터 manifest를 자동으로 생성해 준다.

그래서, 개발자 머신 상에 해당 COM 컴포넌트가 등록되어 져야만 COM 컴포넌트를 격리시키는 것이 가능하다. 그러나 이러한 개발자 머신의 헌신 덕분에 우리는 엔드 유저의 머신 상에서 컴포넌트가 등록 과정을 제거할 수 있게 되는 것이다.

Visual Studio 2005 상에서 모든 COM 인터페이스는 Isolated 라 불리는 새로운 속성을 가지고 있다. 기본적으로, 이 속성은 false 값을 가진다. False 값은 이 컴포넌트는 정상적인, 등록된 COM 참조로 취급되어야 한다는 것을 의미한다. 즉 전통적인 COM 참조가 되겠다.

이 값이 True이면, 빌드 타임에 컴포넌트에 대한 manifest가 생성되게 한다. 이는 또한 해당하는 컴포넌트 파일이 어플리케이션 폴더로 복사되어 지게끔 한다. Manifest 생성기가 격리된 COM 참조를 발견하게 되면, 이는 컴포넌트의 Type Library의 모든 CoClass 항목을 열거하게 되고, 각 항목을 일치하는 등록 데이터와 연관시키게 된다. 이 과정 내에서, manifest 는 컴포넌트 파일내에 존재하는 모든 COM 클래스에 대한 정의를 자동으로 가지게 된다.

COM 컴포넌트를 격리하는 기능은 VB6.0 COM 컴포넌트를 VB.NET 또는 C# 어플리케이션 내에 Reg-Free COM으로 배포하기 위해 고안되었다. 이 기능은 VB6.0 컴포넌트에 국한되지 않는다. 그러나 Reg-Free COM의 한계가 존재한다. 이는 "The Limitations of Reg-Free COM" 를 참조 바란다.

다음의 두가지 시나리오에서 어떻게 작동하는지를 보여줄 것이다. 먼저 간단한 VB6.0으로 COM 컴포넌트를 생성하고, 이것이 어떻게 Reg-Free COM을 이용해 배포되는지를 보여줄 것이다. 그리고, 조금 더 복잡한 예제로서 ActiveX 컨트롤이 Reg-Free COM 하에서 어떻게 작동하는지를 볼 것이다.

Isolating a Simple COM Component

VB6.0으로 간단한 COM 컴포넌트를 만드는 것으로 시작한다.
VB6.0에서 ActiveX DLL 형태로 프로제트 생성하고 Class1 코드 모듈에 아래의 코드를 넣는다. 컴포넌트 이름은 VB6Hello로 한다.
VB6가 설치되지 않은 독자는 그냥 첨부된 VB6Hello.dll을 사용해도 된다.
컴파일 한 후 VB6Hello.dll 을 regsvr32로 등록한다.(개발자 머신에는 등록해야 한다.)

	Public Sub SayHello()    	MsgBox "Hello from Visual Basic 6.0"	End Sub

주의 할 점은 ActiveX DLL, ActiveX Control 프로젝트 형식만이 Reg-Free COM 을 지원한다. ActiveX EXE , ActiveX Document 프로젝트 타입은 지원하지 않는다. ("The Limitations of Reg-Free COM"에서 언급되어 진다.)

다음 단계로, 이 COM 컴포넌트를 닷네 윈 폼 어플리케이션에서 참조를 한다.
Visual Studio 2005를 시작하고, 새로운 “RegFreeComDemo_1” 라는 이름의 윈 폼 프로젝트를 생성한다.
“VB6Hello.dll” 에 대한 참조를 추가한다.
“Say Hello” 라는버튼을 추가한다. 버튼의 클릭 이벤트 핸들러에 아래의 코드를 넣어준다.

  	private void button1_Click(object sender, EventArgs e)	{		VB6Hello.Class1Class cls = new VB6Hello.Class1Class();		cls.SayHello();	}

F5를 눌러 실행을 하게 되면 아래의 그림과 같은 실행화면을 만날 수 있다.

Figure 3 RegFreeComDemo1

Figure 3 RegFreeComDemo_1

Reg-Free COM 부분으로 넘어가기 전에 몇가지 살펴보도록 한다.
먼저 빌드 과정에서 생성된 파일을 보면,

Interop.VB6Hello.dll, RegFreeComDemo_1.exe, RegFreeComDemo_1.exe.config 이렇게 존재한다.

여기서 Interop.VB6Hello.dll은 빌드과정에서 자동으로 생성된 COM Interop 어셈블리이다.
그러나 VB6Hello.dll은 폴더 내에 존재하지 않는다는 점을 주목한다.

COM 컴포넌트를 등록 해제 한다. (regsvr32 /u VBHello.dll)

그리고 다시 Visual Studio 2005 IDE 외부에서 RegFreeComDemo_1.exe를 실행한다.(실행파일을 그냥 실행) 그러면 버튼을 눌렀을 때 어플리케이션이 실패하는 것을 확인할 수 있다.

확인 했으면 다시 COM 컴포넌트를 등록( regsvr32) 한다.

이제 COM 컴포넌트를 격리해보자.(Reg-Free COM으로 만들어 보자)
참조 목록이 있는 Reference 노드에서 VB6Hello를 선택하고, Isolated 속성을 True로 변경한다.

다시 실행(F5) 하게되면 정상적으로 작동하게 된다. 이전과 별반 차이가 없이 보이지만 내부적으로 이는 현재 Reg-Free COM 하에서 작동을 하는 것이다.

이를 입증하기 위해, VB6Hello.dll을 다시 등록해제 한 후 Visual Studio 2005 개발환경 외부에서 (실행파일을 그냥 실행) RegFreeComDemo_1.exe를 다시 실행해 본다. 버튼을 클릭하면 잘 작동하는 것을 확인 할 수 있다.!!!!
(앞의 과정에서 regsvr32 /u VB6Hello.dll 한 후 실행 했을 때 오류가 났던 것과는 다르다.)

만일 임의로 manifest 파일의 이름을 다른 이름으로 변경하게 되면 다시 어플리케이션을 실패하게 된다.
빌드 과정에서 생성된 5개의 파일을 확인한다.

  • Interop.VB6Hello.dll,
  • RegFreeComDemo_1.exe,
  • RegFreeComDemo_1.exe. con fig,
  • RegFreeComDemo_1.exe.manifest,
  • VB6Hello.dll

마지막 두개의 파일 COM 컴포넌트를 격리(Isolated=True) 한 후 새롭게 나타난 파일이다.

어플리케이션 manifest 파일, RegFreeComDemo_1.exe.manifest가 바로 Reg-Free COM을 가능하게 하는 바로 그 manifest 파일이다. 위 파일들을 .NET Framework 2.0과 Windows XP가 설치된 다른 머신에 XCOPY 복사하여 실행하여도 잘 작동을 하게 된다.(어떠한 등록 과정(regsvr32) 없이도)
Windows XP는 VB 런타임 라이브러리를 포함하고 있으므로, MSVBVM60.dll, OLEAUT32.dll 등과 같은 라이브러리를 설치해야 할 필요는 없다.
(그러나 어떤 머신에서는 설치가 제거되었거나 어떤 이유에서든지 VB 런타임이 설치되지 않은 상황이 반드시 발생한다… 이럴 때는 MS 다운로드 사이트 가서 VB6 런타임 설치파일을 다운 받아서 설치해주어야 한다.)

어플리케이션 manifest는 실제로 XML 문서이다. 이 파일의 내용은 Figure 5에 있다.

Figure 5 Reg-Free COM Application Manifest

<?xml version="1.0" encoding="utf-8"?>

<assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<assemblyIdentity name="RegFreeCOMDemo_1.exe" version="1.0.0.0" type="win32" />

<file name="VB6Hello.dll" asmv2:size="20480">

<hash xmlns="urn:schemas-microsoft-com:asm.v2">

<dsig:Transforms>

<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />

</dsig:Transforms>

<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />

<dsig:DigestValue>by35ekL4xX8qNvjy6IdVbVYnv9Q=</dsig:DigestValue>

</hash>

<typelib tlbid="{479e93bd-102c-40c9-931f-4baad33b0bbb}" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

<comClass clsid="{48245372-4586-436b-a715-8bfd07e742eb}" threadingModel="Apartment" tlbid="{479e93bd-102c-40c9-931f-4baad33b0bbb}" progid="VB6Hello.Class1" />

</file>
</assembly>


(Hash와 GUID 식별자는 다를 수 있다.)

<file> 요소를 보면 <comClass>, <typelib> 요소를 포함하고 있다. 보는 바와 같이 클래스와 Type Library의 GUID는 manifest에 선언되어 있다. 이는 전통적인 방식에서 시스템 레지스트리에 등록되는 정보와 동일한 정보이다.

ClickOnce를 사용해 본적이 있다면, ClickOnce 어플리케이션 manifest가 존재한다는 것을 알 수 있으며 이 파일이 곧 바로 위에서 말한 manifest 파일이다. 즉 이는 ClickOnce 와 RegFree COM 정의는 동일한 파일 내에 존재할 수 있다는 것을 의미 한다.
그럼 ClickOnce로 배포 되어 질 때 동일한 어플리케이션에 어떤 변화가 일어나는지 보도록 한다.
Visual Studio 2005 에서 프로젝트를 선택한 후 Publish 명령을 실행한다. 그러면 Publish 마법사가 뜬다. 여기서 ClickOnce 구성을 한다.
(ClickOnce에 대해서는 다른 문서 참조 바람)

* ClickOnce 배포를 하기 전에, VB6Hello를 등록해제 했다면, 다시 등록하기 바란다. 언급했듯이 개발자 머신에는 해당 COM 컴포넌트가 반드시 등록되어야 한다. 그렇지 않으면 컴파일이 실패한다.

ClickOnce로 배포를 통해 실행하더라도 잘 작동을 한다. 물론, 실행하는 클라이언트에서 VB6Hello.dll을 등록(regsvr32)한 적이 없다.그러면 ClickOnce의해 배포되어져 내려온 어셈블리를 확인하면, 당연히 아래와 같이 예상대로 어셈블리와 COM 컴포넌트가 존재할 것이다.

ClickOnce 버전의 manifest 파일은 이 문서의 첨부에 포함되어 있으며, 조금 확인해 보면,

이전과 동일하게 <file>, <comClass>, <typeLib>를 포함하지만, 전체 어플리케이션의 모든 파일에 대한 정의를 포함하고 있다. 추가적으로 어플리케이션의 무결성을 보증하기 위한 해시정보가 모든 파일과 어셈블리에 요구된다.

또한 ClickOnce 어플리케이션은 반드시 Sign이 필요하다 XCOPY로 배포하는 (이전의 것) 경우는 이러한 Sign이 필요치 않으며, 이들의 어플리케이션 보안은 Full Trust로 정의되어 진다. 네이티브 코드를 직접 참조하는 모든 어플리케이션(COM 컴포넌트를 포함한)은 Full Trust 보안 레벨로 정의된다. Visual Studio 2005는 만일 우리가 하나 이상의 COM 참조에 Partial trust를 이용하고 있는 경우, 빌드 시 경고를 표시하게 된다.

확인할 사실은 Manifest 내에는 ClickOnce 배포를 위한 정보와 우리가 하고 있는 RegFreeCOM을 위한 정보가 공존할 수 있고, 이 작업은 Visual Studio 2005에 의해 자동으로 이루어 진다는 것이다.

생뚱맞은 이야기지만, Reg-Free COM을 사용하는 경우 최소한의 요구되는 OS는 Windows XP이다.

이번 샘플은 Reg-Free COM을 이용해 간단한 컴포넌트를 호출하는 방법을 보았다. 이는 비즈니스 객체와 같은 훨씬 복잡한 컴포넌트에도 쉽게 적용할 수 있다.

A More Complex Example

이번 샘플에서는 미리 만들어 놓은 VB6ControlTest” 컴포넌트를 이용할 것이다. 이는 VB6 개발환경과 함께 설치되는다른 ActiveX 컨트롤을 사용하고 있는 VB6 사용자 컨트롤이다.

VB6ControlTest.ocx를 로컬 컴퓨터로 복사한 후 등록한다.

Visual Studio 2005를 시작하여 새로운 윈 폼 프로젝트를 생성하고 RegFreeComDemo_2로 이름을 정한다.

도구상자(toolbox)에 VB6ControlTest 컴포넌트를 추가한다.

VB6ControlTest 컴포넌트를 도구상자에서 윈 폼 위로 Drag & Drop으로 추가한다.

Figure 6 RegFreeComDemo2 Program

Figure 6RegFreeComDemo_2 Program

이제 ActiveX 컨트롤을 격리해 보자. 참조 노드에서 VB6ControlTest 항목과 AxVB6ControlTest 항목을 선택하고 Isolated 속성을 True로 변경한다.

우리는 사용자 컨트롤(VB6ControlTest)을 격리했다. 그러나 우리는 사용자 컨트롤에 의해 참조되는 컨트롤들도(VB6 개발환경과 함께 설치된 ActiveX 컨트롤들) 격리하고 싶다.

그렇게 하기 위해서 우리는 단지 이들 컨트롤들을 프로젝트에서 참조 추가하고 이들의 Isolated 속성을 True로 변경한다.

· Microsoft Common Dialog Control 6.0 (SP6)
· Microsoft Rich Textbox Control 6.0 (SP6)
· Microsoft Tabbed Dialog Control 6.0 (SP6)
· Microsoft Windows Common Controls 6.0 (SP6)
· Microsoft Windows Common Controls-2 6.0 (SP6)

주의할 점은 순수하게 UI 위젯 형태의 컨트롤들은 Reg-Free COM 하에서 대부분 잘 작동하지만 반드시 테스트 해 보아야 한다.

Publish 마법사를 통해 ClickOnce 게시를 한다. 그리고 .NET Framework 2.0만 설치된 다른 머신으로 가서 게시된 ClickOnce 어플리케이션을 설치/실행해 보면, ActiveX 컨트롤들이 자연스럽게 배포되어 지는 것을 확인할 수 있다.

격리시킨 OCX 들이 배포되어져 있다.

Native Assemblies

Isolated 속성은 기존 COM 컴포넌트를 정말 쉽게 격리시키고 배포할 수 있게 해 준다. 하지만 컴포넌트가 어떤 vender나 컴포넌트 소유자로부터 manifest와 함께 제공되어 졌다면, 우리는 native assembly를 직접 참조할 수 있다. 이 경우, 사실 컴포넌트 제작자에 의해 제공된 manifest를 이용하는 것이 훨씬 편하고 선호될 것이다.

Visual Studio 2005에서는 native assembly 에 대한 참조를 지원한다. native 참조는 참조하는 파일의 Type 속성이 native로 설정된 경우 생성된다. native 참조를 추가하기 위해 프로젝트에서 참조 추가를 하고 manifest의 위치로 이동한다. 어떤 컴포넌트는 DLL 내에 manifest를 포함시킨다. 이 경우, DLL 자체를 선택할 수 있으며, 그러면 Visual Studio는 해당 dll이 embedded manifest를 포함하고 잇다는 것을 감지하게 되면 이를 native 참조로 추가하게 된다.

native 어셈블리는 컴포넌트와 연관된 추가적인 파일들을 정의할 수 있다. 그리고 다른 독립적인 native 어셈블리들을 참조할 수 도 있다.
임의의 복잡한 native 어셈블리들과 파일들을 수동으로 생성 시킨 manifest 내에 임의로 캡슐화 하는 것도 가능하다.
Visual Stuido 2005는 참조하는 컴포넌트와 동일한 폴더에 존재하는 어떤 파일 또는 독립적인 native 어셈블리들을 자동으로 manifest에 포함시킬 것이다.
Manifest는 xml이므로 컴포넌트 제작자는 자신의 컴포넌트내에 native 어셈블리를 포함시키고 싶다면 manifest 파일을 수동으로 생성할 수도 있다.
Platform SDK에 포함된 MT 툴을 이용할수도 있다. 물론, VB.NET 또는 C# 클래스 라이브러리 내에서 native 참조와 Reg-Free COM을 사용할 수 있다.

흥미롭게도, 결과 컴포넌트는 managed 어셈블리(.dll)와 native 어셈블리(.manifest) 두 개로 이루어 진다. 다른 프로젝트에서 이 컴포넌틀 참조할 때, 두 참조를 모두 추가해야만 컴포넌트를 제대로 사용할 수 있다. 프로젝트 참조를 사용할 때, 두 어셈블리는 자동으로 참조되어 진다. 프로젝트 참조 형태로 추가하지 않으면, 참조 추가를 두 번 해주어야 한다. 참조는 DLL에 대한 참조 한번과 manifest에 대한 참조, 이렇게 두 번의 작업이 필요하다.

위의 이야기는 조금은 어려운 감이 있지만, 요지는 우리가 *.manifest 파일을 참조로 추가할 수 있어 그 manifest 내에 포함된 native 어셈블리들을 참조로 추가할 수 있다는 것이다.
간단한 테스트를 위해 NativeTestClient.dll을 참조 추가하고, 이 COM 컴포넌트 제작자가 배포한 NativeTestClient.dll.manifest 파일을 참조 추가해 본다. 이 manifest 내에서는 해당 컴포넌트 제작자가 자신의 컴포넌트 내에서 참조하는 다른 native 어셈블리(NativeCOM.dll)에 대한 참조 정보가 있을 것이다.(아래의 예에서 NativeTestClient.dll 과 NativeTestClient.dll.manifest, NativeCOM.dll은 모두 동일한 폴더 내에 존재해야 한다.)

아래처럼 NativeTestClient.dll.manifest 파일에 포함된 native assembly 에 대한 참조 정보로 인해 NativeCOM.dll이 자동으로 추가되었음을 확인할 수 있다.

Conclusion

Reg-Free COM 은 COM 컴포넌트를 사용하는 어플리케이션 배포에 있어 어려웠던 점을 해소하는 훌륭한 방법이다. 이는 ActiveX 컨트롤에 대해 작동을 한다. 그러나 이는 UI가 없는 비즈니스 객체에 대해서도 작동을 한다. 이는 native 와 COM 컴포넌트를 어플리케이션 격리와 배포의 용이성 측면에서 manged 컴포넌트 수준으로 향상시키는 기술이라 할 수 있다.
유일한 주요 결점은 최소한의 플랫폼으로서 Windows XP가 필요하다는 점이다.
그러나 데스크탑 환경이 날로 향상되는 환경에서 이 새로운 기술이 제공하는 이점은 이러한 제약을 충분히 극복하고 있다고 여겨진다.



첨부파일 : RegFreeCOM.zip (1614Kbytes)

우분투 넷북 리믹스(Netbook remix)

2008/10/14 13:12
이 글은 Ubuntu Netbook Remix 를 번역, 편집한 글입니다.

우분투 넷북 리믹스는 넷북이라고 불리는 소형 인터넷 기기를 위한 우분투 'respun' 버전입니다.
하지만 쿠분투나 주분투, 에듀분투처럼 우분투의 다른 배포판은 아니고, 작은 화면과 낮은 성능을 가진 모바일 기기에서 우분투를 효율적으로 사용할 수 있도록 해주는 패키지 모음입니다. 이는 우분투를 개발, 배포하고 있는 캐노니컬에서 인텔과 합작으로 진행하고 있는 Moblin project 의 결과물이기도 합니다.

확대

'기본 카테고리' 카테고리의 다른 글

Writing an ActiveX control in C#  (0) 2009.02.17
ClickOnce Deployment Limitations  (0) 2009.02.09
델 미니 9 에 우분투 설치하기  (0) 2009.02.02
Mysql-Connector-NET 한글  (0) 2009.01.22
u100에 해킨토시 설치하기  (0) 2009.01.18

사용자 삽입 이미지
주문한지 3년만에 델 미니 9 이 도착했습니다!!!
무식한(?) 택배 아저씨, 사람없다고 물건 던져두고 그냥 가신..
성질나서 델코리아로 또 전화하려다가 같이온 이상한 물품을 보고 참았습니다.

주문한지 한 달이 다 되어가는 시점이고, 몇 번이나 배송지연이 되었던 관계로 델 고객 상담부서쪽 분들과 계속 논쟁을 했었는데, 그 덕분인지, "이거 먹고 떨어져라." 인지.. 그닥 쓸모없는 걸 보내주셨군요. 하지만 베이징에 갈때 써먹을 수 있을 것 같아 그냥 이거 먹고 떨어지기로 했습니다. -_-;;;

그나저나 배터리는 언제나 오려나...
400불짜리 놋북사면서 150불치 뜯어낸 ;ㅁ; 이러고 살고 싶지 않았는데 ;;;


여튼.. 그리하여 천신만고(?) 끝에 도착한 델 미니 9!!!
첫인상..
부팅 열라 느려~

XP 를 처음 세팅하는 과정때문에 그렇겠지만, 일단 기본 인상은 그것으로 낙찰..
이제 밀고 우분투 깔아야지 =3=33


Lv5드라키님이 소개해주신 UNetbootin 을 이용해서 USB 에 우분투 8.04.1 라이브 시디를 집어넣고 설치시작!

빠르군요. 역시 SSD 인가.. XP 에서 잠시 테스트 삼아 이런저런 작업(?)을 해봤는데, 전혀 부담스러움을 느끼지 않았을 정도니까.. 설치까지 10분이 안 걸린듯.. 근데 역시나 SSD 용량이.. XP 때엔 3.5GB 를 잡아먹고 있었는데, 우분투는 2.2GB 밖에 안 먹는군요. 1.3GB 아꼈습니다. ㅎㅎ

사용자 삽입 이미지


근데 놋북을 써본 적이 없어서 그런가.. 터치패드 감도가 지나치게 민감하다는 생각이 들었습니다.
계속 설정이 틀려서 결국 USB 마우스를 꼽고 설정을 해야만 했습니다. 움.. 어렵다..

델 미니 9 에는 Ubuntu mini - Netbook Remix 패키지를 설치했습니다.
Netbook remix 는 넷북 전용 우분투 배포판!!!
은 아니고, 그냥 넷북에 최적화(?)시켜주는 패키지 모음입니다. Launchpad 의 PPA 를 통해 제공됩니다.

사용자 삽입 이미지

deb http://ppa.launchpad.net/netbook-remix-team/ubuntu hardy main
deb-src http://ppa.launchpad.net/netbook-remix-team/ubuntu hardy main

sudo apt-get install go-home-applet human-netbook-theme maximus ume-launcher window-picker-applet

그 외로 각종 잡다한 드라이버 설정은 다음 문서를 참고했습니다.
Dell Inspiron Mini 9 + Ubuntu 8.04.1』 독어 사이트라 영어로 번역해서 봐야합니다.

  1. 사운드 카드 설치
    $ sudo gedit /etc/modprobe.d/alsa-base
    파일 맨 아래에 다음 추가
    options snd-hda-intel model=dell

    이..이거 옵션값의 띄워쓰기 문제 때문에 고생을 좀.. -_-;

  2. WLAN & Bluetooth
    이게 뭐야? 신경 안 써도 다 알아서 잡아주더라구요..

  3. 제한된 드라이버와 3D 효과는 별다른 설정없이 지가 그냥 알아서 잡혔다. -_-;
    하지만 netbook remix 와 충돌이 나는듯 번쩍번쩍거려서 compiz 는 꺼버림.

  4. 입력 장치
    별 이상 없음. 정상 동작.. 하지만 한자키와 한영키가 바뀌어 있다.
    키값은 xev 을 입력해 확인한다.
    키보드를 델 노트북 인스파이어 6xxx/8xxx 로 고르면 한자=108, 한글=105 값이 된다.

    $ sudo setkeycodes 71 109
    $ sudo setkeycodes 72 113
    $ xmodmap -e "keycode 109 = Hangul"
    $ xmodmap -e "keycode 113 = Hangul_Hanja"

    여기까지는 임시.. 이렇게 해보고 되면 다음과 같이 한다.

    $ gedit ~/.Xmodmap
    keycode 109 = Hangul
    keycode 113 = Hangul_Hanja

    이 과정 필요없다.

  5. ACPI
    suspend 모드가 커널 패닉을 일으킨다는 소리같은데.. 냠..


http://www.mysql.com 에서 mysql-connector-net-1.0.7 닷넷용 컨넥터(프로바이더)를 ;다운
VS2005로 개발 할때 닷넷프레임워크 2.0 버전으로써 net2.0폴더에 있는 MySql.Data.dll 파일을
레퍼런스에 추가 하여 코딩

연결 테스트 용 예제

MySql은 5.0.16버전을 사용하였습니다. 설치시에 캐릭터 셋은 UTF8로 하였습니다.
웹(aspx)에서 테스트 해보았는데 한글도 잘 됩니다.
다음은 간단한 연결 테스트 코드 입니다. 참고하세요.

using System;
using System.Collections.Generic;
using System.Text;
//이 부분을 추가합니다.
using MySql.Data.MySqlClient;

namespace MysqlDemo1
{
class Program
{
static void Main(string[] args)
{
Connect();
}

static void Connect()
{
//mssql은 SqlConnection 이지만, MySql은 MySqlConnection 입니다.
//Sql->MySql 즉 예를들면 MySqlCommand 이런 형태로 사용하시면 됩니다.
MySqlConnection connection;
connection = new MySqlConnection();

string connectionString = "server=localhost;database=디비명;uid=아이디t;pwd=패스워드";
connection.ConnectionString = connectionString;

try
{
Console.WriteLine("데이터베이스 연결중...");
connection.Open();
Console.WriteLine("데이터베이스 연결 성공");

Console.WriteLine("현재 데이터베이스 : " + connection.Database);
Console.WriteLine("현재 연결 상태 : " + connection.State);
Console.WriteLine("데이터베이스 버전 : " + connection.ServerVersion);
}
catch (Exception E)
{
Console.WriteLine("데이터베이스 연결 실패");
Console.WriteLine(E.Message);
Console.WriteLine(E.StackTrace);
}
Console.WriteLine("데이터베이스에 연결 종료중...");
connection.Close();
Console.WriteLine("데이터베이스에 연결 종료 성공");
}
}
}

참고하세요.
추가로 컨넥트 스트링 부분에
string connectionString = "server=localhost;database=디비명;uid=아이디;pwd=패스워드;Charset=utf8";
이 처럼 Charset=utf8(latin1 등) 부분의 옵션을 사용하여 멀티랭귀지 캐릭터 셋을 설정 할 수 있음. 현재 euckr은 1.0.7 버전은 지원하지 않으며 소스를 다운받은후 소스수정후 재컴파일 하여 사용할수 있음 (소스를 보면 euckr,949 부분은 주석처리 되어 있음.ㅡㅡ;)

[ODBC]
C#(닷넷)의 경우 MySQL5를 사용하고자 할때
...
using System.Data.Odbc;
...
private void button1_Click(object sender, EventArgs e)
{
string connectionString = "DRIVER={MySQL ODBC 3.51 Driver};" +
"SERVER=localhost;" +
"DATABASE=디비명;" +
"UID=아이디;" +
"PASSWORD=패스워드;" +
"OPTION=3";
string commandString = "select * from 테이블명";

OdbcDataAdapter DBAdapter = new OdbcDataAdapter(commandString, connectionString);

DataSet DS = new DataSet();
DBAdapter.Fill(DS, "userdb");
dataGridView1.DataSource = DS.Tables["userdb"].DefaultView;
}

한글문제는 연결스트링 중에서 ... OPTION=3; stmt=set names euckr; 등으로 추가하여
활용해 보자.

[출처] Mysql-Connector-NET|작성자 곰돌이

공략 작성에 앞서 스샷이 전무한 것을 죄송하게 생각하며

해킨토시멀티 부팅설치를 풀어보겠습니다

일단 아래 링크는 참고 자료 입니다.

http://x86osx.com/bbs/view.php?id=after&page=1&page_num=42&select_arrange=reg_update&desc=desc&sn=off&ss=on&sc=on&su=&keyword=&no=1721&category=

링크를 구경하고 오셨다면 무언가 아쉬운 부분이 있으실거에요

그부분을 포함해서 순차적으로 적어 볼게요

<준비물>

U100

Kalyway 10.5.2 DVD(맥 OS)

WindowXP (u100 복구DVD만 아니면 OK) - 멀티 부팅을 하지 않고 OSX만 쓰겠다 생각하시면 필요없어요

USB - DVDRor RW

자료실에 올려진 해킨 준비물 파일 뭉치

위 준비물에서 Kalyway를 선택한 것은 Intel 기반의 CPU에서는 저걸 쓴다해서 선택했습니다.

일단 U100에 까시는 분은 한번에 성공하기 위해 저걸 챙기시는 것이 좋습니다.

###설치 순서 -> OSX -> WINDOW -> 멀티부팅 설정

------------STEP 1. 파티션 나누기-----------------------------------------------------------------------

윈드의 기본용량은 대략 75기가로 인식 될겁니다.

(1) (2)(3)

WindowXP OSX Data

NTFS 맥용 저널링 FAT32(Data 파티션은 FAT32 포멧으로 주어 1번과 2번파티션이 서로 자료 공유하게합니다.)

ex)15 15 45 (이건 사용 비중에 따라 정하시면됩니다.)

저는 이렇게 깔고 맥 파티션에 이거저거 깔고나니 4기가 남더군요....

---------------------------------파티션 나누는 방법!!!

따로 프로그램을 구하실 필요 없습니다...

개인적으로 acronis disk director 과자 버전 구하느라 힘들었는데... 필요없더군요..

우선 DVD롬에 OSX DVD를 삽입하고 DVD 롬으로 부팅합니다.

부팅이 되면 언어를 고르고 나서 설치를 진행하게되는데

우선 언어만 한국어로 고릅니다.

그리고 진행하지 마시고

상단의 메뉴에서 디스크 어쩌구저쩌구(.....;; 대충 디스크 파티션 관리하는 프로그램)를 찾아 실행하시면

-----------------------------------------------------------

하드이름 |

--파티션1 |

--파티션2 |

--파티션3 |

----------------------------------------------------------

이런 모양을 가진 창이 뜨는데요 좌측에 하드 이름이랑 하드 내부에 파티션 이름이 뜹니다.

아직 한번도 파티션은 안건드리셧다면 기존 파티션2개랑 복구파티션 3기가 까지 해서 3개 파티션이 잡힐 탠데요

여기서 파티션을 클릭하지말고 하드이름을 클릭합니다.

하드이름을 선택하면 창 우측에 메뉴중에 파티션 이라는 이름의 메뉴가 나타나는데요

여기서 파티션을 나눠줄수있습니다.

우선 파티션 이름을

----------------

| 1 |

----------------

| Mac |

----------------

| 2 |

----------------

이렇게 순서로 상단에 윈도 깔 파티션 (FAT)

중단에 맥을 깔 파티션 (맥용 저널링)

하단에공유 할파티션 (FAT)

으로 선택합니다.

상단은 일단 FAT용으로 잡아놨다가 나중에 윈도우 깔떄 바꾸면 되니 FAT로 잡으시고

중단은 맥용 저널링이라고 선택시 가장 위의 것으로 고르면 됩니다.

하단은 FAT로 잡아두시면 되구요

이렇게 파티셔닝이 끝나게 된다면 그 창을 닫습니다

------------STEP 2. OSX 설치-----------------------------------------------------------------------

그러면처음 언어 선택후 진행 파트로 넘어오게 되는데요

읽어보구 넘기시면서 설치할 하드를 선택하라고 물으면 Mac용으로 만들엇던 파티션을 선택해 줍니다.

그 다음에 그림 2개 가 뜨고 하단에 3가지 매뉴가 보일탠데요 (사용자확) (뒤로) (설치) 입니다

사용자확을 눌러서

Kernel_922_kabyl
Graphics Drivers - Intel - GMA950
Patches-PowerManagement_bundle

내용을 체크해줍니다.

이제 설치 누르시고 좀 놀다가 오십니다....

진행시간이 1분 남은 상태에서 진행이 안되는것처럼 보일겁니다만....

끈기를 가지고 기다리시면 완료되고 재부팅 시퀀스를 밟게 됩니다.

(전 처음 설치시 오류인줄 알고 재설치 했다죠....그런데 맥북 쓰는 친구가 지나가면서...."원래 거기서 기다려야되"....OTL)

사용자 정보를 입력하고 나서 맥의 환경이 보이게 됩니다.

그럼 일단 설치 완료!

------------STEP 3. 그래픽 드라이버와 랜카드 드라이버 잡기---------------------------------------------------

참고 사이트는

http://wind-osx86.wikispaces.com/10.5+Post-Install

우선 VGA부터 잡아 보겠습니다.

첨부파일 중에 Kext Helper b7.zip를 더블 클릭합니다.

압축이 풀려 파일이 폴더가 생기죠? 폴더 안의 프로그램을 실행시키고

0x27ae.zip 파일도 더블클릭해서 폴더를 만듭니다. 그리고 폴더 내부의 파일들을 아까 실행 시킨 프로그램 안에 드래그엔 드랍을 수행합니다. 그리고 나서 아래 패스워드에 osx에 셋팅해놓은 자신의 PW를 입력하고 활성화된 설치 버튼을 누릅니다.

(랜 드라이버는 위 링크에서 찾아보세요... 첨부파일 한계상...이건 쉽게 설치해요)

그럼... osX설치 끝~

------------STEP 4. 이제 윈도우를 설치해보자!---------------------------------------------------

....해킨 시도하시는분이라면.... 윈도는 깔줄 안다고 생각하고 요점만 말씀드리죠....

기존에 맥 파티션 앞에 잡아놓은 파티션에 윈도를 설치하는데 이때 파티션을 C:라고 가정하고...C:입니다... 파티션을 지웟다가 새로 생성하지말고 NTFS타입으로 포맷만 하시구 설치하십니다.

그럼 이 스텝도 끝

------------STEP 5. 멀티부팅!!---------------------------------------------------

이제 os는 다깔렸어요..... 다만 문제점이 보이죠? 대체 맥으로 부팅을 어케하느냐!!!

윈도로만 부팅되니 난감합니다....

하지만... 이게 정상 절차하는 거죠...

윈도로 부팅하고 c:에 chain0.zip의 내용을 복사합니다. 폴더가 아닌 내용물을 복사하는것입니다.

그리고 나서c:의 boot.ini에 맨 아랫줄에 c:\chain0="Apple Mac OSX"라고 입력해주고 재부팅하면 끝...

그러면 부팅시 윈도우랑 맥을 고르는 창이 뜰거구...

맥을 고르고나면 다윈 부트켐프로 들어가게됩니다... 맥을 파티션2에 잡아줫으니 여기서 2번쨰 파티션으로 선택해주면 맥으로 부팅

첫번째 파티션을 선택하면 다시 윈도우와 맥을 선택하는 위치로 돌아갑니다... 선택화면이 2종류니 햇갈리지 마시기를....

------------------------------END

무플은 시러요!

'기본 카테고리' 카테고리의 다른 글

델 미니 9 에 우분투 설치하기  (0) 2009.02.02
Mysql-Connector-NET 한글  (0) 2009.01.22
오픈소스 소프트웨어 라이센스 가이드  (0) 2009.01.13
IBM의 극적인 탈출  (0) 2009.01.11
CPU 성능분석  (0) 2008.12.24
06년경부터 외국사이트등에서 Mac osx를 해킹해서 x86 일반 PC에 설치하는 방법등이 알려지고

있습니다. 애플 社주관으로 PC에 Mac os를 설치하는 대회같은것도 있기도 했죠. 일단 Mac 자체가

일반PC와는 달리 바이오스를 사용하지 않고 EFI라는 것을 사용하기 때문에 그냥 DVD만 넣는다고

해서 설치가 되진 않고 가장 문제는 하드웨어적 문제인데 지금은 꽤 많은 부분이 해킨토시 이용자

들을 통해 패치가 이뤄져서 설치가 잘 되는 편입니다. 아무래도 Mac os의 편리함이나 디자인등에

매료되서 PC사용자들이 최근에 많이 시도해보는것 같은데 저 또한 인터페이스나 디자인이 마음에

들어 꽤전에 시도해보다가 특정 하드웨어 몇개가 죽어도 잡히질 않아 때려쳤던 기억이 나네요.

몇일전에 윈도우XP용 테마를 찾다가 osx 레오파드를 보고 다시한번 시도해 보기로 마음을

먹었습니다. 대개 많은 해킨토시 이용자분들이 XP나 비스타와 osx를 멀티부팅 하는 방법이나

Vmware로 설치해서 사용하는것으로 아는데 여기서는 가장 부담없는 Vmware를 통해 설치하는

방법을 알아보겠습니다. (사실은..귀찮아서...;)

1. VMware 셋팅

사용자 삽입 이미지

VMware를 설치하기전 자신의 하드웨어가 다운로드한 Mac os에서 지원하는지 확인해야합니다.

과거 해킨토시는 AMD CPU에서 설치하기 매우 힘든경우가 많았지만 최근에는 AMD CPU도

잘 되는것으로 알고있습니다. 인텔 CPU의 경우 SSE3을 지원해야 설치가능합니다. 위와같이

CPU-Z같은 프로그램으로 자신의 CPU를 확인합니다. 왠만한 사양의 CPU를 쓰고있는 분들은

SSE3을 지원합니다.

사용자 삽입 이미지

설치가 이뤄질 VMware의 가상PC를 설정합니다. File→new→Virtual Machine을 선택해서

다음과 같이 Custom을 선택해줍니다.

사용자 삽입 이미지

여기서는 Vmware 6.5를 사용했습니다. 6.0을 사용해도 무방합니다. Hardware Compatibility에서

5와 호환되게 하면 많은 제약이 따르므로 기본값으로 놔두고 Next를 눌러줍니다.

사용자 삽입 이미지

Vmware 6.0에서와 달리 6.5에서는 OS를 인스톨할 CD나 DVD,ISO이미지 여부를 묻습니다.

추후에 수정가능하므로 맨 아래를 선택하고 Next를 눌러줍니다.

사용자 삽입 이미지

어떤 OS가 설치될것인지 묻게되는데 위와같이 설정해주고 Next를 눌러줍니다.

사용자 삽입 이미지

버추얼머신의 이름을 써주는 칸에 맘에드는 이름을 아무렇게나 입력해주고 머신이 저장되는

파일이 저장될 디렉토리를 지정해줍니다.

사용자 삽입 이미지

코어가 두개이상인 CPU의 경우 선택해주는 부분입니다. 쿼드코어 사용자도 Two로 선택하면됩니다.

저의 경우는 P4 프레스캇 싱글코어라 One을 선택했습니다.

사용자 삽입 이미지

메모리 설정 부분입니다. 글을 쓰기전 미리 설치해본결과 2Gb나 1Gb나 가벼운 작업시 별로 큰

차이는 없었습니다. 1Gb정도만 설정해주고 부족하다 싶으면 나중에 수정해주면 됩니다.

사용자 삽입 이미지

네트워크 설정 부분입니다. 공유기를 쓰신다면 Bridge 네트워크를 이용해야 될수 있습니다만

NAT가 가능하다면 NAT로 설정하는것이 편합니다.

사용자 삽입 이미지
어댑터 타입을 물어보는데 LSI Logic을 사용합니다. Bus Logic을 사용해도 Vmware상에서

성능상 많은 차이를 보이진 않습니다.

사용자 삽입 이미지

이제 버추얼머신에서 HDD처럼 쓰일 파일을 만들게 됩니다. 맨 아래를 선택하면 실제 HDD를

사용하게 되는데 여유로운 HDD를 가지고 계신분이라면 더욱 나은 성능을 위해 실제 HDD를

사용하시는것도 괜찮은 방법입니다. 다만 이경우 실제 HDD의 전체를 사용하게 되므로

반드시 남는 HDD를 사용하시기 바랍니다.

사용자 삽입 이미지

디스크 타입을 묻는데 SCSI로 설정시 인식하지 못할때가 있습니다. 여기서는 IDE로 설정하지만

SCSI로 설정시 이상 없으신 분들은 SCSI로 설정하시기 바랍니다.

사용자 삽입 이미지

디스크의 전체 용량을 지정해 줍니다. osx 10.4.9를 설치하면 대략 6.8Gb정도의 용량이 소요됩니다.

실제로 osx를 활용하실분은 20~30Gb정도 설정해 주셔야 여러 프로그램도 설치하고 편하게 사용

하실수 있을듯 합니다. 지금 호스트PC에서 디스크 파티션 타입을 FAT32를 사용하시는분은 거의

없을것이라 생각하지만 만약 FAT32를 사용하는 디스크에서 지정한다면 맨 아래를 선택하셔서

디스크를 2Gb씩 나눠 사용하도록 하시기 바랍니다. 물론 실제 이용시에 디스크 용량은 똑같습니다.

사용자 삽입 이미지

디스크 파일이 저장될 위치를 지정해줍니다. 아까 위에서 Vmware Location을 지정해준 곳과

동일하게 해놓는것이 편합니다.

사용자 삽입 이미지

Customize Hardware를 눌러 약간 수정을 하겠습니다.

사용자 삽입 이미지

혹은 Finish를 눌렀다면 초기화면에서 좌측의 Edit virtual machine settings를 통해 수정을 합니다.

여기서는 플로피 디스크 드라이브를 삭제하겠습니다. 메뉴가 직관적이라 add / remove 버튼을

통해 손쉽게 삭제 가능합니다. Mac에서는 플로피 드라이브를 사용하지 않기때문에 삭제를 해줍니다.

사용자 삽입 이미지

이제 Vmware에서 osx를 설치할 준비가 모두 끝났습니다.

2. Mac OSX 설치

인텔과 AMD CPU모두 왠만한 배포판에서 패치를 지원하는데 개인이 만든 배포판이 많아서 어떤

것은 설치가 안되기도 합니다. 아래의 토런트 파일을 다운로드 하면 세개의 토런트 파일이 있는데

각각 10.4.7, 10.4.8, 10.4.9 버전이 있습니다. 저의 경우는 10.4.9버전을 사용했습니다.

Mac_OS_X_10_4_9_Intel_SSE3_[JaS_10_4_8_AMD_Intel_SSE2_SS.torrent
JaS_Mac_OS_X_10_4_8_AMD_Intel_SSE2_SSE3_PPF_1_Defiant_di.torrent
Mac_OS_X_10_4_7_AMD_Intel_(JaS)_ISO_Repack-(4283690[1][1].2454.torrent


위는 파일 풀네임으로 어떤 패치가 이뤄져있는지 표시되있습니다.


토런트를 잘 모르시는 분들은 간단히 http://utorrent.com 에서 프로그램을 다운로드 받아

다운로드 받은 위의 파일을 클릭하시면 됩니다. 위의 세파일들은 그럭저럭 괜찮은 속도를 보입니다

당나귀나 이뮬처럼 사용자들이 모여있지 않으면 속도가 느리므로 빛의 속도는 기대하지 마시길..

모두 다운로드 하셨다면 Daemon툴등의 가상DVD 에뮬레이터 등을 사용해서 ISO이미지를 넣고

사용하셔도 되고 혹은 Vmware에서 ISO이미지를 직접 사용해서 설치 하시면 됩니다.

(Edit virtual machine settings에서 가능) 이제 Vmware의 상단의 플레이 버튼을 눌러

머신을 가동합니다.

사용자 삽입 이미지

가동시 F2를 눌러 Boot 메뉴에서 CD-ROM으로 부팅가능하게 우선순위를 변경해줍니다.

그뒤 F10을 눌러 저장하고 빠져나옵니다.

사용자 삽입 이미지

다음과 같이 설치 화면이 뜨면 10초가 다 지나기전 esc를 눌러줘야하는데 누르지 않으면

에러가 뜹니다,

사용자 삽입 이미지

이와 같은 에러가 생깁니다. 물론 별 문제 없으니 ctrl+del+insert를 눌러 재부팅 하거나 멈춤버튼을

눌러 껐다 켠뒤 다시 esc를 눌러줍니다.

사용자 삽입 이미지

성공하면 위와 같이 여러가지 읽어들이는 글귀들이 좌라락 뜹니다.

사용자 삽입 이미지

위와같이 설치 초기화면이 떠야됩니다. 당연한 말이지만 만약 뜨지 않고 멈춘다면 커널패닉일수

있는데 이경우 CPU가 설치 ISO에서 지원하지 못해서 일겁니다. 주언어로 한글 사용을 선택합니다.

사용자 삽입 이미지

설치를 준비화는 화면이 뜹니다.

사용자 삽입 이미지

인스톨러 메인화면입니다 컨티뉴 해줍니다.

사용자 삽입 이미지

설치할 디스크를 묻는데 아무것도 안뜹니다 당황할것 없습니다. Vmware의 디스크가 파티션

설정이 되있지 않아서 그럽니다.

사용자 삽입 이미지

위와 같이 상단메뉴에서 선택해줍니다.

사용자 삽입 이미지

위와 같이 처음에 만들었던 VM디스크를 선택해줍니다. 그뒤 오른쪽에서 Partition을 선택해주면

다음과 같은 화면이 뜹니다.

사용자 삽입 이미지

Volume Scheme에서 몇개로 파티션을 나눠줄지 선택하는 메뉴가 뜹니다. 최대 16개의 파티션으로

분할할수 있습니다. 여기서는 단일 파티션으로 1개를 선택했고 Name은 볼륨명이니 마음에 드는대로

써줍니다. 그아래 파티션 유형을 묻는데 맨 처음것을 선택합니다. 그뒤 좌측 하단 부위 Partition을

눌러주면 파티션 설정하면 디스크가 날라간다라고 하는데 알겠어 해줍니다. 모두 끝났으면

창의 빨간 버튼을 눌러 닫습니다.

사용자 삽입 이미지

파티션 생성을 마치고 나면 다음과 같이 볼륨을 선택할수 있게되는데 HDD그림을 누르고

컨티뉴 합니다.

사용자 삽입 이미지

이제 설치할 몇몇 가지를 체크해줍니다 X11은 나중에 설치 가능하지만 그냥 체크해주고 아래에

Jas... Intel이나 AMD둘중 자신의 CPU에 맞게 체크해줍니다. 그리고 대다수의 하드웨어를 지원

가능하도록 Support..을 체크해주고 Nvidia,ATI그래픽 카드를 지원하는 Titan을 체크해줍니다.

인스톨 버튼을 누르면 설치원본을 검증하게 되는데 시간도 오래걸리고 잘못된 이미지라면

어짜피 다시 받는수밖에 없으니 Skip해줍니다.

사용자 삽입 이미지

인스톨을 시작하게 됩니다. 베이스 시스템을 설치하는데에 예상시간 44분이지만 모두 설치하고나면

저의 경우 두시간 넘게 소요됐습니다. 가능하면 성능 좋은 시스템에서 사용바랍니다.;;

설치하는도중 멀티부팅용으로 사용하는 거의 수명이 다되서 골골대던 HDD가 또 말썽을 일으켰

습니다. 최근엔 상태가 더 심각해져서 사용중에 전원을 껏다켠것처럼 힘을 못받다 뻗어버리네요.

결국 이 다음화면부터는 스샷을 찍지 못했지만 인스톨이 끝나면 재부팅 되고 설치 완료입니다.

처음 부팅화면에서 몇가지 설정을 거친후 본 메인화면으로 넘어가는데 이 또한 어려운것이

전혀 없기때문에 넘어가도 괜찮을듯 합니다.

사용자 삽입 이미지

OSX의 부팅화면 역시 깔끔하네요.

사용자 삽입 이미지

꿩대신 닭으로.. 미리 설치해뒀던 레오파드 메인화면입니다.

(내용추가 : 이 VMware이미지는 외국에서 꽤 알려진 pcwiz판 레오파드 VMware이미지를
받은것으로 제가 직접 설치했다는 의미는 아닙니다. 물론 레오파드 플랫이미지로 제가따로
설치는 했었습니다만 지금은 쓰지 않고있네요. 따로 말씀하신분이 있어서 내용을 추가합니다.)


OSX를 Vmware를 통해 설치해서 활용까지 하고 싶으신 분들은 최소한 듀얼코어 CPU를 사용해야

할듯 합니다. 제 시스템에서 설치를 끝마치고 Vmware로 이것저것 해보려고 하면 너무 더뎌서

사용가치가 없었습니다. (P4 2.66Ghz) 그래도 해킨토시를 설치해보고 잠깐 사용해보니 편하긴

편하더군요. 하지만 십수년간 윈도우에 익숙해져서 파일 관리등에 있어서는 리눅스가 익숙하신

분들이 osx를 쓰시면 편할듯 합니다. 실제 시스템 상에서 설치하면 하드웨어가 제각각이라

설치가 실패하는 경우도 생길듯 합니다만 Vmware를 사용한다면 왠만해선 설치에 성공하리라

봅니다. 애플에서는 OSX의 해킹에 대해 하려면 해라식으로 놔두고 있는데 이에 대해서

사용자 의견이 분분합니다. 제 생각에는 뭔짓을 해서든 한번 어렵게 써보고 osx의 편리함을

느껴봐라 맥에서 안쓰니까 하드웨어 설치 잘 안되고 짜증나 죽겠지? 그러니까 맥 사서 써라 라고

하는듯 싶네요. 뭐 어찌됐건 많은 해킨토시 사용자들에 의해 패치가 이뤄지고 있으니

이렇게 한번씩 설치 해보시면 좋은 경험이 될듯 싶습니다.
1 OpenSource 소프트웨어의 개요
1.1 OpenSource 소프트웨어란 무엇인가
1.2 OpenSource 소프트웨어의 사례
2 OpenSource 소프트웨어의 지적재산권과 라이센스
2.1 소프트웨어의 지적재산권과 라이센스
2.2 OpenSource 라이센스의 특징
3 OpenSource 라이센스의 구체적 내용
3.1 공통적 준수사항
3.2 라이센스별 준수사항
3.2.1 GPL 2.0
3.2.2 LGPL 2.1
3.2.3 BSD License
3.2.4 Apache License
3.2.5 MPL(Mozilla Public License)
3.3 주요 쟁점
3.3.1 소스코드 공개 여부
3.3.2 특허권
3.3.3 듀얼 라이센스
3.4 주요 OpenSource 소프트웨어 사례
3.4.1 Linux 커널
3.4.2 FreeBSD
3.4.3 MySQL
3.4.4 Apache
3.4.5 Mozilla Firefox
3.4.6 Sendmail
4 기업에서의 OpenSource 라이센스 관리/활용 방안
4.1 OpenSource 소프트웨어관련 정책의 수립
4.2 OpenSource 라이센스관리를 위한 프로세스/조직의 구축
4.2.1 기획(S/W Design)단계
4.2.2 구현(Implementation)단계
4.2.3 검증(Verification)단계
4.2.4 제품화(Production)단계
5 부록 : GPL 3.0의 배경, 경과와 주요 내용
5.1 GPL 개정의 배경과 경과
5.2 Tivoization과 DRM
5.3 특허권의 취급
5.4 라이선스의 양립성 : Apache, Affero GPL
5.5 기타 주요 개정내용
5.5.1 용어의 정리
5.5.2 소스코드 제공범위

1 OpenSource 소프트웨어의 개요

1.1 OpenSource 소프트웨어란 무엇인가


OpenSource 소프트웨어는 일반적으로 자유롭게 사용, 복제, 배포, 수정할 수 있으며, 소스코드가 공개되어있는 소프트웨어를 말한다. OpenSource 의 예로는 Linux 커널 및 관련 GNU 소프트웨어, 아파치 웹서버, FireFox 웹브라우저, MySQL 데이터베이스시스템, Python/PHP/Perl 언어, Eclipse 툴 등을 들 수 있으며, 그 외에도 전세계의 수많은 개발 자들이 개발하고 있는 프로그램들이 있다.

통상 OpenSource 소프트웨어는 자유소프트웨어(FreeSoftware)를 포함한 넓은 의미로 사용되며, 국내에서도 자유소프트웨어를 포함한 OpenSource 소프트웨어를 ‘공개소프트웨어'로 번역하여 사용하고 있다. 하지만 역사 및 추구하는 이념 등에서 자유소프트웨어와 OpenSource 소프트웨어는 미묘한 차이가 있다.

자유소프트웨어(FreeSoftware)는 리차드 스톨만(RichardStallman)과 FSF(Free Software Foundation)에 의해 만들어진 개념으로서, 소프트웨어의 이용자에게 해당 소프트웨어를 실행, 복제, 배포할 수 있는 자유, 그리고 소스코드에 대한 접근을 통해서 이를 학습, 수정, 개선시킬 수 있는 자유를 부여하는 소프트웨어이다. 1980년대에 들어 PC가 널리 보급되기 시작하면서 이전에는 하드웨어의 부속물로만 간주되던 소프트웨어가 거대한 부가가치산업으로 발전하기 시작하였고, 이러한 흐름과 함께 지적재산권 및 라이센스계약을 통하여 소프트웨어의 사용, 복제, 배포, 수정에 일정한 제한을 가하려는 움직임이 나타나게 된다. 소프트웨어를 둘러싼 이러한 일련의 흐름에 반대하고 소프트웨어의 자유로운 사용, 공유, 수정에 대한 기존의 권리를 지키기 위하여 리차드 스톨만은 FSF를 설립하고 자유소프트웨어(FreeSoftware) 운동을 전개하였다.

한편 1990년대 들어서면서 인터넷과 더불어 GPL(General Public License)로 배포된 리눅스가 널리 보급되기 시작하였고, MS의 익스플로러에 밀려 어려움을 겪고 있던 Netscape사가 웹브라우저의 소스코드를 공개하는 결정을 내렸으며, IBM, Sun 등이 자유소프트웨어에 대한 지원을 시작하였다. 그러나 자유소프트웨어의 '자유Free'라는 단어가 한편으로 '무료'라는 의미를 가진다는 점, 엄격한 GPL조항 때문에 상용 기업들이 참여를 꺼려한다는 점 등을 이유로 OpenSource 라는 용어가 제안되었고, 1998년 Open Source Initiative가 활동하기 시작하면서 OpenSource 소프트웨어가 널리 사용되게 되었다. OSI는 OpenSource 소프트웨어로 인정받을 수 있는 10가지 '라이센스 조건'을 정의하고, 각각의 소프트웨어에 대한 라이센스를 분석하여 OpenSource 소프트웨어라이센스에 해당하는지 여부에 대한 인증을 하고 있다. 주요 내용을 살펴보면, 소프트웨어에 대한 배포 및 수정의 자유를 인정해야 하며 소스 코드를 제공할 수 있어야 할 것, 그리고 어떤 사람이나 그룹 또는 이용분야에 대한 차별이 없어야 한다는 조건 등을 두고 있다.
위 문단은 마치 오픈소스가 GPL에 반대해서 시작된 것이고, GPLed software가 곧 Free Software인 것처럼 오해할 소지가 있습니다. OSI나 FSF쪽의 어느 누구도 그렇게 말한 사실이 없습니다. Open Source Definition은 몇년전부터 수많은 사람들이 free software 조건으로 말하던 Debian Free Software Guildelines를 데비안에 관련된 부분을 중립적으로 고친 것에 불과합니다. FSF 조차도 GPL이 아니더라도 광범위한 소프트웨어를 free software라고 말하고 있습니다. -- cwryu 2007-07-17 10:51:05

2007년 6월 기준으로, 58개의 라이센스가 오픈 소스 라이센스로 인정되어 등록되어 있다. 하지만 실제로 많이 사용되는 라이센스의 갯수는 한정되어 있다. 오픈 소스 프로젝트 개발 포털사이트인 http://freshmeat.net 에 등록되어 있는 프로젝트들 중에서 OpenSource 로 분류되는 약 34,368개 프로젝트의 [http]OpenSource 소프트웨어 라이선스 분포를 참고해 보면 약 82%에 해당하는 프로젝트가 GPL/LGPL을 사용하고 있으며, 그 뒤를 BSD가 차지하고 있다. 따라서 GPL/LGPL/BSD 라이센스가 주로 사용되고 있음을 알 수 있다. 그러나 Mozilla 웹브라우저, Apache 웹서버 등 일부 중요한 OpenSource 소프트웨어들은 자체적으로

1.2 OpenSource 소프트웨어의 사례


아래는 유명한 OpenSource 소프트웨어들의 사례이다.

  • Linux 커널 : 가장 대표적인 OpenSource 소프트웨어인 Linux라 하면 보통 "Linux 운영체제"를 통칭한다. 하지만 여기서는 명확한 설명을 위해 Linux 커널에 한정하기로 한다. 보통 RedHat, SusE, 그리고 한컴리눅스 등이 배포하는 Linux 운영체제에는 Linux 커널을 포함하여 많은 애플리케이션과 유틸리티로 구성되어 있다. 또한 각 애플리케이션 및 유틸리티는 서로 다른 라이센스 하에 배포되고 있다. Linux 커널은 토발즈에 의해 최초로 개발되었고, 이후 많은 사람들의 자발적 참여와 기여 덕택에 오늘날 가장 인기있는 운영체제 중 하나가 되었다. 토발즈는 현재까지도 Linux 커널 개발의 중심에 있으며 Linux 개발 커뮤니티에는 수천명의 개발자가 서로 협력하고 아이디어를 공유하며 Linux를 더 좋은 운영체제로 만들어 가고 있다.

  • Apache : Apache는 현재 가장 많이 이용되는 웹서버이다. 오늘날 Apache의 전신은 1995년까지 NCSA(National Center for Supercomputer Applications)에 의해 개발되었다. 이 후 핵심 개발자인 Rob McCool를 포함 많은 개발자들이 NCSA 떠나면서 NCSA 주도의 웹 서버 개발이 정체되었다. 그래서 많은 웹마스터들은 스스로 필요한 기능을 개발하고 버그를 수정해 나가야만했다. 이런 상황에서 소수의 몇몇 웹마스터들이 이메일과 정기적인 미팅을 통해 NCSA가 개발한 웹서버를 공식적으로 유지보수하기 시작하였다. 이들은 자신들을 Apache Group이라 명명하였고, 오늘날 Apache Software Foundation의 근간이 되었다. Apache Software Foundation(ASF)은 1999년에 설립되었고 지금은 Apache 개발을 주도하고 있다.

  • Bind : BIND(Berkeley Internet Name Daemon)는 일반 IT유저에게는 잘 알려져 있지 않지만 가장 많이 이용되는 DNS(Domain Name System)이다. 즉, BIND는 호스트명을 IP주소로 변환시켜주는 프로그램으로서 인터넷의 인프라를 구성하는 매우 중요한 요소다. BIND는 모든 Unix 시스템에서는 사실상의 표준으로 자리잡았으며, 다른 많은 다른 시스템에 포함되어 있기 때문에 사실상 인터넷 표준이라 할 수 있을 것이다. BIND는 1984년에 Paul Mockapetris에 의해 처음 개발되었고, 현재는 Paul Vixie가 주도하고 있는 ISC(Internet Software Consortium)에서 주도적으로 개발을 책임지고 있다. 참고로, ISC는 1993년에 UUNET의 지원을 받아 Rick Adams에 의해 설립되었고 지금은 SUN, HP, IBM, SGI 등 주요 소프트웨어기업의 지원을 받고 있다. BIND는 ISC에서 자체 개발한 라이센스를 적용하고 있으며, 개인적 혹은 상업적 용도 구별없이 자유롭게 이용, 복제, 수정, 및 재배포가 가능하다.

  • Mozilla Firefox : Mozilla는 Netscape에 의해 시작된 오픈 소스 브라우저 프로젝트이다. 이 프로젝트의 일원이었던 Dave Hyatt와 Blake Ross는 Netscape가 받고있는 상업적 후원이 오히려 Mozilla 브라우저 개발에 악영향을 미치고 있다고 믿었다. 그래서 이들은 실험적으로 Mozilla Project에서 파생한 작은 Firefox Project를 별도로 시작하여 핵심적 기능을 갖춘 브라우저 개발에 착수하였다. 그런데 2003년 4월, Mozilla Foundation은 기존 Mozilla Project보다 오히려 Firefox Project에 더 전념할 계획을 밝혔다. 이 후 Firefox Project는 몇 번 이름 변화 과정을 거쳤다. 원래 Phoenix라 명명되었지만, Phoenix Technologies사와 상표권 분쟁으로 인해 Firebird로 변경하였다. 하지만, Firebird 역시 Firebird란 무료 데이터베이스 소프트웨어 프로젝트로 부터 거센 저항을 받았다. 결국 Mozilla Firebird로 다시 이름을 고쳤지만, 지속된 반발로 인해 2004년 2월 오늘날의 이름은 Mozilla Firefox로 다시 변경하였다.

2 OpenSource 소프트웨어의 지적재산권과 라이센스


2.1 소프트웨어의 지적재산권과 라이센스


현재 소프트웨어는 다음과 같이 저작권, 특허권, 영업비밀, 상표 등의 지적재산권법에 의해 보호받고 있다.

  • 저작권 : 어떤 프로그래머가 특정 소프트웨어를 개발하게 되면 컴퓨터프로그램저작권이 자동적으로 발생하며, 프로그래머 또는 그가 속한 회사에 부여된다. 저작권(copyright)은 시, 소설, 노래 등 저작물에 대해 부여되는 권리로서 그 표현(expression)의 결과물을 보호하는 것이다. 누구도 원 저작자나 저작권자의 허가가 없이는 해당 저작물을 복사, 개작, 재배포할 수 없다.

  • 특허권 : 특허는 하드웨어에 구현되거나 소프트웨어에 의해 동작이 구현되는 발명(invention)을 보호한다. 특허권은 자동으로 부여되는 것이 아니고 법에 정해진 절차에 의해 출원을 하여야 하며, 심사를 통해 부여되는 권리이다. 특허 기술을 구현(implementation)하기 위해서는 반드시 특허권자의 허락을 득하여야만 한다. 특허 소유자는 소유자가 허가하지 않은 사람이 해당 특허를 활용한 제품을 만들거나, 사용하거나, 판해하는 것을 막을 수 있다. 특허는 무엇인가 유용한 것을 하도록 하는 방식(method)이므로 소프트웨어의 경우 특허받은 방식을 구현하는 소프트웨어라면 프로그래밍 언어가 다르거나 소스코드가 다르더라도 해당 특허권자의 명시적인 허가를 받아야 하며 이는 OpenSource 소프트웨어, 독점소프트웨어에 공통으로 해당된다.

  • 영업비밀 : 영업비밀이란 공연히 알려져 있지 아니하고 독립된 경제적 가치를 지니는 것으로서 상당한 노력에 의하여 비밀로 유지되는 생산 방법, 판매 방법, 기타 영업 활동에 유용한 기술상/영업상의 정보로 정의되어 있다. 이러한 영업비밀은 "부정경쟁방지 및 영업비밀보호에 관한 법률"에 의하여 보호받고 있으며, 이와 같은 영업비밀을 부당한 수단으로 취득하거나, 비밀유지의무가 있음에도 다른 사람에게 누출하는 것은 처벌받게 된다.

  • 상표 : 상표권이란 제품이나 서비스와 연계되어 마케팅에 활용되는 이름 등을 보호한다. 또한 상표는 시장에서 나의 제품과 타인의 제품을 구별해 주는 역할을 한다.

이상과 같은 지적재산권에 의해 권리자는 소프트웨어에 대한 배타적인 권리를 가지게 되며, 원칙적으로 권리자만이 소프트웨어를 사용, 복제, 배포, 수정할 수 있다. 하지만 다양한 필요에 의해 이들 권리자가 다른 사람에게 일정한 내용을 조건으로 하여 특정 행위를 할 수 있는 권한을 부여할 필요가 있는데, 이와 같은 권한을 보통 '라이센스(license, 사용허가권)'라고 한다. 이러한 의미에서 라이센스는 물건을 판매하는 매매와는 차이가 있으며, 소프트웨어에 대한 지적재산권은 여전히 원래의 권리자에게 남아있고 일부 사용에 대한 권리만을 부여하는 것이다. 마이크로소프트, 오라클 등 일반적인 독점(proprietary)소프트웨어 업체의 라이센스는 고객이 소프트웨어 권리자에게 대금을 지급하고 소프트웨어의 ‘사용’ 권한만을 허락하는 것이 일반적이다. 따라서 허락을 얻지 않고 소프트웨어를 복제, 배포, 수정하는 행위는 라이센스를 위반함과 동시에 불법에 해당한다.

2.2 OpenSource 라이센스의 특징


OpenSource 소프트웨어 역시 독점소프트웨어(proprietary software)와 동일하게 저작권 등에 의한 법적 보호를 받고 있으며, 이와 같은 권리에 기반하여 이용자에게 라이센스를 부여한다. 그러나 OpenSource 라이센스는 일반적인 독점소프트웨어 라이센스와는 많은 점에서 차이가 있다. 기본적으로 OpenSource 라이센스는 다음과 같이 사용자의 자유로운 사용, 복제, 배포, 수정을 보장하고 있다.

  • 라이센시는 해당 OpenSource 소프트웨어를 자유롭게 사용할 수 있다.
  • 라이센시는 해당 OpenSource 소프트웨어를 자유롭게 복제할 수 있으며, 일정한 조건하에 재배포할 수 있다.
  • 라이센시는 해당 OpenSource 소프트웨어를 자유롭게 수정하여 사용할 수 있으며, 일정한 조건하에 수정된 내용을 재배포할 수 있다.
  • 라이센시는 해당 OpenSource 소프트웨어의 소스코드를 자유롭게 획득하고 접근할 수 있다.

OpenSource 라이센스는 소프트웨어의 사용, 복제, 배포, 수정의 자유를 부여함과 아울러 다른 한편으로는 소프트웨어의 사용자에게 일정한 의무를 부과하고 있다. 구체적인 내용은 OpenSource 소프트웨어와 함께 배포되는 라이센스의 내용을 통해 알 수 있다. 해당 OpenSource 소프트웨어에 대한 라이센스는 주로 소스코드 내부나 홈페이지 등에 명시되어 있다. 소스코드에서는 주로 최상위 디렉토리에 COPYING이라는 독립된 파일에 라이센스 조항을 기록하기도 하며, 각각의 소스코드 파일 상단에 명시해 두기도 한다.

OpenSource 라이센스에서 요구하고 있는 준수사항을 라이센시가 이행하지 않으면 권리자로부터 저작권 위반 (또는 계약 위반)으로 소송을 제기 당할 수 있다. 만약 권리를 침해한 것으로 결론이 내려지면 소프트웨어의 배포가 더 이상 불가능할 뿐만 아니라 이미 배포한 소프트웨어에 대한 손해배상 등 막대한 책임을 부담할 수 있다. 특히 임베디드 소프트웨어의 경우 이를 내장한 제품까지 판매하지 못하거나 리콜(Recall) 해야 하는 경우도 발생할 수 있으므로 라이센스의 의무사항을 명확히 이해하여 이와 같은 상황을 사전에 예방하는 것이 필수적이다. 그러나 이러한 위험 때문에 OpenSource 소프트웨어를 전혀 사용하지 않겠다는 결론을 내릴 필요는 없다. 독점소프트웨어 라이센스에서 규정하고 있는 의무사항에 비하면 OpenSource 라이센스가 요구하고 있는 내용이 결코 어려운 것이 아니므로, 오히려 이를 잘 이해하고 준수함으로써 OpenSource 소프트웨어의 장점을 적극 활용할 필요가 있다. 또한 몇몇 라이센스만이 독자 개발한 소스 코드의 공개를 요구하고 있기 때문에 이를 잘 분석한 후 사용한다면 문제 발생 소지는 거의 없을 것이다.

따라서 인터넷 상에서 자유롭게 구할 수 있는 오픈 소스를 다운로드받아 개발에 적용할 때는 반드시 라이센스의 요구 사항을 반드시 확인하여야 한다. 또한, 자체 판단이 불가능할 경우에는 외부 전문가에게 조언을 의뢰하여 개발 시작 전 해당 라이센스의 요구 사항과 오픈 소스 사용 목적을 확실히 분석하여야 한다. 이렇게 하는 것만으로도 충분히 올바르게 오픈 소스를 최대한 활용할 수 있으며, 나중에 발생할 수 있는 문제들을 사전에 차단할 수 있다.

3 OpenSource 라이센스의 구체적 내용


3.1 공통적 준수사항

OpenSource 라이센스의 의무사항은 각각의 라이센스마다 조금씩 차이가 있지만 크게 나누어 보면 공통적으로 '저작권 관련 문구 유지', '제품명 중복 방지', '서로 다른 라이센스의 소프트웨어 조합시 조합 가능 여부 확인' 등이 있고 선택적으로는 '소스코드 공개', '특허관련 사항 준수' 등이 있다.

아래는 모든 OpenSource 소프트웨어에 공통적으로 적용되는, 항상 지켜야 할 사항들이다.

  • 저작권 관련 문구 유지 : 앞에서 저작권이란 표현된 결과물에 대해 발생하는 권리이며 자동적으로 부여된다고 기술하였다. 소프트웨어의 소스코드에 대해서도 마찬가지이며 잘 관리되는 OpenSource 소프트웨어들의 경우 거의 대부분 소스코드 상단에 개발자 정보와 연락처 등이 기록되어 있는데 만약 이러한 개발자 정보를 임의로 수정하거나 삭제하여서는 안된다. 특히 GPL등 수정된 결과물을 다시 공개하도록 규정하고 있는 '상호주의(reciprocal)' 라이센스들의 경우 만약 소스코드 상에 개발자 정보가 수정/삭제된 채로 외부에 소스코드를 공개하였다가 그 사실이 밝혀질 경우 더 큰 문제가 발생할 수 있다. 상식적으로도 쉽게 판단 가능한 사항이므로 항상 준수하여야 한다.

  • 제품명 중복 방지 : 사용하는 OpenSource 소프트웨어와 동일한 이름을 제품명이나 서비스 명으로 사용하여서는 아니된다. 특히 유명한 OpenSource 소프트웨어들일수록 해당 OpenSource 소프트웨어의 이름이 상표로서 등록되어 있는 경우가 많기 때문에(예: 리눅스) 더욱 조심하여야 한다. 다만 이러한 제품명/서비스명에 대한 결정이 개발자들에 의해 이루어지는 경우는 많지 않으므로 역시 상식적인 수준에서 판단하면 될 것이다.

  • 서로 다른 라이센스의 조합 : 소프트웨어를 작성하고자 할 경우 기존에 만들어진 코드를 재사용하거나 결합하는 경우가 많은데, 결합되는 각 코드의 라이센스가 상호 상충되는 경우가 있다. 예컨대 MPL 조건의 A코드와 GPL 조건의 B코드를 결합하여 ‘A+B’라는 프로그램을 만들어 배포하고자 하는 경우, MPL은 ‘A+B’의 A부분을 MPL로 배포할 것을 요구하는 반면, GPL은 ‘A+B’ 전체를 GPL로 배포할 것을 요구하기 때문에, ‘A+B’프로그램을 배포하는 것은 불가능하게 된다. 이러한 문제를 가르켜 라이센스의 양립성(Compatibility) 문제라고 한다. 따라서 어떤 OpenSource 소프트웨어에 다른 OpenSource 소프트웨어를 섞을 경우 반드시 두개의 라이센스가 서로 호환되는지를 확인하여야 한다. 양립성문제는 자유/OpenSource 소프트웨어 진영에 심각한 문제점을 제기하였으며, 이를 해결하기 위한 노력도 다양하게 진행되고 있다. 예를 들어 모질라 프로젝트(Mozilla.org)에서는 프로젝트의 결과물을 MPL, GPL, LGPL의 3가지(triple) 라이센스로 배포하는 라이센스 정책을 채택하여, 라이센스의 양립성과 관련된 불확실성을 제거하고 모질라 코드를 GPL 또는 LGPL 기반의 응용프로그램에 사용할 수 있도록 하였다. Trolltech도 Qt 라이브러리에 대한 OpenSource 소프트웨어라이센스인 QPL과 GPL의 양립성 문제를 해결하기 위하여 QPL 및 상용라이센스 이외에 GPL을 추가하는 정책을 취하고 있다. 한편 최근 개정된 GPL 3.0은 Apache License 2.0과 양립가능하다.

아래는

  • 사용 여부 명시 : 많은 OpenSource 라이센스들은 소스코드를 자유롭게 열람하고 수정 및 재배포할 수 있는 권리를 부여하는 한편, 소프트웨어를 사용할 때 해당 OpenSource 소프트웨어가 사용되었음을 명시적으로 표기하는 것을 의무사항으로 채택하고 있다. 이것은 마치 논문을 쓸 때 인용을 하는 것과 비슷하여, '이 소프트웨어는 OpenSource 소프트웨어인 무엇무엇을 사용하였습니다.'라는 식으로 사용 여부를 명확히 기술하라는 것이다. 사용자 매뉴얼이나 기타 매뉴얼을 대체하는 매체가 있다면 그곳에 기술하면 된다.

  • 소스코드 공개 : OpenSource 라이센스에 따라서는 수정하거나 추가한 부분이 있을 때 해당 부분의 소스코드도 공개하여야 한다고 명시하는 경우가 있다. 이에 해당하는 라이센스는 GPL이 가장 유명하다. 그러나 정확한 공개 범위는 각각의 라이센스에서 정하고 있는 범위가 다르고, 소프트웨어를 개발하는 방법에 따라서도 달라질 수 있다. 자세한 내용은 다음 절의 쟁점부분을 참고하기 바란다.

  • 특허 : 특허에 대한 기본적인 내용은, 만약 어떤 기술이 특허로 보호될 경우 해당 기술을 구현할 때 반드시 특허권자의 허락을 받아야 한다는 것이다. 이는 OpenSource 이냐 아니냐에 상관 없이 공통적으로 해당된다. 그러나 어떤 특허를 OpenSource 로 구현할 경우 해당 특허의 구현 결과는 OpenSource 라이센스를 따르게 되는 등, OpenSource 소프트웨어와 관련된 특허권의 문제는 보다 복잡하게 전개되고 있다. 특히 최근 소프트웨어특허가 급격히 증가하면서 문제가 심각해지고 있기 때문에, 새롭게 만들어지는 OpenSource 라이센스들에서는 특허관련조항을 포함하고 있는 경우가 많아지고 있다. 이와 관련된 자세한 내용도 다음 절의 쟁점부분을 참고하기 바란다.

3.2 라이센스별 준수사항


이제 주요 라이센스 위주로 각각 준수해야 하는 사항들에 대해 살펴보기로 하자.

3.2.1 GPL 2.0


GPL은 현재 가장 많은 OpenSource 소프트웨어가 채택하고 있는 라이센스이다. OpenSource 라이센스들 중에서 가장 많이 알려져 있고 의무사항들도 타 라이센스에 비해 엄격한 편이다. GPL의 주요 내용은 다음과 같다.

  • 소프트웨어를 배포하는 경우 저작권 표시, 보증책임이 없다는 표시 및 GPL에 의해 배포된다는 사실 명시
  • 소프트웨어를 수정하거나 새로운 소프트웨어를 링크(Static과 Dynamic linking 모두)시키는 경우 GPL에 의해 소스 코드 제공해야 함.
  • Object Code 또는 Executable Form으로 GPL 소프트웨어를 배포하는 경우, 소스 코드 그 자체를 함께 배포하거나 또는 소스코드를 제공받을 수 있는 방법에 대한 정보 함께 제공해야 함
  • 자신의 특허를 구현한 프로그램을 GPL로 배포할 때는 GPL 조건을 준수하는 이용자에게는 로열티를 받을 수 없으며, 제3자의 특허인 경우에도 특허권자가 Royalty-Free 형태의 라이센스를 제공해야만 해당 특허 기술을 구현한 프로그램을 GPL로 배포하는 것이 가능

GPL 소프트웨어를 사용하였을 경우 "본 제품(소프트웨어)는 GPL 라이센스 하에 배포되는 소프트웨어 XXX(사용한 GPL 소프트웨어 이름)를 포함합니다"와 같은 문구를 매뉴얼 혹은 그에 준하는 매체에 포함시키고, GPL 전문을 첨부해야 한다.

GPL에서 가장 논란이 되는 부분은 소스코드 공개 범위이다. 실제 소스코드 공개 범위는 다음 장의 쟁점 부분에서 확인하기로 한다. 소스코드를 공개하기 위해서는 소스코드를 CD Rom 등의 매체에 담아서 제품판매시 함께 배포하거나, 매뉴얼에 소스코드를 요청할 수 있는 연락처를 기입하여 두거나, 혹은 FTP 서버, 웹서버 등에 소스코드를 업로드해 두고 매뉴얼에 해당 주소를 기입하면 된다.

최근 특허에 관한 쟁점도 중요성이 증가하고 있는데, 자세한 내용은 다음 장의 쟁점 부분에서 설명한다.

3.2.2 LGPL 2.1


FSF가 일부 Library에 GPL보다 다소 완화된 형태인 GNU Lesser General Public License (LGPL)를 만들어 사용하고 있는 이유는 오픈 소스 소프트웨어의 사용을 장려하기 위한 전략적인 차원에서이다. 만일 상용 Library와 동일한 기능을 제공하는 Library에 GNU와 같은 엄격한 라이센스를 적용하게 되면, 개발자들이 Library의 사용을 꺼려할 것이다. 오히려 이미 널리 사용되고 있는 상용 Library와 동일한 기능을 제공하는 Library를 LGPL로 배포하여 그 사용을 장려하고 사실상의 표준으로 유도하는 한편, 관련된 다른 오픈 소스 소프트웨어를 보다 더 많이 사용할 수 있도록 하겠다는 것이 FSF의 전략이다. LGPL Version 2.1은 GNU ‘Library’ General Public License version 2.0의 후속 버전이다. 일부 한정된 Library에 대해서만 LGPL을 사용하려는 것이 FSF의 의도였으나 ‘Library’란 단어가 라이센스 이름에 포함되어 개발자들이 모든 Library를 위한 라이센스로 오인하는 경향이 있었다. 결국 이러한 오인을 방지하기 위하여 ‘Library’를 ‘Lesser’로 수정하였을 뿐 기본적인 내용은 동일하기 때문에 Version 2.1으로 표기한 것이다. LGPL의 주요 내용을 요약하면 다음과 같다.

  • 소프트웨어를 배포하는 경우 저작권 표시, 보증책임이 없다는 표시 및 LGPL에 의해 배포된다는 사실 명시
  • LGPL Library의 일부를 수정하는 경우 수정한 Library를 LGPL에 의해 소스 코드 공개
  • LGPL Library에 응용프로그램을 링크시킬(Static과 Dynamic Linking 모두) 경우 해당 응용프로그램의 소스를 공개할 필요 없음. 다만 사용자가 Library 수정 후 동일한 실행 파일을 생성할 수 있도록 Static Linking시에는 응용프로그램의 Object Code를 제공해야 함
  • 특허의 경우 GPL과 동일함

LGPL은 링크하는 소프트웨어의 소스코드를 공개할 필요가 없다는 점이 GPL과 가장 큰 차이점이다. 여하한 경우에도 LGPL 소프트웨어 자체는 공개해야 하지만 LGPL 소프트웨어와 링크되는 부분의 소프트웨어 소스코드는 공개해야 할 의무가 발생하지 않으므로 기업의 입장에서는 LGPL 소프트웨어를 좀더 선호하게 된다. 사용 여부 명시 등은 GPL과 동일하게 반영하면 되고 공개해야 할 소스코드의 공개 역시 GPL과 동일한 방식을 이용하면 된다.

3.2.3 BSD License


BSD(Berkeley Software Distribution) 라이센스는 GPL/LGPL보다 덜 제한적이기 때문에 허용범위가 넓다. 이는 BSD 라이센스로 배포되는 프로젝트가 미국 정부에서 제공한 재원으로 운영되었기 때문이다. GPL과의 차이점 중 가장 중요한 사항은 BSD 라이센스는는 소스코드 공개의 의무가 없다는 점이다. 따라서 BSD 라이센스의 소스 코드를 이용하여 새로운 프로그램을 개발하여도 새로운 프로그램의 소스 코드를 공개하지 않고 BSD가 아닌 다른 라이센스를 적용하여 판매할 수 있다. 주요 내용을 요약하면 다음과 같다.

  • 소프트웨어를 배포하는 경우 저작권 표시, 보증책임이 없다는 표시
  • 수정 프로그램에 대한 소스 코드의 공개를 요구하지 않기 때문에 상용 소프트웨어에 무제한 사용가능

3.2.4 Apache License


아파치 라이센스는 아파치 웹서버를 포함한 아파치 재단(ASF: Apache Software Foundation)의 모든 소프트웨어에 적용되며 BSD 라이센스와 비슷하여 소스코드 공개 등의 의무가 발생하지 않는다. 다만 "Apache"라는 이름에 대한 상표권을 침해하지 않아야 한다는 조항이 명시적으로 들어가 있고, 특허권에 관한 내용이 포함되어 BSD 라이센스보다는 좀더 법적으로 완결된 내용을 담고 있다. 특히 Apache License 2.0에서 특허에 관한 조항이 삽입되어 GPL 2.0으로 배포되는 코드와 결합되는 것이 어렵다는 문제가 었었는데, GPL 3.0(안)에서는 이 문제를 해결하여 아파치 라이센스로 배포되는 코드가 GPL 3.0으로 배포되는 코드와 결합하는 것이 가능해졌다.

3.2.5 MPL(Mozilla Public License)


MPL은 Netscape 브라우저의 소스코드를 공개하기 위해 개발된 라이센스이다. MPL은 공개하여야할 소스코드의 범위를 좀더 명확하게 정의하였다. GPL에서는 링크되는 소프트웨어의 소스코드를 포함하여 공개하여야 할 소스코드의 범위가 모호하게 정의되어 있지만 MPL에서는 링크 등의 여부에 상관없이 원래의 소스코드가 아닌 새로운 파일에 작성된 소스코드에 대해서는 공개의 의무가 발생하지 않는다. 따라서 MPL 소프트웨어 그 자체는 어떻게 하든 공개를 해야 하지만 원래 소스코드에 없던 새로운 파일들은 공개하여야 할 의무가 발생하지 않으므로 GPL에 비해 훨씬 명확하다. 주요 내용을 요약하면 다음과 같다.

  • 소프트웨어를 배포하는 경우 저작권 표시, 보증책임이 없다는 표시 및 MPL에 의해 배포된다는 사실을 명시
  • MPL 코드를 수정한 부분은 다시 MPL에 의해 배포
  • MPL 코드와 다른 코드를 결합하여 프로그램을 만들 경우 MPL 코드를 제외한 결합 프로그램에 대한 소스코드는 공개할 필요가 없음
  • 소스코드를 적절한 형태로 제공하는 경우, 실행파일에 대한 라이센스는 MPL이 아닌 다른 것으로 선택가능
  • 특허기술이 구현된 프로그램의 경우 관련 사실을 ‘LEGAL’파일에 기록하여 배포

3.3 주요 쟁점


3.3.1 소스코드 공개 여부


앞에서 GPL/LGPL/BSD/MPL/Apache License 등 많이 사용되는 라이센스들을 간략히 살펴보았는데 이중에서 GPL/LGPL/MPL 등은 수정한 내용에 대한 소스코드를 공개하여야 하고 BSD/Apache License 등은 수정하더라도 소스코드를 공개할 의무가 발생하지 않는다. GPL/LGPL/MPL 등 소스코드 공개 의무가 발생하는 라이센스는 상호주의(reciprocal) 혹은 copyleft 라이센스라고 하며, 그 결과물이 원 소프트웨어의 파생물(derivative work)일 경우 소스코드를 공개해야 한다. 그런데 소스코드의 공개범위를 기계적으로 판단할 수 있는 방법은 없으며 라이센스마다 서로 다르게 정의하고 있으므로 잘 판단하여야 한다. GPL을 중심으로 보다 자세히 살펴보도록 하자.

GPL의 경우, GPL 프로그램의 소스코드를 이용자가 개발한 프로그램코드에 삽입하거나 링크시킨 후 함께 배포하고자 하는 경우, 이용자가 개발한 프로그램도 GPL 조건으로 배포해야 한다. 반면 GPL 제2조 후단에서는 ‘원 프로그램으로부터 파생되지 않고 그 자체로 독립적이고 분리되어 있는 저작물(separate works)은 다른 라이센스 조건에 의해 배포가능하며, 단순집합물(mere aggregation)로서 원 프로그램과 동일한 매체로 배포할 수 있다’고 규정하고 있다. 예를 들어 독립적으로 제작된 프로그램을 GPL 프로그램과 단순히 동일한 매체에 저장하여 배포할 경우에는 GPL이 아닌 다른 라이센스조건에 의해 배포할 수 있다. 하지만 구체적으로 어떠한 경우가 파생물에 해당하는지, 또는 독립된 프로그램의 단순한 집합물에 해당하는지를 구별하는 것은 쉽지 않다. 결국 최종적으로는 법원의 판단에 의해 결정될 문제인데, FSF는 GPL FAQ에서 몇 가지의 구별기준을 제시하고 있다. 예를 들어 두개의 모듈이 동일한 실행파일에 포함되어 있거나 공유주소영역(shared address space)에서 링크되어 실행되도록 설계된 경우에는 전자에 포함되고, 2개의 프로그램이 파이프(pipes), 소켓(sockets), command-line arguments 형태로 통신하는 경우에는 후자에 해당한다. 플러그인(plug-ins)의 경우 동적으로 링크되어 함수호출을 하고 데이터구조를 공유하는 경우에는 전자에, fork와 exec를 이용하면 후자에, 해당한다. 인터프리터(interpreter)나 컴파일러(compiler)의 경우에는 원칙적으로 컴파일된 결과물과는 분리된 것으로 보지만, 컴파일과정에서 라이브러리나 클래스가 결과물에 추가된 경우에는 라이브러리 또는 클래스와 결과물은 하나의 프로그램으로 볼 수 있다.

이와 같은 GPL의 특징은 다른 OpenSource 소프트웨어 라이센스와 비교할 때 명확히 드러난다. 예를 들어 LGPL은 일정한 요건을 충족시키는 경우 LGPL 라이브러리(Library)를 이용하는 프로그램(Work that uses the Library), 다시 말해 컴파일 또는 링크를 통해 LGPL 라이브러리와 함께 작동하도록 설계된 프로그램들을 배포할 경우에는 소스코드를 제공하지 않아도 된다.(LGPL 제5조). MPL도 한편으로는 GPL과 마찬가지로 수정된 코드의 소스코드를 제공할 것을 요구하면서, 다른 한편으로는 MPL 조건의 코드와 기타의 라이센스 조건의 코드를 결합한 프로그램(MPL에서는 이를 ‘Larger work’라고 표현하고 있다)을 만드는 것을 허용하고, 결합된 프로그램을 MPL이 아닌 다른 라이센스로 배포하는 것을 허용하고 있다(MPL 제3.7조). 예를 들면 별도의 파일로 함수(Function)를 추가할 경우 MPL은 기존 코드의 수정부분에만 적용할 뿐 추가된 함수에는 적용되지 않는다.

한편 원칙적으로 GPL 조건으로 배포하면서도 GPL 제2조와 관련해서는 다소 완화된 내용의 조건으로 프로그램을 배포하는 경우가 있다. 대표적 사례는 리눅스커널의 경우인데, 리눅스커널의 ‘COPYING' 파일에 포함되어 있는 라이센스 조건에는 ’정상적인 시스템 콜에 의해 커널 서비스를 이용하는 사용자프로그램(user programs)은 GPL에 의해 배포하지 않아도 좋다는 내용이 포함되어 있다. 이와 같은 내용에 따라 리눅스커널을 기반으로 한 라이브러리나 응용프로그램은 소스코드를 제공하지 않고도 배포할 수 있으며, 시장에서는 이를 확대해석하여 표준커널인터페이스를 이용하는 디바이스 드라이버나 동적 커널모듈(Loadable Kernel Module)도 사용자프로그램이 시스템 콜을 이용하는 것과 크게 다르지 않기 때문에 소스코드를 제공할 필요가 없는 것으로 보고 있다.
- 리눅스 커널은 부적절한 예제입니다. 리눅스 커널의 COPYING 파일의 내용은 GPL의 "derived work"가 어디까지인가에 대해 명확히 하는 부분이지, GPL에 따로 예외를 부여하는 조항이 아닙니다. 또 커널 모듈이 GPL이 아닐 수 있다는 내용도 리눅스 토발즈나 다른 리눅스 개발자의 생각과 다르며, 아래에 있는 내용과도 다릅니다. -- cwryu 2007-07-08 08:42:26

두 번째 사례는 GNU Classpath 프로젝트와 자바(Java) 플랫폼사례이다. GNU Classpath 프로젝트는 자바(java)언어의 가상머신(virtual machines) 및 컴파일러에서 사용되는 핵심 클래스라이브러리(core class libraries)를 자유소프트웨어로 대체하기 위한 프로젝트인데, 동 프로젝트의 결과물을 GPL로 배포하면서도 이와 링크된 다른 독립된 소프트웨어는 GPL로 배포할 필요가 없다는 내용의 예외를 인정하였다. 그런데 2006년 말 Sun이 향후 자바 플랫폼을 GPL 조건으로 배포하겠다는 선언을 하면서, 자바 플랫폼 중 특히 Java SE(Java Platform Standard Edition)와 Java EE(Java Platform Enterprise Edition)의 GPL 배포조건에 Classpath 예외를 추가한다고 발표하였다. 그 결과 Classpath 예외조항을 포함한 GPL 조건의 자바 플랫폼을 이용한 응용프로그램도 소스코드를 공개하지 않고 배포할 수 있다.

3.3.2 특허권


GPL, LGPL, MPL, Apache 라이센스 등의 OpenSource 라이센스는 특허와 관련된 조항들을 가지고 있는데, 각각의 경우를 ⅰ) 라이센서(Licensor)의 특허인 경우, ⅱ) 제3자의 특허인 경우, ⅲ) 라이센시(Licensee)의 특허인 경우로 구분하여 설명할 수 있다. 다만 LGPL은 특허와 관련해서는 GPL과 동일하게 규정하고 있으며, BSD는 특허에 관한 규정을 두고 있지 않기 때문에 이하에서는 생략한다.

  • 라이센서(Licensor)의 특허인 경우 : 소프트웨어에 대해 저작권을 가지고 있는 주체가 특허권을 함께 가지고 있는 경우이다. MPL과 Apache 라이센스는 이와 같은 경우 라이센서가 소프트웨어를 OpenSource 라이센스조건으로 배포하는 경우 관련 특허권의 라이센스도 무상으로 제공하는 것으로 규정하고 있다. GPL의 경우에는 명문으로 규정하고 있지 않지만 대체적으로 관련 조문(제7조 등)의 해석상 묵시적인 라이센스를 제공하는 것으로 보고 있다. GPL 3.0에서는 단순 재배포자를 제외한 개발자 및 기여자(Contributor)의 경우 자신이 기여한 부분과 관련된 특허권 라이센스를 무상으로 제공하는 것으로 규정하고 있다. 한가지 주의하여야 할 것은 특허권 그 자체는 여전히 유효하다는 것이다. 따라서 예를 들어 특허권자 특허받은 정렬 알고리즘을 GPL로 배포되는 리눅스에 로열티 없이 사용 가능하도록 제공한다고 할지라도 독점 라이센스인 MS 윈도우즈에는 해당 정렬 알고리즘을 사용토록 허가하면서 여전히 로열티를 받을 수 있다.

  • 라이센시(Licensee)의 특허인 경우 : 프로그램을 사용하는 이용자가 특허권을 가지고 있는 경우이다. MPL의 경우 이용자가 자신의 특허권을 문제 삼지 않고 그냥 사용하는 경우에는 아무런 문제가 없지만, 만약 이용자가 MPL 프로그램을 사용하던 중 자신의 특허권을 근거로 소송을 제기하게 되면, 적절한 시일 내에 소송을 철회하지 않는 한 라이센스가 종료되고, 그 결과 MPL 프로그램을 더 이상 사용할 수 없거나, 그 동안 사용했던 부분에 대하여 로열티 산정을 하는 등 일정한 보복이 가해진다. Apache 라이센스 2.0도 MPL과 비슷한 취지의 조항을 추가하였으며, GPL 3.0에서도 관련 내용이 추가되었다.

  • 제3자의 특허인 경우 : 특허 소유자와 이를 프로그램으로 구현한 주체가 다른 경우인데, GPL 제7조에 의하면 특허 소유자가 무상(Royalty-Free) 조건의 특허 라이센스를 허용하지 않는다면 구현자는 이 프로그램을 GPL 조건으로 배포할 수 없다. 예를 들면 甲회사가 乙회사의 특허기술을 바탕으로 A라는 프로그램을 만들었을 경우, 乙회사가 그 특허를 모든 사람에게 무상으로 허용하지 않는다면, 설사 甲회사가 라이센스를 무료로 받았다고 할지라도 A프로그램을 GPL 조건으로 배포할 수 없다. 나아가 GPL 3.0에서는 제3자인 특허권자가 이용자들을 차별하여 라이센스를 부여하는 것을 막기위한 조항이 삽입되었다. 그 결과 2006년 말 MS와 노벨사이에 체결되었던 형태의 계약은 향후 어려울 것으로 보인다. MPL은 제3자의 특허인 경우에도 일단 배포는 허용하되, ‘LEGAL’이라는 이름의 파일을 추가하여 어떠한 특허가 문제되고 있는지, 어떤 사람이 클레임을 제기하고 있는지에 대한 사항을 자세히 기록하도록 하고 있다.

3.3.3 듀얼 라이센스


또한 일부 OpenSource 소프트웨어는 복수의 라이센스하에 배포되는 경우가 있다. 이를 주로 듀얼 라이센스(dual license)라고 하며, 이런 경우는 주로 오픈 소스 소프트웨어를 상업적 목적으로 이용할 뿐만 아니라 OpenSource 커뮤니티와의 협력을 위한 경우가 대부분이다. 하나 이상의 라이센스가 있는 OpenSource 소프트웨어를 이용할 경우, 이용자는 사용 목적에 가장 잘 부합하는 라이센스 하에 배포되는 소스 코드를 선택할 수 있다. 대표적인 사례로는 MySQL, Trolltech의 Qt 라이브러리 등이 있다.

3.4 주요 OpenSource 소프트웨어 사례

앞서 살펴본 OpenSource 라이센스에 대한 이해를 바탕으로 실제 많이 사용하고 있는 OpenSource 소프트웨어들 중 특별히 기억해 두어야 할 라이센스 관련 이슈에 대해 살펴보자.

3.4.1 Linux 커널


Linux 커널은 GPL v2로 배포된다. 그런데 리눅스커널의 'COPYING'파일에는 GPL v2 전문과 함께 다음과 같은 내용이 맨 위에 추가로 기재되어 있다.

NOTE! This copyright does *not* cover user programs that use kernel services by normal system calls - this is merely considered normal use of the kernel, and does *not* fall under the heading of "derived work". Also note that the GPL below is copyrighted by the Free Software Foundation, but the instance of code that it refers to (the Linux kernel) is copyrighted by me and others who actually wrote it.
Also note that the only valid version of the GPL as far as the kernel is concerned is _this_ particular version of the license (ie v2, not v2.2 or v3.x or whatever), unless explicitly otherwise stated.

정상적인 시스템 콜에 의해 커널 서비스를 이용하는 사용자프로그램(user programs)은 GPL에 의해 배포하지 않아도 좋다는 뜻이다. 이와 같은 내용에 따라 리눅스커널을 기반으로 한 라이브러리나 응용프로그램은 GPL v2의 영향을 받지 않는 것이다. 그러나 Linux 커널은 커널의 기능을 커널 모듈이라는 형태로도 이용할 수 있는 인터페이스를 제공하는데 이 커널 모듈도 위의 예외사항에 속하는지에 대한 논란이 계속되고 있다. 즉, 리눅스 커널모듈도 모두 GPL v2로서 소스코드를 공개해야 하는지, 아니면 독점 라이센스를 적용하여 소스코드를 공개하지 않아도 되는지에 대한 논란이다. 이에 대해서는 리눅스 커널 개발자들 사이에서도 의견이 갈리고 있다.

최소한, http://www.kernel.org 에서 배포되는 공식 커널 버전을 기준으로 모듈 인터페이스를 임의로 수정하지 않은 상태에서 동작이 가능한, 자체 개발된 커널 모듈은 GPL이 아닐 수 있다고 주장할 수 있다. 그러나 모듈 인터페이스를 임의로 수정할 경우에는 설득력이 훨씬 약해지며, 커널 모듈이 GPL이냐 아니냐에 대한 논란은 매우 첨예하게 대립하고 있으므로 커널 모듈은 모두 GPL이라고 가정하고 공개가 불가능한 부분은 사용자프로그램(user program)에서 구현하는 것이 바람직하다.

커널 모듈 인터페이스에는 MODULE_LICENSE()라는 것이 있어서, 여기에서 커널 모듈의 라이센스를 GPL로 지정하면 EXPORT_SYMBOL_GPL()로 정의한 "GPL 심볼"을 사용할 수 있다. 커널 모듈의 라이센스를 GPL로 하지 않으면 "GPL 심볼"이 아닌 심볼만을 사용해야 한다. 이 인터페이스를 가이드라인으로 커널 모듈이 GPL이 되어야 하는 지 여부를 어느정도 판가름할 수 있다. 하지만 이 "GPL 심볼"만 피해가면 GPL로 안 해도 된다고 오해해서는 안 된다. 이와 같은 장치는 반드시 GPL이 되어야 하는 지 명확하게 하기 위한 목적일 뿐이다. 즉 "GPL 심볼"을 사용한 모듈은 반드시 GPL이 되어야 하지만, GPL 심볼을 사용하지 않도록 피해간다고 해서 GPL이 아니어도 된다는 의미는 아니다. 심볼 사용 여부와 관계없이 GPLv2의 2항에 따라 (If identifiable sections of that work ... can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works.) 해당 커널 모듈이 리눅스 커널과 얼마나 독립적인가가 GPL 여부 판단의 문제가 된다. 실제로 GPL이 아닌 상태로 배포되고 있거나 배포되었던 커널 모듈들의 예로, Open Sound System (멀티 플랫폼, 최근에 GPL로 전환되기 전), NVidia/ATI의 비디오 카드 드라이버 (MS-Windows에서 포팅), AFS (유닉스에서 포팅) 등을 보면, 그 개발 과정이나 의존하는 플랫폼이 리눅스와는 독립적으로 이루어졌다고 볼 수 있다. (하지만 이들 역시 약간 애매한 상태에 있는 게 사실이다.)

3.4.2 FreeBSD


FreeBSD는 1993년에 처음 발표되었다. FreeBSD는 Unix 시스템인 BSD(Berkeley Software Distribution)를 기반으로 개발되었고, 다양한 Unix 버전 중 오픈 소스 Unix라 할 수 있을 것이다. FreeBSD는 가장 제약 사항이 적은 BSD License에 의해 배포되고 있다. 따라서 FreeBSD 소스 코드를 상업적으로 아무런 제한없이 이용할 수 있다. 단, 소스 코드 혹은 바이너리 형식으로 재배포할 때는 FreeBSD의 원저작권자인 The Regents of the University of California의 저작권을 명시해야 한다. 현재 FreeBSD의 소스 코드에는 다음과 같이 저작권이 명시되어 있다. "All of the d0cumentation and software included in the 4.4BSD and 4.4BSD-Lite Releases is copyrighted by The Regents of the University of California" 또한, Free BSD를 이용하고 있음을 밝히기 위해서는 다음의 사항을 명시해야 한다. "This product includes software developed by the University of California, Berkeley and its contributors." 마지막으로 재배포 시에는 FreeBSD 소스 코드에 포함된 라이센스 내용을 그대로 포함시켜야 한다. 요약하면, FreeBSD는 소스 코드 공개를 요구하지 않으며, 만약 원본 혹은 수정된 소스 코드를 공개하고자 하면 위에서 언급한 사항들만 준수하면 된다.

3.4.3 MySQL


MySQL은 현재 가장 인기 있는 관계형 데이터베이스 서버로서 사용자는 GPL 라이센스나 일반 상용 라이센스 둘 중 한가지를 선택할 수 있는데, 상용 라이센스는 GPL 라이센스의 여러가지 요구사항들(소스코드 공개 등)을 지키기 어려운 경우에 선택할 수 있으므로 일반적인 상용 라이센스 판매를 통해 수익을 내고 있다. 이러한 라이센싱 모델을 듀얼 라이센스라고 하며 MySQL은 듀얼 라이센싱 모델의 대표적인 사례로서 종종 언급된다. MySQL의 이같은 듀얼 라이센싱 모델에 대해서 좀더 살펴보면 다음과 같다.

우선 OpenSource 프로젝트 목적으로 MySQL을 이용할 경우를 살펴보자. 만약, 이용자가 MySQL 라이브러리를 이용하여 개발한 애플리케이션을 GPL 라이센스 하에 배포한다면, 이 경우 MySQL은 GPL 라이센스가 적용된다. 즉, 이용자가 기꺼이 직접 개발한 애플리케이션을 GPL하에 배포하기 때문에 MySQL 라이브러리 역시 GPL이 되더라도 문제가 발생하지 않을 것이다. 또한, 이용자가 GPL이 아닌 Open Source Initiative에서 인정한 라이센스 하에 직접 개발한 애플리케이션을 배포할 경우에도 특별 예외 조항을 두어 라이센스 충돌이 발생하지 않도록 하였다. 즉, 비록 GPL 라이브러리를 이용하더라도, 직접 개발하였거나 GPL 라이브러리와 독립된 부분으로 인정이 되는 애플리케이션의 소스 코드는 GPL이 아닌 다른 OpenSource 라이센스로 배포할 수 있도록 하였다. GPL의 원칙을 따를 경우, GPL 라이브러리에 기반한 애플리케이션 전체 소스 코드가 GPL이 되기 때문에 소스 코드 공개 의무가 발생한다. 한편 GPL 등 OpenSource 라이센스조건을 따르지 않는 형태로 사용하고자 하는 경우에는 MySQL AB사로부터 Commercial License를 받아야 한다.

그러나 한가지 주지하여야 할 것은 GPL의 의무사항은 소프트웨어를 배포할 때 발생하는 것이므로 만약 MySQL을 다운로드해서 MySQL과 연동되는 웹사이트 등을 만들어서 서비스만 하는 경우는 MySQL을 직접 배포하지 않는 것이므로 GPL의 의무사항이 발생하지 않는다는 것이다. 예를 들어 인터넷 포털 업체들은 MySQL의 상용 버전을 구입하지 않고 GPL 버전을 사용하면서 MySQL이나 관련 소프트웨어의 소스코드를 공개하지 않고 있다.

3.4.4 Apache


Apache 소프트웨어들은 현재 ASF에서 자체적으로 개발한 Apache License Version 2.0하에 배포되고 있다. Apache License에 따르면, 누구든 자유롭게 Apache 소프트웨어를 다운받아 부분 혹은 전체를 개인적 혹은 상업적 목적으로 이용할 수 있다. 또한, 재배포 시에도 원본 소스 코드 혹은 수정한 소스 코드를 반드시 포함시킬 것을 요구하지 않는다. 다만, 재배포하고자 할 경우에는 Apache License, Version 2.0을 포함시키고 ASF에 개발된 소프트웨어임을 명확히 밝힐 것을 요구한다. 아울러 ASF가 승인하지 않는 ASF 공식 마크를 임의로 사용할 수 없다.

3.4.5 Mozilla Firefox


Firefox는 오픈 소스 소프트웨어이며 현재 MPL, GPL, LGPL 세 가지 라이센스 하에 배포되고 있다. 이 세가지 라이센스는 모두 공통적으로 누구나 소스 코드를 보고 수정하며 재배포하는 것을 허용한다. 원래 Firefox는 MPL에 의해 배포되었다. 그런데 파생물의 상업적 이용을 제한적으로 허락하는 MPL은 GPL 혹은 LGPL과 호환될 수 없기 때문에 FSF로 부터 많은 비난을 받았다. 이 문제를 해결하기 위해 Mozilla는 Firefox를 MPL, GPL, 그리고 LGPL하에 다시 라이센싱하였다. 이 후, 개발자들은 이 세 가지 라이센스 중 자신들의 목적에 가장 잘 부합하는 라이센스를 선택할 수 있게 되었다. 그런데 하나 유의할 점은, Firefox의 일부 상용 컴포넌트를 포함하고 있기 때문에, 이 상용 컴포넌트는 위에서 언급한 세 가지 라이센스의 적용을 받지 않는다. 대신, 이들은 Mozilla End User License Agreement(EULA)의 제한을 받고 있다.

3.4.6 Sendmail


Sendmail은 1981년 Eric Allman에 의해 Mail Transfer Agent(MTA)로 개발되었다. 당시에 그는 UC Berkely에서 일하며 대학의 네트워크와 Arpanet 사이에 이메일을 주고받기 위한 목적으로 sendmail을 개발하였다. 처음부터 Sendmail은 메일 프로토콜의 개방성과 라우팅 기능성, 파일의 유연성에 초점을 맞추었기 때문에 오늘날 이메일 서버 시장의 1위 자리를 차지할 수 있었을 것이다. Allman은 여전히 Sendmail 개발의 중심에 있으며, Sendmail의 유지보수와 기능 및 성능 개선 등의 난관을 헤쳐가기 위해 Sendmail, Inc.이라는 회사를 설립하였다. Sendmail 8.9 이전 버전은 오픈 소스 형식으로 개발되었으며, 8.9 버전부터는 Allman이 설립한 회사에 의해 개발 및 공개되었다. 이러한 역사적 배경 때문에 Sendmail은 두 가지 다른 라이센스 형식을 취하고 있다. 우선, Sendmail을 단순히 컴파일해서 바이너리만 사용하거나, 아니면 오픈 소스 형식으로 소스 코드를 제공하며 이용할 경우는 Sendmail License를 적용받는다. 이 라이센스는 Sendmail의 자유로운 이용, 수정, 및 배포를 허락한다. 단, 재배포할 경우에는 배포에 필요한 비용 이상을 부과할 수 없으며, Sendmail에 포함된 copyright notice를 반드시 포함시켜야 한다. 그리고 재배포시 소스 코드를 포함시키지 않을 경우에는, 최대 3년까지 소스 코드 제공을 보장하는 문서를 포함시켜야 한다. 반면, 소스 코드 제공없이 상업적 용도로 이용할 경우에는 Sendmail, Inc.와 접촉해서 별도의 라이센스를 받아야만 한다.

4 기업에서의 OpenSource 라이센스 관리/활용 방안


4.1 OpenSource 소프트웨어관련 정책의 수립


최근 국내외 많은 기업들이 OpenSource 소프트웨어를 활용하여 비즈니스를 수행하고 있다. 선진 기업들은 기업 외부의 OpenSource 소프트웨어를 도입하여 활용할 뿐만 아니라, OpenSource 개발방법론을 통해 기업에서 필요한 소프트웨어를 개발하기도 하며, 그 과정에서 외부에 있는 OpenSource 커뮤너티를 적극 활용하기도 한다. 하지만 국내 기업들의 대다수는 OpenSource 소프트웨어관련 정책을 따로 마련하지 않고 개발자들 수준에서 기업외부에 존재하는 OpenSource 소프트웨어를 단순 활용하는 수준에 머물러 있는데, 향후 OpenSource 소프트웨어에 대한 활용의 필요성이 지속적으로 증가할 것이라는 점을 고려한다면 개별기업차원에서 OpenSource 소프트웨어관련 정책을 수립할 필요성이 있다. OpenSource 소프트웨어 관련 정책을 수립할 때에는 개별기업이 속한 시장의 상황, OpenSource 소프트웨어의 발전정도, 개별기업들의 기술수준 및 비즈니스모델 등을 고려할 필요가 있다.

개별기업에서 OpenSource 를 활용할 경우에는 OpenSource 의 장/단점을 명확히 이해한 상태에서 활용 여부 및 방향을 결정하여야 할 것이다. 일반적으로 OpenSource 소프트웨어는 다음과 같은 장점을 가지고 있다.

  • Low Entry Cost : 일반적으로 OpenSource 는 Web 상에서 무료로 다운로드 및 소스 코드 수정/ 재배포가 가능한 것이 특징이다. 따라서 초기 개발을 시작하기 위한 비용이 적게 요구된다는 장점이 있다.
  • Fast, Flexible Development : OpenSource 커뮤니티는 보통 최신 기술 정보 및 문제점과 해결책을 공유하는 형태로 자유롭게 운영되기 때문에 독점 프로그램에 비해 기술 발전 속도가 빠르다.
  • Open Formats & Protocols : OpenSource 는 주로 Open Formats 또는 Protocols을 사용하기 때문에 서로 다른 소프트웨어간 상호 연동성이 보장되는 장점이 있다. 모든 기기들이 서로 다른 Network을 통해 하나로 연결되는 Ubiquitos 시대에는 필수적인 요소로 볼 수 있다. 또한 OpenSource 운동의 주 원인 역시 상용 프로그램들간의 비호환성을 해결하는 것이다.
  • Reliability & Stability : OpenSource 의 개발 과정을 볼 때, 전세계에 있는 수많은 우수한 개발자들이 직접 개발과 Debugging 과정에 참여하기 때문에 In-house에서 폐쇄적으로 개발되는 독점 프로그램에 비해 비교적 안정적으로 동작한다는 평이 일반적이다. 하지만 이러한 Reliability와 Stability는 많은 개발자들의 적극적인 참여가 있을 때에만 가능한 것이기 때문에, 사용하고자 하는 OpenSource 의 개발 과정을 주의깊게 살펴볼 필요가 있다.
  • Networking : OpenSource 가 확산된 가장 큰 이유가 다양하고 강력한 Networking 기능 지원이라 해도 과언이 아닐 것이다. 대표적으로 Apache는 전세계 웹 서비스의 절반 이상을 차지하고 있을 정도이다. 또한 Open Source Networking Solution은 대부분 상용 프로그램과 호환되기 때문에 상품화에도 아주 잘 활용될 수 있을 것이다.

반면 OpenSource 소프트웨어는 다음과 같은 단점이 지적되고 있다.

  • 애플리케이션의 부족: 대부분의 사용자들은 Windows 기반의 GUI(Graphical User Interface)를 갖고 있는 Application에 익숙해 있지만, 이에 버금가는 Linux 기반의 Application이 많이 부족한 것이 현실이다. 또한 Linux 기반으로 개발된 많은 Application들은 Windows 기반 Application들과 호환되지 않는 문제점도 있다.
  • 빈약한 문서: 상용 프로그램에 비해 OpenSource 는 체계적인 문서를 갖고 있지 못한 단점이 있다. 이는 경우에 따라서는 개발과정의 지연을 초래할 수도 있기 때문에 활용하고자 하는 OpenSource 가 얼마만큼 문서화가 잘 되었는지도 잘 살펴보아야 한다.
  • 불확실한 개발 로드맵: OpenSource 는 영리를 목적으로 하는 회사에서 개발되는 것이 아니라, 자발적 참여를 바탕으로 Web 상에서 자유롭게 개발되는 것이 특징이다. 그렇기 때문에 독점 프로그램에서 볼 수 있는 Roadmap을 기대하기 힘든 면이 있다. OpenSource 의 이러한 단점은 OpenSource 를 활용하는 개발 과제의 Roadmap에 까지 영향을 미칠 수 있기 때문에 활용하고자 하는 OpenSource 의 향후 개발 계획이 얼마나 체계적으로 세워져 있는지도 고려해야 한다.
  • 지적 재산권: OpenSource 에 기업이 보유한 특허 및 소스코드를 포함시킬 경우 OpenSource 라이센스는 일반적으로 Royalty-free를 요구하고 있다. 따라서 Royalty-free를 원치 않을 경우에는 해당 OpenSource 를 사용할 수가 없으며, 또한 사용 후 Royalty를 주장하게 되면 해당 OpenSource 에 대한 사용 권한이 박탈되는 경우가 일반적이다. 따라서 OpenSource 를 활용하여 특허를 구현하거나 기존 소스코드를 포함하고자 할 경우, 반드시 Royalty에 대한 입장을 명확히 하여야 할 것이다.

4.2 OpenSource 라이센스관리를 위한 프로세스/조직의 구축


오픈 소스를 활용하기 위해서는 독점소프트웨어와 마찬가지로 반드시 해당 OpenSource라이센스에 대한 준수가 필수적이다. 하지만 OpenSource 라이센스에서 강제하고 있는 내용에 대해서 개발자 및 관리자들의 이해가 아직도 많이 부족한 것이 현실이다. 자칫 잘못하면 라이센스 위반으로 이미 판매중인 제품을 리콜하거나, 소스코드를 공개해야 하며, 개발중인 제품을 아예 처음부터 다시 개발해야 하는 상황을 초래할 수도 있으므로 체계적인 프로세스를 수립하고 이를 담당할 관련 조직을 구축하는 것이 필요하다.

개발이 끝난 이후에 OpenSource 라이센스관련 문제가 발견된다면 수정에 많은 시간과 비용이 소요되므로 과제 계획 단계부터 OpenSource 라이센스문제를 고려할 필요가 있다. 또한 개발이 진행되면서도 단계별로 준수해야 할 사항들을 정의하고 반드시 체크해야만 한다. 본 문서에서는 이러한 준수 사항에 대해 구체적으로 설명하기 위해 S/W 개발프로세스를 다음과 같이 표준화/단순화하였다.

'기획(SW Design)' -> '구현(Implementation)' -> '검증 (Verification)' -> '제품화(Production)'

4.2.1 기획(S/W Design)단계


OpenSource 라이센스 관련 문제를 피하는 가장 좋은 방법은 개발 기획 시점부터 이를 고려하는 것이다. 우선 해당 과제에 OpenSource 를 활용할 것인지의 여부를 판단하여야 하며, 구체적으로 어떤 프로그램을 사용할 지를 판단하여야 한다. OpenSource 의 특성상 Web 상에 여기저기 흩어져 있지만, 쉽게 OpenSource 에 관한 정보를 찾을 수 있는 곳으로는 Freshmeat.net, SourceForge, OSDir.com, BerliOS, Bioinformatics.org 등을 들 수 있다. 이와 같은 사이트들은 대부분 License별 OpenSource 분류 항목을 두고 있기 때문에 쉽게 해당 프로그램의

기획 단계의 마지막으로 해당 S/W Component별로 소스코드 공개가능여부를 판단하여야 한다. GPL등 소스코드 공개 의무가 발생하는 OpenSource 소프트웨어를 사용할 경우에는 과제 결과물의 소스코드 공개가 요구되기 때문에, 경우에 따라서는 S/W 구현 방법을 달리해야하기 때문이다. 소스코드의 공개가능 여부에 대한 판단 기준으로 다음의 사항을 참조할 수 있을 것이다.

  • Maintenance : 소프트웨어의 경우 하드웨어와 달리 개발 후 지속적 Upgrade 및 Debugging과 같은 Maintenance 과정이 중요하다. 이러한 Maintenance 과정은 상당한 Resource를 요하기 때문에 Maintenance를 직접 할 것인지에 대한 고려가 필요하다. 개발한 소스 코드를 OpenSource 커뮤니티에 공개하고, 이를 바탕으로 오픈 소스 커뮤니티를 통한 Maintenance 방법 역시 경우에 따라 아주 효율적일 수도 있을 것이다.
  • Fast Development : OpenSource 의 개발 모델 중 가장 특징적인 것이 바로 ‘Release Early and Often’을 통한 ‘Parallel Development and Debugging’이 가능한 것이다. 이를 통해 OpenSource 는 빠른 개발 속도를 가능케 하고 있다. 이러한 모델을 Resource가 부족한 개발 과제에 적용하면 보다 효율적이고 빠른 개발이 가능할 것이다.
  • Reliability 확보: S/W의 신뢰성 확보의 가장 좋은 방법은 다양한 사용자들이 다양한 환경에서 해당 프로그램을 사용하면서 발견되는 문제점을 신속히 수정하는 것이다. 이런 측면에서 볼 때 OpenSource 커뮤니티를 잘 활용하면 S/W Reliability 확보에 상당한 도움을 얻을 수 있을 것이다.
  • 차별화 유지 어려움 : 소스 코드를 공개하게 되면 그 소스 코드는 경쟁사에게도 공유되는 것이기 때문에 결국 제품의 차별화 확보가 불가능하게 되는 단점이 있다.
  • 지적재산권 확보의 어려움: 기업이 보유한 특허를 구현하여 소스코드를 공개하는 것은 결국 모든 사용자들에게 Royalty-free의 조건으로 특허를 공개하는 것이나 마찬가지가 된다.
  • 특허 침해 소송 제기 가능성 증가: 소스 코드가 공개되어 있으면 누구든 그 소스 코드를 볼 수 있기 때문에 특허 침해 소송 제기 가능성이 증가하게 되는 문제점이 발생할 수 있을 것이다.

4.2.2 구현(Implementation)단계


자체 개발한 소스 코드를 공개해도 무방한 경우는 특별히 구현 방법에 신경 쓸 필요가 없다. 단, 소스 코드를 공개할 경우 회사보유의 지적재산권을 포함시키지 않도록 주의할 필요가 있다. 그러나 소스 코드 공개를 원하지 않을 경우는 사용하는 OpenSource라이센스 강제 사항과 활용하고자 하는 형태(Kernel, Application, Device Driver 등)에 따라 다양한 경우가 발생할 수 있기 때문에, 이럴 경우는 라이센스 혹은 법률 전문가에게 의뢰하여 정확한 판단을 받아야 할 것이다.

4.2.3 검증(Verification)단계


개발이 완료된 후에는 개발 결과물인 소스 코드에 대해 실질적인 검증 작업이 필요하다. 개발 계획서 그 자체로는 라이센스 이슈가 없었더라도 실제 구현 과정에서 개발자가 OpenSource 라이센스에 대한 검증없이 사용한 경우가 있을 수 있기 때문이다. 최근에는 특정한 소스코드가 OpenSource 코드와 일치하는지를 검증하여 주는 프로그램을 활용하는 사례가 증가하고 있다.

4.2.4 제품화(Production)단계


이 단계에서는 사용된 OpenSource 소프트웨어들을 라이센스별로 분류하고 각 라이센스에서 준수해야 할 사항들이 실제로 제품에 반영될 수 있도록 하여야 한다. 앞에서 OpenSource라이센스 의무사항은 크게 '저작권 관련 문구 유지', '제품명 중복 방지', '서로 다른 라이센스 조합', '사용 여부 명시', '소스코드 공개', '특허' 등이 있다고 기술하였는데 이중에서 '저작권 관련 문구 유지', '제품명 중복 방지', '특허' 등은 기획 및 구현 단계에서 확인되어야 할 사항이고, 제품화단계에서는 '소스코드 공개', '사용 여부 명시' 등을 확인할 필요가 있다.

소스코드 공개는 공개 의무가 발생하는 소스코드를 제품을 배포할 때 함께 배포한다거나(예: CD롬 등), 연락처를 기재하고 해당 연락처로 요청하게 한다거나, 혹은 별도의 웹사이트 등에 업로드하여 두고 받아 가도록 하는 등의 방법이 가능하다.

사용 여부 명시는 해당 의무가 발생하는 소프트웨어에 대한 설명을 사용자 매뉴얼 등에 기재함으로써 이루어지는데, GPL/LGPL/MPL에서 이를 요구하고 있다. 이와 같은 경우 OpenSource 를 사용하였음을 숨기지 않고 고객에게 그 사실을 정확히 전달할 필요가 있다.

5 부록 : GPL 3.0의 배경, 경과와 주요 내용

5.1 GPL 개정의 배경과 경과

1991년 배포된 GPL 2.0은 2007년까지 16년 동안 수정 없이 사용되었다. 소프트웨어관련 기술과 이를 둘러싼 시장, 제도의 변화속도에 비추어보면 상당히 오랜 기간 동안 개정되지 않고 사용된 것으로 평가할 수 있다. 하지만 1990년대 초반 오픈소스소프트웨어가 널리 사용되기 이전에 만들어진 GPL 2.0은 최근의 변화된 상황에서 조금씩 그 한계를 드러내고 있었다. 예컨대 자유/오픈소스소프트웨어운동이 미국에서 시작되었으며 GPL 2.0도 미국의 법제도를 기반으로 만들어졌는데, 현재 자유/오픈소스소프트웨어 및 GPL은 전세계적으로 사용되고 있으며, 그에 따라 각국 법제도의 차이를 반영할 필요성이 제기되었었다. 이밖에 소프트웨어특허의 확대와 그에 따른 위험의 증가, 자유/오픈소스소프트웨어 라이선스들의 증가와 양립성 문제, DRM 기술의 확대적용과 법에 의한 보호, 네트워크서버기반 소프트웨어의 증가, P2P 등 새로운 기술의 등장 등 일련의 환경변화로 GPL 개정의 필요성은 더욱 증대되었다.

하지만 자유/오픈소스소프트웨어와 GPL의 사용자 층이 넓어진 만큼 개정작업은 더욱 복잡해졌다. 1991년 GPL 2.0이 발표될 당시 리차드 스톨만이 몇몇 법률가와 개발자들로부터 의견을 수렴하긴 했었지만, GPL의 개정에 있어 이번과 같은 공식적인 의견수렴절차나 논의가 필요한 것은 아니었다. GPL 2.0이 발표되고 FSF는 곧바로 GNU 프로젝트의 결과물들을 GPL 2.0으로 교체하였으며, 리누스 토발즈도 리눅스커널에 GPL 2.0을 채택하였었다. 하지만 이번의 상황은 그렇지 못했다. GPL은 전세계 수만의 프로젝트에서 사용되고 있었으며, PC․서버 운영체제로부터 휴대폰, PDA, 셋탑박스, 홈네트워킹 장비 등의 임베디드소프트웨어분야에서 광범위하게 사용되고 있었다. 다시 말하면 더 이상 FSF의 GNU프로젝트에서만 사용되는 라이선스가 아니며, 그야말로 자유/오픈소스소프트웨어에 관계된 수많은 기업과 사람들이 지켜야 할 행동규범의 지위를 갖게 된 것이다.

FSF는 지난 수년 동안 자유/오픈소스소프트웨어 커뮤니티, 산업계, 학계 등과 공식적으로 또는 비공식적으로 GPL의 개정에 대해 논의해 왔으며, 이를 바탕으로 마련한 첫번째 안(First Discussion Draft)을 2006년 1월 발표하였다. 초안의 발표와 함께 다양한 의견을 수렴하기 위한 토론위원회 등의 공식적인 프로세스를 만들었다. 이를 바탕으로 인터넷을 통한 의견 수렴, 수차례의 국제 컨퍼런스를 거쳐 2006년 7월에 두번째 안을, 2007년 3월과 5월 각각 세 번째 안과 네 번째 안을 발표하였으며, 지난 2007년 6월 29일 마침내 공식적으로 GPL 3.0을 발표하였다.

GPL 3.0의 전체적인 체계를 보면, 서문을 제외하고 제0조부터 제17조까지 총 18개 조문으로 구성되어 있다. 이중 제4조 내지 제6조, 제8조 내지 제10조, 제12조, 제14조 내지 제17조는 기존의 GPL 2.0의 내용을 적절히 수정해서 재구성한 것이다. 새롭게 추가된 내용으로는 제0조 내지 제1조에서 각종 용어를 새로이 도입하거나 기존의 용어를 수정하였으며, 제3조를 중심으로 DRM과 관련된 내용이 추가되었다. 또한 오픈소스소프트웨어 라이선스의 급격한 증가와 양립성 문제를 완화하고자 제7조에서 GPL에 부가적인 조건을 추가할 수 있도록 규정하고 있다. 아울러 제11조 등은 소프트웨어특허문제, 제13조에서는 Affero GPL과의 양립성문제에 대처하고자 새롭게 추가된 내용이다.

GPL의 개정과정에서 가장 논란이 되었던 내용은 DRM(또는 ‘Tivoization’) 관련 쟁점, 특허권의 취급, 오픈소스라이선스간 양립성, 네트워크서버형태로 GPL 소프트웨어를 이용하는 경우의 처리 등이다. 이 밖에 소스코드의 범위를 명확히 하고, 새로운 용어를 정의하는 등의 수정이 있었다.

5.2 Tivoization과 DRM

미국의 Tivo라는 회사는 케이블방송 또는 위성방송 등의 방송프로그램을 하드디스크에 녹화하거나, 경우에 따라서는 개인 PC나 DVD 등에 저장할 수 있도록 하는 DVR(digital video recorder)제품을 시장에 출시하여 성공하였다. 한편 해당 제품에는 리눅스커널 등 GPL 소프트웨어가 포함되어 있었기 때문에 Tivo는 GPL 2.0의 규정에 따라 관련 소스코드를 이용자들에게 제공하였다. 그런데 일부 이용자들이 해당 소스코드를 수정하여 다시 Tivo의 제품에 포팅하였으나 정상작동하지 않았다. 이는 Tivo사가 이용자들이 해당 제품을 수정하여 사용하는 것을 허용하지 않았기 때문이다.

이상과 같은 Tivo의 정책에 대해 스톨만은 Tivo가 GPL을 악용하고 있다고 주장하였다. GPL의 근본 목적은 이용자들이 해당 소프트웨어를 자유롭게 수정하여 사용할 수 있도록 하는 것임에도 불구하고 Tivo는 이를 막고 있다는 것이다. 스톨만은 이와 같은 GPL의 남용행위를 Tivoization이라고 이름짓고, 이를 방지하기 위해 GPL 3.0에 다음과 같은 2가지 종류의 규정을 마련하였다.

첫 번째는 GPL 코드를 특정한 사용자제품(User Product)에 포함시키거나 혹은 그와 함께 배포하는 경우에는 해당 소스에 설치 정보(Installation Information)를 함께 제공해야 한다는 것이다. 이 때 ‘사용자 제품(User Product)’이란 통상적인 소비자 제품이나 집안에서 쓰일 목적으로 설계되었거나 판매되는 제품을 말하며, ‘설치 정보(Installation Information)'란 소프트웨어를 수정하여 해당 제품에 설치하고 실행하는 데 필요한 방법(methods), 절차(procedures), 인증키(authorization keys) 혹은 여타 정보 모두를 의미한다. 다만 소프트웨어가 ROM에 설치된 경우처럼, 해당제품의 제조업체나 여타 제3자도 수정된 코드를 제품에 설치할 수 없는 경우에는 설치정보를 제공하지 않아도 된다. 또한 사용자가 설치하거나 수정한 저작물 및 해당 제품에 대한 지원서비스나 보증, 업데이트를 계속해서 제공할 필요는 없다. 그리고 사용자의 수정으로 인해 네트워크의 작동에 실질적이고 부정적인 영향을 끼치거나, 네트워크를 통한 통신 규칙 및 프로토콜을 위반하는 경우에는 네트워크에 대한 접속을 거부할 수 있다.

사용자제품에 대한 GPL 3.0의 현행규정은 초안에서의 내용보다는 상당히 완화된 것이다. 개정 과정에서 리누스 토발즈를 포함한 리눅스커널 개발자들은 DRM 기술이 미디어기업들에 의해 남용될 가능성이 있다는 점은 인정하지만, GPL 3.0의 DRM 관련 규정을 적용하게 될 경우 최종이용자에 대한 제한을 포함하는 어떠한 라이선스도 받지 못하는 결과를 초래할 것이라고 주장하였다. 또한 어떠한 행위가 GPL의 남용에 해당하는지를 결정하는 것은 본질적으로 정치적인 문제인데, 정치적인 목적 때문에 FSF가 저작권을 가진 프로그램을 GPL 3.0으로 전환할 경우 FSF 스스로 신뢰를 깨뜨리는 것이라고 주장하였었다. 결국 이와 같은 비판을 어느 정도 수용하여 현행규정으로 수정한 것이다.

Tivo와 관련하여 GPL 3.0에 도입된 두 번째 규정은, DRM과 관련하여 각국의 법률에 의해 보호되는 이익을 포기하도록 한 것이다. DRM은 ”Digital Rights Management"의 약칭으로 콘텐츠 제공자의 권리와 이익을 안전하게 보호하기 위하여 적법한 사용자만 허용된 사용권한에 따라 콘텐츠를 사용하도록 하는 기술이다. 그러나 다른 한편으로 DRM은 이용자의 행위를 제한하는 측면이 있는데, GPL 3.0의 첫 번째 토론안에서는 이와 같은 측면을 강조하여 DRM 관련 규정의 제목을 “Digital Restrictions Management"로 표기했었다. FSF는 미국, 유럽 기타 각국이 DRM 기술을 회피하는 행위에 대해 민사책임을 부과하거나, 심지어 형사처벌을 하도록 하는 법률을 제정하는 것에 대해 비판해 왔다. 아울러 이용자들의 자유를 보호하는 것을 최우선의 목표로 하고 있는 GPL 프로그램이 이와 같은 DRM으로 사용되고 있다는 것에 심각한 우려를 표명하였다. 이와 같은 FSF의 GPL에 대한 반감은, 결국 현행 규정과 같이 GPL 3.0이 적용되는 프로그램을 포함한 DRM은 법적 보호를 받지 못하도록 하는 결과로 나타났다.

5.3 특허권의 취급

오픈소스소프트웨어, 특히 FSF 등 자유소프트웨어(Free Software)진영이 소프트웨어특허에 대해 가지는 시각은 GPL 서문에 잘 나타나 있다. 이에 따르면 현재 소프트웨어특허로 인하여 자유소프트웨어가 끊임없이 위협을 받고 있는 상황이며, 만약 자유소프트웨어의 배포자들이 개별적으로 특허를 취득하는 경우 해당 프로그램이 사유(proprietary)소프트웨어가 될 가능성이 있으므로, FSF는 이러한 문제에 대처하기 위해서 GPL 조건의 소프트웨어를 이용하는 모든 사람들이 무료로 자유롭게 사용할 수 있는 특허만을 자유소프트웨어에 포함시키고자 한다는 것이다. 이와 같은 기본인식에도 불구하고 GPL 2.0에는 특허권에 관한 내용이 짧게 언급되어 있을 뿐인데, 비록 자유소프트웨어진영이 소프트웨어특허에 대해 반대하고 있긴 하지만, 소프트웨어특허의 인정여부는 결국 각국의 입법 또는 법해석에 관한 문제이다. 따라서 GPL의 차원에서는 GPL 조건의 소프트웨어에 관련 특허가 부여되었거나 앞으로 부여될 수 있다는 현실을 받아들일 수밖에 없다. 특허권에 관한 GPL 2.0에서의 내용을 요약하면, 첫째, 특허권자 자신이 특허기술을 구현한 소프트웨어를 GPL로 배포하였다면, GPL 서문이나 제7조의 해석상, GPL 조건을 준수하면서 해당 소프트웨어를 사용하는 이용자에게는 특허권을 주장하지 않겠다는 서약을 한 것으로, 또는 특허라이선스를 묵시적으로 허락한 것으로 해석할 수 있다. 둘째, 소프트웨어에 제3자의 특허기술이 포함된 경우, 특허권자가 모든 GPL 이용자에게 무상의 라이선스를 제공하는 경우에만 해당 소프트웨어를 GPL로 배포할 수 있다. 다시 말해 프로그램의 복제물을 제공받은 임의의 제3자가 해당 프로그램을 무상으로(royalty-free) 사용하거나 재배포할 수 없는 경우, 해당 소프트웨어를 GPL로 배포하는 것은 불가능하다.

1980년대 이후 미국을 중심으로 소프트웨어를 특허권에 의해 보호하려는 경향이 높아졌으며, 특히 1990년대 후반부터 소프트웨어관련 특허권의 수가 급격히 증가하였다. 그에 따라 GPL 2.0의 한계를 지적하고 소프트웨어 특허에 대한 대책이 필요하다는 요구가 오픈소스소프트웨어 커뮤니티 내부에서 꾸준히 제기되었다. 이와 같은 문제제기는 GPL 3.0으로의 개정과정에서 다양한 논의로 연결되었으며, 가장 많은 논쟁과 수정안의 제출로 이러졌다. GPL 3.0에서의 특허권에 관한 논의와 주요내용은 ⅰ) 라이선서 등 전방(upstream)의 특허권, ⅱ) 라이선시 등 후방(downstream)의 특허권, 기타 ⅲ) 제3자가 가지는 특허권의 경우로 나누어 볼 수 있다.

첫째, 라이선서 등이 특허권에 의한 소송을 제기할 수 있는 위험과 관련하여, GPL 2.0에서는 명시적 규정을 두고 있지는 않았지만 제7조 등의 해석상 라이선서가 자신이 가지는 특허권을 ‘묵시적으로’ 허락하는 것으로 해석할 수 있음은 앞에서 본 바와 같다. 하지만 미국법상으로는 이러한 해석이 가능하지만, 모든 국가가 그와 같지는 않을 것이라는 의견이 있었다. 이러한 문제제기를 받아들여 GPL 3.0은 기여자(Contributor)의 경우 자신이 기여한 부분(Contributor Version)에 대해서는, 비차별적이고 무료인 (non-exclusive and free royalty) 특허 라이선스를 허락하는 것으로 규정하였다.

개정과정에서 이와 관련하여 가장 쟁점이 되었던 부분은, 개발자 및 기여자이외에 GPL 프로그램의 단순한 재배포자(distributor)도 동 규정의 범위에 포함시킬 것인가의 여부에 관한 것이었다. 두 번째 안에서는 단순 배포자도 무료의 특허라이선스를 허락하는 것으로 명시적으로 규정했었다. 하지만 이에 대해 특히 대규모 특허 포트폴리오를 가진 일부 기업들이 자사가 가진 소프트웨어특허 포트폴리오 전체에 대한 권리를 상실할 가능성이 있다는 문제점을 지적하였다. 이와 같은 의견이 일부 반영되어 세 번째 토론안부터는 현재와 같이 기여자만 특허라이선스를 허락하는 것으로 규정하고 단순 배포자는 제외되었다.
두 번째는 라이선시 등으로부터 특허소송이 제기되는 경우인데, 이와 같은 경우를 다루고 있는 라이선스 조항을 통상 특허보복(Patent Retaliation)조항이라고도 한다. 예컨대 애플의 경우, Apple Public Source License에 의해 배포되는 프로그램을 사용하는 이용자가, 애플이 먼저 특허소송을 제기하지 않았음에도, 애플에 대해 특허소송을 제기하는 경우에는 아무런 통지 없이 라이선스가 자동으로 종료된다. 이와는 달리 Apache License 2.0의 경우는, 상대방에 대한 반소제기 등 방어의 목적인지 여부와 상관없이, 아파치라이선스 프로그램을 사용하는 어떠한 이용자에 대해서 특허소송을 제기하는 경우, 소송을 제기한 날에 해당 라이선스가 종료하는 것으로 규정하고 있다.

이와 같은 특허보복조항의 필요성은 브루스 페렌스 등을 중심으로 오픈소스커뮤니티 내부에서 일찍부터 제기되었었다. 하지만 스톨만 등은 특허보복조항의 실효성에 의문을 제기하였으며, GPL 3.0의 두 번째 안에서는, 네트워크서버형태의 이용자에 대한 제한적인 보복조항을 도입하고, 일반적인 보복조항은 이용자들의 선택사항의 하나로 규정하는데 그쳤다. 그런데 이용자들의 선택사항을 규정한 조항(제7조)에 대한 배포판업체들의 비판, Apache License 2.0과의 양립성 등을 고려하여, 세 번째 안부터는 이용자들의 특허침해소송을 제10조 후단의 추가적인 제한(further restrictions)으로 규정함으로써, 일반적인 특허보복조항을 도입하는 것으로 결론내렸다.

세 번째는 라이선서와 라이선시의 관계에 있지 않는 제3자가 특허권을 소유하고 있는 경우이다. 이와 같은 경우 라이선스규정을 통해 해결할 수 있는 문제는 별로 없으며, 소프트웨어 특허에 관한 정책 또는 법해석의 문제로 귀결된다. 그래서 FSF는 GPL 2.0에서와 같이 GPL 3.0에서도 서문(Preamble)을 통해 소프트웨어 특허의 위험성을 지적하고 각국이 소프트웨어 특허의 부여를 제한할 것을 주장하고 있다. 또한 GPL 2.0 제7조의 규정을 제12조에 그대로 위치시키면서, 모든 이용자가 GPL의 조건에 따라 프로그램을 이용할 수 있도록 하는 것이 불가능할 경우에는 제3자의 특허권을 구현한 프로그램을 GPL로 배포할 수 없도록 하고 있다. 그런데 GPL 2.0의 특허규정을 엄격하게 요구하는 것은 현실적으로 어려움이 있다. 예를 들어 리눅스커널의 경우 (특정업체의 조사결과에 따르면) 미국특허 수백개가 관련되어 있는데, 각각의 특허에 대해 무료 라이선스를 취득하는 것은 불가능에 가깝다고 볼 수 있다. 특히 수백개의 GPL 프로그램들을 배포하는 GNU/리눅스 배포판업체들의 경우에는 더더욱 그러하다고 볼 수 있다. 이와 같은 현실적인 어려움을 받아들여 GPL 3.0은, 배포자가 제3자의 특허가 포함되어 있다는 사실을 알더라도, ⅰ) 공중이 이용가능한 네트워크 서버 등을 통해 무료로 관련 소스코드를 복제할 수 있도록 하거나, ⅱ) 해당 프로그램에 대하여, 본인에게 주어진 특허라이선스의 혜택을 스스로 박탈하거나, ⅲ) GPL의 요구사항에 부합하는 특허라이선스를 후방 이용자(downstream users)에게도 허락하는 경우에는, 제3자의 특허가 포함된 GPL 프로그램을 배포할 수 있다.

한편 개정과정의 후반부에서 가장 이슈가 되었던 사항은 MS와 노벨의 특허관련 협약의 체결과, 이와 같은 협약을 막기 위한 조항을 GPL에 도입하는 것이었다. MS는 최근 들어 계속해서 리눅스를 비롯한 오픈소스소프트웨어가 자사의 특허권들을 침해하고 있다고 주장하고 있다. 하지만 현실적으로 다수의 오픈소스소프트웨어관련 기업들을 상대로 소송을 제기하는 것이 쉽지 않으며, 여론도 무시할 수 없는 상황이다. 결국 노벨 등 일부 이해관계가 맞는 기업들을 중심으로 협약을 체결하는 형태로 오픈소스커뮤니티에서 자사의 특허를 인정(?)받고자 노력하고 있다. 이에 대해 스톨만은 MS의 이와 같은 차별적인(discriminatory) 특허라이선스가 부당하다고 판단하고 이를 막기 위한 조항을 규정을 마련하였다. 핵심 내용은 GPL 프로그램과 관련하여 특정인에게 특허라이선스를 허락하는 경우 후방 라이선시들에게도 특허라이선스가 자동적으로 주어진다는 것과, 차별적인 특허라이선스를 체결하는 경우 GPL 프로그램을 배포할 수 없도록 하는 것이다. 그러나 동 조항이 구체적으로 어떠한 의미를 지니는지, 차별적 특허라이선스협정과 포괄적인 크로스라이선스협정의 구별기준이 무엇인지 등 많은 의문이 제기되고 있으며, FSF(또는 소프트웨어자유법센터:SFLC)는 이에 관한 명확한 답변을 하지 못하고 있다. 동 조항이 GPL 3.0에 포함된 이후 삼성전자와 LG전자가 각각 MS와 특허크로스라이선스협정을 체결했다. 국내 기업들의 이와 같은 협정들이 GPL 3.0에서 금지하고 있는 협정에 해당하는지의 여부에 대한 분석도 필요한 시점이다.

5.4 라이선스의 양립성 : Apache, Affero GPL

소프트웨어를 작성하고자 할 경우 기존에 만들어진 코드를 재사용하거나 결합하는 경우가 많은데, 결합되는 각 코드의 라이선스가 상호 상충되는 경우가 있다. 예컨대 MPL 조건의 A코드와 GPL 조건의 B코드를 결합하여 ‘A+B’라는 프로그램을 만들어 배포하고자 하는 경우, MPL은 ‘A+B’의 A부분을 MPL로 배포할 것을 요구하는 반면, GPL은 ‘A+B’ 전체를 GPL로 배포할 것을 요구하기 때문에, 두 라이선스의 요구조건을 모두 충족하면서 ‘A+B’프로그램을 배포하는 것은 불가능하다. 이러한 문제를 가리켜 라이선스의 양립성(Compatibility) 문제라고 한다. 따라서 어떤 오픈소스 소프트웨어에 다른 오픈소스 소프트웨어를 섞을 경우 반드시 두개의 라이선스가 서로 양립하는지를 확인하여야 한다. 양립성문제는 오픈소스소프트웨어 진영에 심각한 문제점을 제기하였으며, 이를 해결하기 위한 노력도 다양하게 진행되고 있다. 예를 들어 모질라 프로젝트(Mozilla.org)에서는 프로젝트의 결과물을 MPL, GPL, LGPL의 3가지(triple) 라이선스로 배포하는 라이선스 정책을 채택하여, 라이선스의 양립성과 관련된 불확실성을 제거하고 모질라 코드를 GPL 또는 LGPL 기반의 응용프로그램에 사용할 수 있도록 하였다. Trolltech도 Qt 라이브러리에 대한 오픈소스소프트웨어라이선스인 QPL과 GPL의 양립성 문제를 해결하기 위하여 QPL 및 상용라이선스 이외에 GPL을 추가하는 정책을 취하고 있다.

오픈소스 라이선스의 양립성문제는 주로 GPL 조건의 엄격성 때문에 나타난다. GPL 3.0의 초기버전에서는 이러한 양립성 문제를 해결하기 위해 이용자들이 추가적인 제한/허용 조건을 선택할 수 있도록 폭넓게 규정했었다. 예를 들어 특허보복조항의 포함여부, 네트워크서버형태로 이용하는 경우 소스코드를 제공하게 할 것인지의 여부 등을 개별적으로 선택할 수 있도록 하였다. 그러나 GNU/리눅스 배포판업체들은 오픈소스소프트웨어 라이선스들의 증가와 그에 따른 양립성문제는 인정하지만, 추가적인 제한/허용 규정에 의해 수많은 프로그램들이 서로 다른 GPL 조건들을 가질 경우, 라이선싱과 관련된 문제들이 더욱 복잡하게 될 것이라고 주장하였다. 이러한 비판을 어느 정도 수용하여 현행규정은 앞에서 살펴본 것처럼 특허보복조항을 제10조에 포함시키고, 네트워크서버형태의 이용과 관련해서는 제14조를 별도로 만드는 등 보다 단순화하였다. 또한 이러한 조치를 통해 GPL 3.0은 Apache License 2.0과 양립가능하며, 네트워크서버형태로 이용하는 경우에도 소스코드를 제공하도록 요구하는 Affero GPL 3.0(안)과도 양립가능하게 되었다.

5.5 기타 주요 개정내용

5.5.1 용어의 정리

일반적으로 하나의 라이선스가 전세계적으로 동일하게 사용되는 경우는 드물다. 라이선서(licensor)가 시장을 지역적으로 구분하고자 하는 전략적인 이유도 있겠지만, 각국마다 저작권법 등의 법제도가 상이하기 때문이다. 그래서 라이선서는 각국에 적합한 라이선스를 따로 만들어서 배포하게 된다. GPL 2.0은 일반적인 상용라이선스와는 다르긴 하지만, 어디까지나 미국의 법체계를 기반으로 만들어진 것이 틀림없다. 사용되는 용어에서나 워런티, 책임의 제한 등에 관한 내용이 이를 잘 말해주고 있다. 그렇지만 오픈소스소프트웨어가 전세계적으로 사용되고 있는 현재, GPL이 미국이외의 지역에서 하나의 라이선스로 사용되기 위한 변화가 필요하다. 이를 반영하여 GPL 3.0에서는 용어를 새롭게 정의하거나 추가하고 있다. 특히 중요한 용어로는 “propagate"와 ”convey"이다. 어떤 저작물을 “프로퍼게이트(propagate)”하는 것은, 저작권자의 허가를 받지 않고 어떠한 행위를 하는 경우 저작권을 위반하게 되는 모든 행위를 의미한다. 예를 들어 저작물을 복제, 배포, 전시하는 등의 행위를 포함한다. 다만 하나의 컴퓨터에서 단순 실행하거나 개인적으로 복제 또는 수정하는 것은 제외한다. 두 번째로 저작물을 “컨베이(convey)”하는 것은 제3자가 복사본을 제작하거나 받을 수 있도록 가능케 해주는 모든 종류의 프로퍼게이트 행위를 의미한다. GPL 2.0의 배포(distribution)에 해당하는 개념인데, 각국의 저작권법에서 배포의 범위가 다르고, 일부 지역에서는 ”공중에의 전달(communicating to the public)" 등 다른 표현을 사용하는 등 혼동을 가져올 수 있기 때문에 새롭게 정의하게 된 것이다. 다만 컴퓨터 네트워크를 통해 사용자와 상호작용하는 것은 컨베이가 아니다.

5.5.2 소스코드 제공범위

오픈소스 라이선스 중에서 GPL/LGPL/MPL 등은 수정한 내용에 대한 소스코드를 공개하여야 하고 BSD/Apache License 등은 수정하더라도 소스코드를 공개할 의무가 발생하지 않는다. GPL/LGPL/MPL 등 소스코드 공개 의무가 발생하는 라이선스를 상호주의(reciprocal) 혹은 copyleft 라이선스라고 하며, 그 결과물이 원 소프트웨어의 2차적저작물(derivative work)일 경우 소스코드를 공개해야 한다. 그런데 소스코드의 공개범위를 기계적으로 판단할 수 있는 방법은 없으며 라이선스마다 서로 다르게 정의하고 있으므로 잘 판단하여야 한다. 특히 GPL과 관련하여 구체적으로 어떠한 경우가 2차적저작물에 해당하는지, 또는 독립된 프로그램에 해당하는지를 구별하는 것은 쉽지 않다. 결국 최종적으로는 법원의 판단에 의해 결정될 문제인데, FSF는 GPL FAQ에서 몇 가지의 구별기준을 제시하여 왔었다. 예를 들어 두개의 모듈이 동일한 실행파일에 포함되어 있거나 공유주소영역(shared address space)에서 링크되어 실행되도록 설계된 경우에는 전자에 포함되고, 2개의 프로그램이 파이프(pipes), 소켓(sockets), command-line arguments 형태로 통신하는 경우에는 후자에 해당한다.

GPL 3.0에서는 소스코드의 공개범위와 관련하여 좀더 상세한 규정을 마련하였다. 동 규정에 의하여 공개할 범위에 포함되는 “해당 소스(Corresponding Source)”란, 목적코드를 생성, 설치, 그리고 (실행 가능한 작업물의 경우) 구동하고, 그 작업물을 수정하는데 필요한 모든 소스코드를 의미하며, 그 활동들을 제어하는 스크립트를 포함한다. 예를 들어 소스 파일과 연관된 인터페이스 정의 파일을 포함하고, 또한 프로그램의 다른 부분들과 그 서브프로그램 사이의 제어 흐름이나 밀접한 데이터 통신 등을 통해 프로그램이 특별히 필요로 하는, 동적 링크된 하위프로그램과 공용 라이브러리의 소스코드를 포함한다. 다만 프로그램의 시스템 라이브러리와 범용적인 툴 등은 포함하지 않는다. (KLDP 위키 번역 참조).

'기본 카테고리' 카테고리의 다른 글

Mysql-Connector-NET 한글  (0) 2009.01.22
u100에 해킨토시 설치하기  (0) 2009.01.18
IBM의 극적인 탈출  (0) 2009.01.11
CPU 성능분석  (0) 2008.12.24
[XML 실전 프로그래밍]  (0) 2008.12.13

돈 새는 구멍은 무조건 막아라 [조인스]

IBM의 극적인 탈출
거스너 회장의 빠르고 파격적인 구조조정…브랜드 이미지 획기적 개선
위기의 순간, 대반전 ①

이코노미스트 기업 회생 스토리에는 한 가지 공통점이 있다. 최악의 순간에서 과감한 조치들이 신속하게 취해졌다는 사실이다. 생존의 마지막 기회를 놓치지 않는 것, 그것이 바로 ‘지옥에서 천당으로’의 대역전을 만들어 내는 비결이다. 어영부영하다가는 끝장이다. 이코노미스트는 국내외 기업들이 절체절명의 위기에서 극적으로 회생한 그 순간을 포착해 당시 상황을 재구성한 ‘위기의 순간, 대반전’을 연재한다.

관련사진

샘 팔미사노 현 IBM 회장(왼쪽)과 루이스 거스너 전 IBM 회장.

주주총회가 열리는 플로리다로 가는 비행기에 몸을 실은 루이스 거스너 IBM 회장은 초조했다. 1993년 4월은 그의 인생에서 가장 잔인한 달이었다. 그때까지 IBM은 아홉 분기 연속 적자를 내고 있었고, 한때 170달러를 돌파했던 주가는 48달러로 곤두박질해 있었다.

성난 주주들은 신임 회장을 혼내주겠다고 벼르며 플로리다로 속속 모여들고 있었다. 주주처럼 보이는 한 사람이 장내로 뛰어들었다. 그의 손에 들려 있는 포스터에는 이런 문구가 적혀있었다. ‘난 IBM에 속아 왔다!’주총에서 돌아와 책상 앞에 앉아 머리를 쥐어뜯으며 한참을 고민하던 거스너가 외쳤다.

“세상을 바라보는 장소로 책상만큼 나쁜 곳은 없다.” 그는 달력에 빼곡하게 스케줄을 써 넣은 다음 자리를 박차고 밖으로 나갔다.

토론해봐야 뾰족한 수 없을 걸

CFO인 제롬 요크도 전 세계 사업장을 돌아다녔다. 두 달 내내 발품을 판 요크는 거스너에게 충격적인 보고를 했다. 55%에 달하던 영업이익이 45%로 떨어져 있었다. 이유는 더 기가 막혔다. 영업비용이 경쟁사보다 11%나 더 지출되고 있었던 것이다. 거스너와 요크는 즉각 11개 분야에 걸쳐 30개가 넘는 비용 절감 프로젝트를 추진했다.

거스너는 이 프로젝트에 전 직원이 동참하라고 소리쳤다. 지시를 무시하거나 소극적인 태도를 보이면 누구라도 해고하겠다고 엄포를 놓았다. 해당 부서원들이 얼마나 비용을 쓰고 있는지 발표하는 동안 요크는 열심히 계산기를 두드렸다. 심지어 그 자리에서 비용 절감 방안을 내놓고 해당 부서로부터 그대로 실행하겠다는 약속을 받아내기도 했다.

볼멘소리를 하는 부서장들도 있었지만, 거스너는 “3년 안에 최대 70억 달러의 비용을 줄여야 한다”며 그들의 입을 막았다. 거스너는 ‘토론은 얼마든지 하라. 그러나 아마도 이것 말고 다른 대안은 없을 것’이라는 식으로 밀어붙였다. 거스너는 나락으로 떨어진 주가를 다시 끌어올리려면 회사를 월 스트리트 기준으로 운영해야 한다고 생각했다.

우선 임원들의 출퇴근 시간부터 뜯어고쳤다. 그때까지 IBM은 오전 9시 출근 오후 5시 퇴근이었는데, 이것은 거스너가 보기에 월 스트리트의 패턴과는 전혀 맞지 않았다. 거스너는 자신은 물론 이사들의 시간표부터 바꾸었다. 그들은 이르면 새벽 5시에라도 나와 신문을 보고, 해외지사에서 들어오는 정보들을 샅샅이 훑어보며 9시 반 뉴욕증시가 개장될 때까지 신경을 곤두세웠다.

거스너는 미국에서만 4만 명, 해외지사에서 3만5000명을 내보내기로 이사진과 합의했다. 그것은 IBM의 전통 같은 ‘종신고용 원칙’을 폐기하는 선언이나 다름없었다. 엄청난 규모에 비해 결단은 빨랐다. 전임 회장 에이커스처럼 단계적인 감원이 아니라 일시에 이루어졌기에 충격이 컸다.

당시 거스너는 이렇게 위로(?)했다. “한 번 크게 얻어맞는 것이 계속 이마에 물방울이 떨어지는 고문보다 덜 고통스럽다.” 위로를 했는지 모르지만 위로금은 후하지 못했다. 고작 26주치 월급과 6개월치 의료보험료를 떠나는 직원의 손에 쥐어줬을 뿐이다.
에이커스가 2년치 월급을 주었던 것에 비하면 인색하기 짝이 없었다.

물론 거스너는 에이커스의 그런 지나치게 후한 위로금이 IBM에 재앙을 가져왔다고 여기고 있었다. 너무나 빠른 속도로 이뤄진 감축이라 쫓겨나는 직원들은 고통을 느낄 겨를도 없었다. 임신 8개월의 한 여직원은 코카콜라 애틀랜타지사를 고객으로 유치한 성과로 포상금을 받은 지 5일 만에 해고됐는가 하면, 심지어 병원에 입원한 어느 직원은 뇌종양으로 혼수상태에 빠져 해고통지서를 읽지도 못했다.

남은 직원들도 당황하기는 마찬가지였다. 임금인상은 억제되고 이전의 풍족했던 복리후생비는 기대할 수 없었다. 한 순간에 IBM은 자신들이 알던 IBM이 아니었다. 떠난, 혹은 남은 직원들에게 거스너는 저승사자처럼 보였겠지만 거스너의 눈엔 이전의 IBM이 지옥으로 가는 줄도 모를 만큼 자만했던 것으로 보였다.

거스너와 요크는 효율이 떨어지는 곳을 색출해 냈다. 내부거래 시스템이 딱 걸렸다. 고객서비스 부서가 부품부서에서 부품을 구입하는데 그 구입가를 매번 협상하는 식이다. 회사 전체 손익에 아무런 영향도 주지 않는 불필요한 협상을 하느라 시간과 비용만 낭비하고 있었다.

더 큰 문제는 지사별 실적이 왜곡되고 있는 것이었다. 예컨대 IBM 일본지사가 현지 판매에서 적자를 보았을 경우, 생산한 부품을 본사에 비싼 값에 떠넘겨 손익을 맞추는 식이다. 요크는 이런 말도 안 되는 회계 시스템을 즉각 수정했다. 당시 요크는 “실적을 못 내는 지사나 사업 부문은 그만큼 월급도 줄어들 것”이라고 경고했다.

한 번 크게 얻어맞는 게 낫다

거스너와 요크는 해외지사를 완전히 통제하지 못하고 있음을 실감했다. 심지어 보고조차 제대로 받지 못하고 있었다. 4주마다 보고해야 할 손익대조표가 6주가 지나도 도착하지 않았다. 2주는 손익이 뒤바뀌기에 충분한 시간이다. 화가 난 요크는 아무리 사소한 물건을 구매하더라도 회계부서에 다 보고하도록 했다.

거스너는 마케팅 혁신을 위해 리처드 토먼을 퍼스널 시스템스 그룹 책임자로 영입했다. 토먼은 컴퓨터는 잘 몰랐지만, 탁월한 기업 투시력으로 얼마나 인력과 비용이 낭비되는지를 간파했다. 그는 부서통합을 추진했다. 예컨대 PC사업 부문에만 여섯 개의 연구소가 있었는데 중복되는 연구로 낭비되는 돈이 매년 수백만 달러에 달했다.

토먼은 미국과 전 세계에 흩어져 있는 연구소를 하나로 통합했다. 이어 토먼은 ‘싱크패드’라는 브랜드만 남기고 모든 PC 사업을 정리했다. 소비자가 잘 외우지도 못하고, 심지어 자동차 모델명이 아니냐는 소리까지 듣는 PS/1, 앰브러, PC300 같은 브랜드를 모두 시장에서 철수시켰다.

오스틴 사업장에서 올라온 빌 애밀리오는 PC 사업조직 재정비를 추진했다. 애밀리오는 3500개에 달하는 PC 사업 부문의 모든 제품을 깨알같이 적어놓은 홍보책자부터 전부 폐기시켰다. 거스너는 IBM에서만 30년을 근무하고 은퇴한 샘 앨버트를 만났다. 난국을 타개할 아이디어를 구하기 위해서였다. 앨버트가 말했다.

“IBM은 컴퓨터가 처음 세상에 나왔을 때 쓰던 용어를 아직도 그대로 사용한다. 그것은 최첨단 기계의 성능을 마력으로 표시하는 것처럼 어색한 일이다.”

거스너는 깨달음을 얻었다. 자신도 얼마 전, 연구소를 시찰하다가 한 연구원이 알아듣지도 못하는 전문용어로 한참을 설명하는 것을 예의상 듣고 왔던 터였다. 앨버트의 지적은 결국 IBM이 자만에 빠져 시대에 뒤떨어지고 고객으로부터도 멀어지고 있다는 것이었다. 거스너는 지사를 돌며 고객들과도 대화를 나누었다. 문제는 심각했다.

IBM의 영업자들은 많았지만, 정작 고객에게 신제품을 제대로 설명할 수 있는 영업자는 그리 많지 않았다. 심지어 고객으로부터 “HP나 컴팩은 제품 흥정에서 설치까지 2주면 충분하지만 IBM은 두 달 안에 담당자와 통화만 해도 아주 운이 좋은 것”이라는 치욕적인 얘기까지 들어야 했다.

거스너는 각 사업장에 “한 달 안에 우수 고객이라고 할 만한 사람들의 명단을 작성해 가져오라”고 지시했다. 유럽의 지사들로부터 시간이 촉박하다는 답변이 들어오자 진노하며 “기한까지 내 책상에 명단을 가져오지 못하는 사람들에겐 더 이상 일을 시키지 않겠다”고 엄포를 놓았다.

거스너는 취임하자마자 이사진을 교체했다. 당시 이사들 중에는 전임 회장 에이커스와의 친분으로 뽑은 사람과 다른 회사 CEO로 있다가 은퇴 후 온 이들이 여럿 있었는데 대부분 IBM이 추구해야 할 첨단 기술과는 거리가 먼 사람들이었다. 거스너는 전문성을 갖춘 새 이사진에게 비(非)핵심 사업 부문을 솎아내도록 했다.

이사진은 금융 자회사인 IBM 크레디트 코퍼레이션을 우선 지목했다. 고객이 하드웨어 장비를 할부로 구입할 수 있도록 지원하는 자회사인데 가뜩이나 좋지 못한 자금 흐름을 악화시키는 주범이었다. 하지만 거스너는 이를 살려두기로 했다. 나중에 IBM이 대형 고객을 유치할 때는 매우 중요한 역할을 할 것이란 가능성을 보았기 때문이다.

대신 방위사업 자회사인 페더럴 시스템스 컴퍼니는 매각을 결정했다. 이 회사는 미 연방항공국으로 25억 달러에 달하는 시스템 업그레이드 작업을 수주해 놓은 상태였지만 IBM의 장기적 성장 관점에서 비 핵심사업으로 분류한 것이다. 오히려 당시 높은 값을 받을 수 있었기에 서둘러 팔아치웠다.

거스너는 이처럼 장기적으로 IBM의 성장에 도움이 되는 사업들로 구조조정의 가닥을 잡았다. 거스너는 IBM의 브랜드 이미지가 실추되고 조롱당하고 있는 것을 참을 수 없었다. 거스너는 애비 컨스탬을 부사장으로 임명하고 전 세계에서 진행되던 광고를 혁신하라고 지시했다. 컨스탬은 특단의 해결책을 제안했다.

각각의 제품에 대한 광고를 수십 개의 광고대행사에 맡겼던 것을 하나의 광고대행사에 전담시키는 것이었다. 그것은 광고업계를 흥분시키기에 충분했다. 컨스탬은 IBM의 모든 광고를 도맡아 줄 대행사를 조용히 수소문했지만, 이미 내로라하는 광고대행사들은 이미 수 주 전에 돌입해 있었다. 결국 마이크로소프트의 광고를 맡고 있던 오길비 앤 매더가 낙점됐다.

무엇을 남기고, 무엇을 버릴까

오길비는 마이크로소프트와 계약을 파기해야만 했다. 경쟁사 광고를 맡을 수 없도록 돼 있었기 때문이다. 오길비가 잘나가는 마이크로소프트를 포기하고 추락한 IBM을 선택한 이유는 5억 달러라는 엄청난 수주 금액 때문이다. 실제로 ‘뉴욕타임스’ 1면에 ‘광고업계 최대 계약’이란 제목의 기사가 실렸다.

오길비의 북미지역 총괄책임자인 셸리 레저러스가 빌 게이츠를 만나 “더 이상 마이크로소프트의 일을 할 수 없을 것 같다”고 말했다. 빌 게이츠는 “혹시 우리 회사와 무슨 문제가 있었느냐”고 아무렇지도 않은 듯 반문했지만, 그것은 ‘IBM 같은 회사의 일을 하기 위해 마이크로소프트를 버리느냐’는 의아함을 표시한 것이었다.

빌 게이츠가 불쾌했던 만큼 거스너에겐 통쾌한 일이었다. 그리고 그것은 광고를 한 대행사에 몰아주겠다는 파격적인 아이디어가 없었다면 불가능했던 일이다. 광고 제작에 앞서 시장조사를 한 결과 IBM의 이미지는 우려했던 것보다 훨씬 나빴다. 심지어 조사기관에서 “응답자들의 IBM에 대한 반감이 너무나 커 조사를 더 이상 진행하기 힘들다”는 얘기까지 나올 지경이었다.

그럴수록 국면을 확실하게 바꾸어 줄 파격적인 광고가 절실했다. 거스너가 정해둔 마감시간이 다가오는데도 이렇다 할 대안을 못 내놓던 오길비는 한 가지 결론에 도달한다. IBM의 인지도 자체가 아닌 ‘IBM이 변하고 있다’는 사실을 전달하자는 것이었다. 수녀들을 등장시켜 영어가 아닌 체코어로 IBM PC를 소개하는 파격적인 CF는 바로 그렇게 탄생한 것이다.

이 CF가 완성되는 과정에서 특히 광고 마지막 부분에 들어간 문구는 이전의 ‘잘난 체하고 오만한’ IBM의 이미지를 개선하는 데 결정적인 역할을 했다. 처음엔 ‘컴퓨터로 세계가 좁아지고 있는 시대에 컴퓨터 사용자들이 겪는 고통을 해결해 주는 기업이 되겠다’는 의미를 담아 ‘작은 세상, 그 해답’이라는 문구를 광고에 덧붙였다.

그것을 거스너가 ‘세상의 해답’으로 최종 수정해 내보냈다. 기술이 뛰어나다 자랑하는 것이 아니라 문제를 해결하기 위해 겸허한 기업정신으로 일한다는 느낌을 주었다는 평가를 받았다. 극적으로 탈출에 성공한 IBM은 4년 후인 1997년 미국 내에서 매출액 기준 6위에 랭크됐고, 주가는 사상 최고치인 177달러를 넘어서기도 했다.

숫자로 본 IBM 위기탈출 순간
48달러 = 한때 170달러를 돌파했던 IBM 주가는 1993년 4월 주총 당시 48달러로 폭락했다.
2300명 = 주주총회장엔 평소의 3배가 넘는 주주들이 무능한 경영진을 벼르고 있었다.
45% = 55%에 달하던 전 세계 IBM 사업장의 영업이익률은 무려 10%나 빠져 있었다.
11% = 영업비용이 통제되지 않아 경쟁사보다 11%나 과다지출되고 있었다.
30개 = 거스너 회장은 11개 분야에 걸쳐 30개가 넘는 비용절감 프로젝트를 즉각 추진했다.
70억 달러 = 3년 내 70억 달러의 비용을 절감한다는 목표를 잡았다.
5시 = 거스너는 오전 9시 출근하던 임원들을 새벽 5시에 출근하도록 했다.
8만 명 = 미국 내 4만~5만 명, 해외 사업장 3만5000명 이상을 정리해고하기로 했다.
26주치 = 2년치 월급을 주던 퇴직 위로금을 26주치로 삭감해 지급했다.
6개월 = 직원 업무평가 등급을 상·중·하로 나눠 ‘하’를 받은 직원은 6개월 정직에 처했다.
20일 = 전 세계 사업장에 20일 내에 우수고객명단을 작성해 제출토록 했다.
5억 달러 = 전 세계 수십 개 광고대행사에 맡겼던 광고를 오길비에 몰아줘 경쟁사 MS를 따돌렸다.
플러스 3억8200만 달러 = 92년 4분기 54억 달러의 적자를 냈던 IBM이 93년 4분기에 흑자로 돌아섰다.


이임광 기업전문기자·llkhkb@yahoo.co.kr

+ Recent posts