바이너리의 단점

마지막 업데이트: 2022년 6월 14일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
첫번째는 BinaryFormatter 로 객체를 바이너리 형식으로 직렬화/역직렬화 해줍니다. 두번째는 SoapFormatter 로 객체를 XML 포맷으로 SOAP 형식으로 직렬화/역직렬화 해줍니다. 객체 직렬화 과정은 내부적으로 상당히 복잡한 과정을 거치지만, 자동으로 내부적으로 해주므로 규칙만 익히면 됩니다.

라이브러리

라이브러리(library)란 다른 프로그램에 링크되어 특정한 기능을 수행하도록 작성된 하나의 프로그램 코드 파일이다. 모듈(module) 또는 컴포넌트(component)보다 기능이 단순하고, 파일 사이즈가 작다.

개요 [ 편집 ]

소스코드를 작성하다보면 자주 사용되는 로직이 있다. 그럼 이 로직을 재사용할 수 있다면 좀 더 효율적인 개발이 가능한데, 재사용이 가능하도록 만든 로직을 라이브러리(library)라고 생각하면 된다. 라이브러리는 자기 자신이 사용하기위해 직접 만들 수 있고, 불특정 다수가 사용할 수 있도록 공개할 수 있다. 라이브러리를 사용하면 필요한 로직을 직접 구현할 필요가 없기 때문에 개발기간을 단축할 수 있을 뿐더러 라이브러리에서 제공하는 API를 호출하는 것을 통해 원하는 기능을 사용할 수 있게된다. [1]

목적 [ 편집 ]

라이브러리(library)는 소스코드 재사용을 위해 조직화된 초기 방법 중의 하나이며 많은 다른 프로그램들에서 사용할 수 있도록 운영체계나 소프트웨어 개발 환경 제공자들에 의해 제공되는 경우가 많다. 라이브러리는 사용자의 프로그램과 링크되어 실행이 가능한 완전한 프로그램을 이룬다. 또한 라이브러리 내에 있는 루틴들은 범용적으로 사용 가능하며, 3차원 애니메이션 그래픽과 같은 특별한 용도의 함수로도 설계될 수 있다. [2]

구분 [ 편집 ]

정적 라이브러리(static library) [ 편집 ]

정적 라이브러리(static library)는 프로그램 빌드시에 라이브러리가 제공하는 코드를 실행 파일에 넣는 방식의 라이브러리이다. 컴파일의 링킹 단계에서 실행파일에 결합되는데, 라이브러리(.lib파일)를 실행 바이너리에 포함시킨다는 의미이다. 즉, 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업없이 독립적으로 라이브러리 함수들을 사용할 수 있다. 정적 라이브러리를 사용하게 되면 컴파일시 링커가 프로그램이 필요한 부분을 라이브러리에서 찾아 실행파일에 바로 복사한다. 실행파일에 모두 포함되기 때문에 실행시에 라이브러리가 필요없다. [3]

장단점 [ 편집 ]

정적 라이브러리는 첫째, 동적 라이브러리에 비해 속도가 빠르다. 런타임시에 외부를 참조할 필요가 없기 때문에 속도가 향상되어 성능도 좋아진다. 두번째, 라이브러리 생성이 간단하여 복잡하지않다. 세번째, 필요한 라이브러리를 프로그램 내에 적재하기 때문에 이식성이 좋다. 컴파일시 해당 정적 라이브러리의 내용이 실행 바이너리 안에 포함되어있기 때문에 함께 배포하지 않아도된다. [3] 네번째, 완성된 애플리케이션을 안정적으로 사용할 수 있다. 또한 시스템 환경이 변하더라도 애플리케이션에는 어떠한 영향도 미치지않는다. [4]

정적 라이브러리의 단점으로는 첫째, 메모리가 낭비될 수 있다. 같은 코드를 가진 여러 프로그램을 실행할 경우에 소스코드가 중복되기 때문에 그만큼의 하드디스크 공간도 차지하고, 메모리도 더 많이 차지하게 되어 메모리를 낭비하게 된다. [4] 두번째, 라이브러리에 변경사항이 생길 경우, 변경된 라이브러리의 내용만 재배포가 되지않는다. 즉, 변경된 내용의 라이브러리가 적용된 프로그램을 다시 재배포해야한다. [3]

동적 라이브러리(dynamic library) [ 편집 ]

동적 라이브러리(dynamic library)는 소프트웨어의 일종으로, 동적 링크를 사용한 라이브러리이다. 여러 프로그램이 바이너리의 단점 공통적으로 필요로 하는 기능들을 프로그램과 분리하여 필요할 때에만 불러내어 쓸 수 있게 만들어 놓은 라이브러리를 의미한다. 마이크로소프트 윈도우에서는 동적 링크 라이브러리라고 해서 확장자가 DLL인 파일로 제공되고 있으며, 리눅스에선 /lib 밑의 .so 파일 등으로 구현된다. 개인이 자유 소프트웨어 등을 작성할 때에 만들기 쉽게 하기위해 작성하여 무료로 제공되는 것도 있다. [5]

장단점 [ 편집 ]

동적 라이브러리는 첫째, 메모리를 절약할 수 있으며, 스와핑을 줄여준다. 여러 프로세스가 메모리에 있는 하나의 DLL 복사본을 공유하여 하나의 DLL을 동시에 사용할 수 있다. 두번째, 디스크 공간도 절약할 수 있다. 여러 응용 프로그램이 디스크에 있는 하나의 DLL 복사본을 공유할 수 있다. 세번째, DLL을 쉽게 업그레이드할 수 있다. DLL의 함수가 바이너리의 단점 변경되어도 함수의 인수 및 반환 값이 변경되지않았다면 그 함수를 사용하는 응용 프로그램은 다시 컴파일하거나 링크를 할 필요가 업다. 네번째, 출시 후에 지원이 가능하다. 예를들면, 응용 프로그램을 출시할 때 사용할 수 없었던 디스플레이 기능을 지원하도록 디스플레이 드라이버 DLL을 수정할 수 있다. 다섯번째, 언어 형식이 다른 여러 프로그램을 지원한다. 서로 다른 프로그래밍 언어로 작성된 프로그램인 경우에도 함수의 호출 규칙을 따르기만 한다면 여러 프로그램에서 동일한 DLL 함수를 호출할 수 있다. 이 경우 각 프로그램과 DLL 함수는 여러 부분에서 호환될 수 있어야 한다. [2]

동적 라이브러리의 단점으로는 첫째, 외부 의존도가 발생하기 때문에 이식성이 어렵다. 둘째, 성능저하로 인해 속도가 느려질수있다. 동적 라이브러리는 정적 라이브러리에 바이너리의 단점 비해 사용이 복잡하기 때문에 공유 라이브러리를 메모리에 올리려면 해당 라이브러리를 찾고 올리는데까지 시간이 걸린다. 이로인해 성능저하가 발생하게 되며 속도가 현저히 느려진다. [2] 세번째, 실행파일을 배포할 경우 라이브러리를 함께 배포해야한다. 컴파일시 해당 동적 라이브러리의 내용이 실행 파일안에 포함되어 있지않거나 메이저 버전이 달라 프로그램이 작동되지않는 경우가 있기 때문이다. [6] [7]

각주 [ 편집 ]

  1. ↑ 〈라이브러리〉, 《프로그래밍 언어(오픈 튜토리얼)》, 2013-05-27
  2. ↑ 2.02.12.2 〈동적라이브러리란?〉, 《개인사이트》, 2016-07-13
  3. ↑ 3.03.13.2 〈동적 라이브러리와 정적 라이브러리〉, 《개인사이트》, 2018-10-06
  4. ↑ 4.04.1 〈정적 라이브러리와 동적 라이브러리의 비교(lib와 dll의 장단점)〉, 《개인사이트》, 2013-05-08
  5. ↑ 〈동적라이브러리〉, 《위키백과》, 2020-04-02
  6. ↑ 〈Static Link Library와 Dynamic Link Library의 장단점〉, 《개인블로그》, 2011-01-07
  7. ↑ 〈동적(공유) 라이브러리와 정적 라이브러리〉, 《개인블로그》, 2013-08-09

같이 보기 [ 편집 ]

이 라이브러리 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.

바이너리의 단점

변일수 * 안창원 ** 박종근 * 조희남 * Desmons Frederic* 김성운 ***

현재 XML 은 가장 널리 받아들여지고 있는 문서 형식 중의 하나로 그 사용 분야는 점차 확대되어 가고 있다 . 그러나 XML 의 성공은 XML 이 의도되지 않은 곳에까지 사용되는 결과를 낳았고 , 뜻하지 않던 XML 의 문제점이 거론되기 시작하였다 . 문제점 중 하나는 XML 이 너무 장황 (verbose) 하기 때문에 과부하가 크다는 점이다 . 이는 소형기기나 네트워크 환경에서 치명적인 약점이 될 수 있다 . 이 문제를 해결하기 위해 XML 문서의 바이너리 형식에 대한 연구가 진행되기 시작하였다 . 하지만 이것은 민감한 문제이다 . XML 문서의 이진화는 XML 의 본래 취지에 역행하는 것이라고 생각하는 사람도 적지 않다 . 이들은 XML 의 이진화가 과거와 같이 독자적인 데이터 형식을 정의하게 해 폐쇄적인 환경으로 돌아가게 되는 것을 두려워한다 . XML 의 개방성을 유지하면서 내재된 문제점을 해결하기 위해서는 바이너리 XML 에 대한 표준이 필요하다 . 본 고에서는 바이너리 XML 과 관련된 연구 동향과 표준화 추진 현황을 소개하고자 한다 . ▧

XML[1] 은 운영 환경과는 독립적인 문서 형식을 정의할 수 있다는 장점으로 인해 많은 바이너리의 단점 사용자층을 확보할 수 있었고 , 현재 가장 주목받는 문서 형식 중의 하나가 되었다 .

그러나 양날의 검처럼 XML 의 장점은 특정 분야에서는 단점으로 작용하고 있다 . XML 은 상호운용성 (Interoperability) 을 확보하고 보다 쉬운 접근이 가능하게 하기 위해 인간이 읽을 수 있는 텍스트 형식을 취하고 있다 . 이는 실제로 데이터 처리 과정에는 필요 없는 여분의 데이터를 포함하고 있다는 뜻이 되며 , 텍스트 형식을 취하게 됨으로 생기게 되는 저장 공간의 손실도 존재한다 . 일반적인 컴퓨팅 환경에서 이 정도의 과부하는 문제가 되지 않는다 . 하지만 네트워크 환경이나 임베디드 시스템 같이 상대적으로 느린 매체에 자주 접근하거나 자원이 제한된 소형 기기의 경우 XML 문서의 과부하는 전체 응용 프로그램의 성능을 결정짓는 중요한 바이너리의 단점 요소가 될 수 있다 . 이에 대한 예로 웹 서비스를 생각해 볼 수 있다 . 웹 서비스는 이기종간의 상호 운영성을 보장하기 위해 메시지 형식으로 XML 형식을 취하고 있다 . 그러나 상호 운영성에 대한 대가는 적지 않다 . XML 형식의 메시지 교환은 XML 의 내재된 단점으로 인해 전체 응용 프로그램의 성능을 저하시킬 정도로 큰 과부하를 일으키고 있다 [14].

이 때문에 업계에서는 XML 문서의 바이너리 형식에 대해 요구하기 시작하였다 . 이를 받아들여 W3C[6] 에서는 바이너리 XML 에 대한 정당성을 확인하기 위해 바이너리 XML 에 대한 쓰임새 (Usecase) 를 분석하고 취합하는 워킹 그룹 (XML Binary Characterization Working Group) 을 운영하고 있다 [2]. 바이너리 XML 의 이점은 분명하다 . 데이터를 네이티브 (native) 형식으로 저장함으로 문서의 크기를 줄이고 XML 문서의 파싱 (parsing) 과정에 따른 과부하를 줄임으로 성능을 향상시킬 수 있다 . 그러나 논란의 여지는 적지 않다 . XML 의 최대 장점은 상호운용성인데 이를 포기하고 바이너리 형식을 취한다는 것은 과거로의 회귀를 뜻하기 때문이다 . 현재로서 이에 대한 가장 현실적인 접근 방법은 XML 문서의 바이너리 인코딩 표준을 마련하는 것이다 .

본 고에서는 현재 여러 분야에서 동시 다발적으로 일어나고 있는 바이너리 XML 연구 동향과 표준화 추진 현황을 다룬다 .

II. 바이너리 XML 연구 동향

XML 을 이진화함으로 성능을 향상시키고자 하는 노력이 3 가지 측면에서 기울여지고 있다 . 그것들은 압축 , 문서 구조의 분리 , 인코딩 등 총 3 가지로 분류될 수 있다 .

XML 문서의 단점을 보완하기 위한 한가지 방법은 XML 문서를 압축하는 것이다 . 서론에서 지적되었듯이 XML 문서는 사람이 읽을 수 있는 문서 형식을 지향하기 때문에 모든 데이터가 텍스트 형식으로 저장된다 . 이것은 저장 공간을 낭비하는 원인이 된다 . 예를 들어 숫자 100 을 저장한다고 가정해 보자 . 이것을 네이티브 형식으로 저장하고자 하면 단지 한 바이트 (byte) 면 된다 . 하지만 텍스트 형식으로 저장하기 위해서는 문자 하나당 2 바이트씩 총 3 개의 문자로 6 바이트를 필요로 한다 . 즉 네이티브 형식보다 무려 6 배의 저장 공간을 차지한다는 뜻이다 . 게다가 XML 문서의 각 요소들은 한 쌍의 태그로 둘러싸인다 . 결국 XML 문서의 크기는 불필요하게 커질 수 밖에 없다 . 문서가 디스크나 네트워크와 같이 상대적으로 느린 매체를 통해 전송되어야 할 경우 , 문서의 크기는 성능에 치명적인 요소일 수 밖에 없다 . 따라서 문서의 크기를 줄이는 것은 상당히 도움이 된다 . 과부하를 느린 매체에서 상대적으로 빠른 CPU 로 옮김으로 속도를 향상시키기 때문이다 . 다시 말해서 , 느린 매체에 다량의 정보를 넘겨주고 처리가 끝나기를 기다리는 대신 , 상대적으로 처리 속도가 빠른 CPU 가 넘겨 주어야 할 정보의 양을 줄이도록 함으로 성능 상의 이득을 볼 수 있다는 뜻이다 . 그래서 일부 웹 서비스에서는 XML 문서를 송신하기 전에 압축 과정을 거친다 . 단 수신측에서는 메시지를 읽기 위해 반드시 해제 과정을 거쳐야 한다 .

Gzip[3] 은 GNU 프로젝트의 일환으로서 compress 를 대체하면서 , 더 나은 성능을 보이며 동시에 특허에 의해 제한되지 않는 압축 알고리즘을 제공하고 있다 . Gzip 알고리즘은 여러 언어로 이식되었으며 대부분의 라이브러리들이 오픈 소스로 제공되기 때문에 별다른 노력 없이 적용할 수 있다는 장점이 있다 . 그러나 매 연산 시 압축과 해제 과정이 수반되어야 한다는 것이 단점으로 작용한다 . 이것은 비단 Gzip 만의 문제라고는 할 수 없으며 압축에 의한 접근 방식이 어쩔 수 없이 가지게 되는 단점이다 .

XMill[4] 은 XML 문서에 특화된 압축 알고리즘이다 . XMill 은 엔트로피 (Entropy) 기반의 압축 방식을 취하고 있다 . 엔트로피 부호화의 기본 원리는 데이터 심볼들의 통계적 발생 빈도에 따라 각각의 심볼들을 적절한 길이의 부호로 표현하는 것이다 . 데이터 심볼들의 발생 확률에 따라 엔트로피라고 불리는 심볼 바이너리의 단점 당 평균 정보량이 결정되는데 , 엔트로피 부호화의 목표는 심볼 당 평균 부호 길이가 엔트로피에 가까이 가도록 하는 것이다 .

엔트로피 부호화에는 허프만 방식 , 산술 방식 , LZW 방식이 있다 . 이중에서 XMill 에 사용된 방식은 허프만 방식이다 . 이것은 고정길이 부호를 가변길이 부호로 바꾸는 것으로서 빈도수가 높은 심볼에는 짧은 부호를 , 빈도수가 낮은 심볼에는 긴 부호를 부여함으로 평균 부호 길이를 본래 심볼의 고정 길이보다 짧게 하는 것이다 .

영문 텍스트의 경우 , 압축하지 않은 원문은 글자 당 7 비트를 차지하는데 이를 허프만 방식을이용해 부호화하면 자주 발생하는 글자들은 대략 3 비트 정도의 낮은 비트로 , 빈도수가 낮은 기호들은 10 비트 이상의 높은 비트로 부호화시켜 심볼 당 평균 비트 수를 원래의 그것보다 낮추는 것이다 . XML 문서는 구조상 반복되는 구문이 많기 때문에 허프만 방식은 큰 효과를 나타낼 수 있다 . 실제로 XMill 은 Gzip 보다 두 배 이상의 나은 성능을 보이고 있다 .

앞에서 우리는 압축 방식의 가장 큰 문제점으로 압축과 해제 과정에 따른 과부하를 지적하였다 . 만약 해당 문서의 모든 요소가 사용된다면 효과를 기대할 수 있지만 문서의 일부 요소만을 필요로 한다면 과부하는 더 커진다고 볼 수 있다 . 실제 필요로 하는 정보 대비 요구되는 처리 능력을 고려해 볼 때 확실히 압축에 의한 접근 방식은 비효율적이다 . 이에 대한 해결책으로 대두된 것이 ‘ 문서 구조의 분리 (Separation of Structure and Content) ’ 다 . 이 방식에서는 데이터를 압축하기 전에 문서 구조를 추출하고 콘텐츠에 대한 인덱스를 유지한다 . 그리고 콘텐츠는 용량을 줄이기 위해 압축된다 . 압축에는 gzip 이나 deflate[19] 같은 일반적인 압축 기법들이 사용된다 .

문서 구조를 추출함으로써 갖게 되는 장점은 압축 해제 과정을 선택적으로 할 수 있다는 데에 있다 . 먼저 원하는 콘텐츠의 위치를 문서 구조를 통해 파악하고 , 그 다음에 해당 위치의 콘텐츠만을 선택적으로 압축 해제함으로 압축 해제에 따른 과부화를 최소한으로 유지할 수 있다 . 그러나 XML 문서 전체의 요소가 전부 사용되어야만 하는 상황이라면 문서 구조 추출에 의한 이점은 대부분 상쇄되어 압축 기법과 별로 차이가 없어진다는 것이 단점이다 .

다음은 ‘ 문서 구조의 분리 ’ 접근 방식을 취한 몇 가지 예들에 대한 설명이다 .

Millau[5] 인코딩 형식은 WAP(Wireless Application Protocol)[11] 바이너리 XML 형식에 대한 확장이다 . 이 형식은 XML 문서의 크기를 줄이기 위해 고안되었다 . 태그와 속성은 토큰으로 변환된다 . 그리고 문서 구조와 콘텐츠를 분리해 각각의 데이터를 서로 다른 스트림으로 전송한다 . 문서 구조는 WBXML 인코딩 형식에 의해 변환된다 . 반면 콘텐츠는 일반적인 압축 알고리즘에 의해 압축된다 . 사용자는 모든 문서를 전송받을 필요가 없다 . 문서 구조와 콘텐츠가 서로 다른 스트림으로 전송되기 때문에 , 먼저 전송받은 문서 구조를 조사한 후 , 원하는 부분만을 전송받으면 된다 . 이것은 데이터 전환에 의한 과부화를 없애는 역할을 한다 . 이 형식은 네트워크 상에서 XML 문서를 주고 받을 때 , 특히 문서의 일부분만을 참조하고자 할 때 유용하다 .

XCpaqs[15] 는 XML 문서의 압축 방식이면서 XPath 를 지원한다는 점이 특징이다 . XCpaqs 의 전체적인 구조는 다음과 같다 .

( 그림 1) 에서 볼 수 있듯이 ‘ Structure and context separator ’ 는 문서 구조와 콘텐츠를 분리한다 . 문서 구조를 통해서 Xpath 경로와 해당 경로의 데이터 타입이 결정된다 ( 좌측 ). 콘텐츠는 문서 구조 분석기에 의해 결정된 데이터 타입에 따라 적절한 압축기로 압축된다 ( 우측 ). 그리고 두 결과를 조합하는 것으로 모든 과정을 마무리한다 . XCpaqs 는 데이터 타입에 따라 압축 방식을 바꿀 수 있다는 특징을 가지고 있다 .

본래의 XML 문서의 의미와 구조가 보존될 수 있도록 고유의 인코딩 포맷을 정의하는 방법도 있다 . XML 문서의 데이터들은 각각의 데이터 타입에 맞는 네이티브 형식으로 인코딩되기 때문에 공간이 절약된다 . 하지만 일반 압축 기법의 압축률과 비교할 때 인코딩으로 인해 절약되는 공간의 크기는 미약하다 . 그러나 이것이 곧 인코딩 기법의 성능이 압축 기법보다 낮다는 뜻은 결코 아니다 . 인코딩 기법의 장점은 단순히 공간을 절약하는 데에 있지 않다 . 인코딩된 바이너리 XML 문서를 Pre-parsed XML 이라고도 부르는데 , 여기에 함축된 의미는 XML 문서의 파싱 과정이 더는 필요하지 않다는 것이다 . 미리 파싱된 형태로 데이터를 저장함으로 매 접근 시마다 텍스트 문자열들을 파싱하고 데이터를 추출하는 과정을 거칠 필요가 없다는 말이다 . XML 문서가 가지는 단점 중의 하나는 데이터가 인간 친화적인 형태로 기록되었기 때문에 컴퓨터가 이해하기 위해서는 파싱 과정을 통해 데이터를 추출하고 변환해야만 한다는 데에 있다 . 이것은 가볍지 않은 처리 과정이며 , 임베디드 기기처럼 자원이 제한된 기기의 경우에는 특히나 더 그렇다 . Pre-parsed XML 에서는 파싱 과정이 제거되었기 때문에 CPU Usage 나 Memory footprint 측면에서 상당한 이득이 있으며 , 문서에 대한 접근 속도는 비약적으로 향상된다 . 이러한 장점들은 단순히 크기를 줄임으로 얻게 되는 성능상의 이득을 충분히 능가할 수 있으리라 여겨진다 . 특히 한 XML 문서에 대해 반복적인 접근이 필요한 경우 파싱 과정을 제거함으로 인해 생기는 이득은 훨씬 커진다 .

다음은 인코딩 방법을 적용한 예들이다 .

가 . Fast Infoset

Fast Infoset[8] 을 이해하기 위해서는 XML 스펙에 대해 먼저 살펴보는 것이 도움이 된다 . XML 스펙에는 XML Information Set[17] 스펙이 존재한다 . 이는 XML 이 표현할 수 있는 정보를 추상적으로 정의한 것으로서 XML 이 어떤 정보를 가질 수 있는지에 대한 내용만 있을 뿐 어떻게 표현할지에 대해서는 전혀 언급이 없다 . 일종의 관념적인 모델이다 . 이에 대한 실제화를 XML[16] 스펙에서 담당하고 있다 . 달리 생각하자면 우리가 일상적으로 보게 되는 각괄호 () 로 이루어진 XML 문서는 XML Information Set 의 구현물이라고 생각할 수 있다 . Fast Infoset 은 XML Information Set 의 또 다른 구현물이며 이진 표현이다 .

그렇다면 이진 코드는 어떻게 생성되는가 ? Fast Infoset 은 거의 20 년 동안 통신업계에서 사용되어 안정성과 실효성이 증명된 ASN.1(Abstract Syntax Notation One)[7] 이라는 추상화 구문을 이용하고 있다 . ASN.1 은 프로토콜의 설계를 위해 고안된 언어로서 프로토콜을 정의하는 추상화 구문과 실제 전송 라인에서 어떤 비트 패턴으로 표현될지에 관한 전송 구문을 완전히 분리시켜 놓았다 . ASN.1 에 의해 표현된 추상적인 프로토콜은 인코딩룰에 의해 실질적인 비트 패턴으로 변환된다 . BER(Binary Encoding Rule), PER(Packed Encoding Rule), XER(XML Encoding Rule) 등 다양한 인코딩 룰이 정의되어 있어 적합한 룰을 가져다 쓰기만 하면 된다 . 고유의 비트 패턴을 정의하고자 한다면 ECN(Encoding Control Notation) 을 통해 새로운 룰을 정의할 수도 있다 . 다음은 Fast Infoset 을 통한 XML Information Set 의 인코딩 과정을 관념적으로 표현하고 있다 [9].

Fast Infoset 은 문서의 크기를 줄이고자 테이블과 인덱싱 기법을 사용하고 있다 . 처음 나타나는 문자열을 테이블에 저장해 놓고 동일한 문자열이 나타날 경우 인덱스로 대치함으로 XML 문서의 크기를 줄인다 .

Fast Infoset 을 적용하였을 경우 문서의 압축률은 압축 기법에 비해 별로 좋지는 않다 . 하지만 성능상의 향상을 체감할 수 있을 정도는 되며 , 부가적으로 일반 XML 문서나 압축된 XML 문서에 비해 접근 성능이 비약적으로 향상되는 것을 확인할 수 있다 바이너리의 단점 [12].

XBIS(XML Binary Information Set)[10] 는 본래 텍스트로 이루어진 XML 문서로의 완전한 전환을 지원하는 고유의 인코딩 포맷을 정의하고 있다 . XBIS 의 장점은 간결함에 있는데 , 그것은 일반 XML 문서의 반복적인 구문을 활용하는 데에 기인한다 . XBIS 는 반복되는 구문을 단 한번만 정의하고 반복될 때마다 원래의 구문을 참조하는 핸들을 사용함으로 문서의 크기를 줄인다 . 게다가 XBIS 는 데이터를 사용하기 쉬운 형식으로 변환시켜 놓음으로 문서에 대한 접근 속도를 향상시켰다 . XBIS 의 접근 방식은 Fast Infoset 과 상당히 유사하다 . 하지만 XBIS 는 표준에 근거하지 않은 독자적인 형식이라는 데에 그 한계점이 있다 . 참조 구현은 자바로 작성되었으며 SAX2(Simple API for XML2)[18] 인터페이스를 구현하고 있다 .

W3C 에서는 업계의 요구를 받아들여 XBC-WG(XML Binary Characterization Working Group) 를 구성하였다 . 현재 이 워킹 그룹의 역할은 바이너리 XML 의 쓰임새를 파악하여 바이너리 XML 관련 권고안 (Recommendation) 의 기초를 세우는 작업을 담당하고 있다 . 이 말을 달리 표현하자면 , 바이너리 XML 과 관련된 스펙은 W3C 내에 아직 존재하지 않는다는 뜻이다 . 다만 바이너리 XML 의 필요성에 주의를 기울이기 시작하였다는 점에 유의할 수 있다 .

XBC-WG 에서는 Binary XML 이 반드시 만족해야 하는 최소한의 요구사항을 결정하기 위해 현재 XML 이 잘 사용되지 않는 영역의 쓰임새를 분석하였다 . 이를 위해 각종 속성을 정의하고 , 각 쓰임새별 요구사항을 이들 속성으로 표현하였으며 , 이를 XML 에서 제공하는 속성과 비교함으로 바이너리 XML 에서 제공해야 할 최소한의 요구사항으로 도출하였다 . 앞으로 규정될 바이너리 XML 에 대한 어렴풋한 윤곽을 잡을 수 있도록 XBC-WG 가 정의한 최소한 요구 사항들을 다음에 열거하였다 [13].

- 전송 독립성 (Transport Independence)

- 인간 언어와의 중립성 (Human Language Neutral)

- 기술료 무료 (Royalty Free)

- 플랫폼 중립성 (Platform Neutrality)

- 콘텐츠 형식 관리 (Content Type Management)

- XML 스택으로의 통합 가능성 (Integratable into XML Stack)

결론적으로 말해서 W3C 에서도 바이너리 XML 에 대한 필요성을 인지하고 있으며 그 기술적 가능성과 요구사항에 대한 조사를 수행하였고 , 바이너리 XML 에 대한 표준에 W3C 가 적극적으로 참여하여 상호 호환성을 확보해야 함에 동의하고 있다 .

현재 Fast Infoset 에 대한 스펙 (ISO/IEC24824-1) 은 초안 단계에 있다 . 안타깝게도 아직 공개되지 않았으며 TIES(Telecom Information Exchange Services) 사용자만이 스펙을 볼 수 있도록 제한되어 있다 . 로드맵에 의하면 Fast Infoset 은 FDIS(Final Draft International Standard) 를 위한 무기명 투표 중에 있으며 , 2005 년 6 월 중순경에 권고안이 발표될 것으로 예정되어 있다 .

XML 은 지금까지 대단히 성공적이었다고 할 수 있다 . 어떤 플랫폼에도 종속되지 않은 독립적인 데이터 표현 방식은 이기종 간의 데이터 전송 수단으로 매우 유용함이 증명되어 왔다 . 하지만 성공의 이면에는 XML 문서에 내재된 단점의 그늘이 드리워지고 있었다 . XML 의 성공은 XML 의 사용이 의도되지 않은 분야로까지 확대되게 하였고 결국 바이너리의 단점 성능과 관련된 이슈를 문제로 부각시켰다 . 이를 해결하기 위해서는 XML 문서를 이진화해야 한다 . 그리고 XML 의 장점인 상호운용성을 유지하기 위해 인코딩 형식에 대해 확립된 표준이 필요하다 .

W3C 에서는 XML 의 이진화에 대한 요구사항을 파악하고 정당성을 파악하기 위한 절차에 들어갔다 . 하지만 결과가 언제 나올지는 미지수다 . 하지만 여기에서 우리는 하나의 중요한 움직임에 주목할 필요가 있다 . ITU-T 에서 ISO/IEC 와 함께 XML 의 이진화에 대한 스펙을 정의하고 있다는 점이다 . Fast Infoset 이 바로 그것이다 . 아직은 공개되지 않은 초안의 형태이지만 , 올해 중반기 쯤에는 그 모습을 볼 수 있을 것으로 예상한다 . 게다가 관련 구현물도 이미 존재하며 성능상의 이점은 확인되었다 . ASN.1 이라는 이미 확립된 표준을 기반으로 바이너리의 단점 한 응용 표준이기 때문에 적용 또한 어렵지 않을 것이다 . 아직 확정된 것이 없어 섣불리 판단을 내리긴 힘들겠지만 , Fast Infoset 이 바이너리 XML 표준의 강력한 후보 중에 하나가 되리라는 것만은 틀림 없다 .

[1] Extensible Markup Language, http://www.w3.org/XML/

[2] XML Binary Characterization Working Group, http://www.w3.org/XML/Binary/

[3] Gnu ZIP, http://www.gzip.org/

[4] XMill, http://sourceforge.net/projects/xmill/

[5] Girardot, M., Sundaresan, N., “ Efficient representation and streaming of XML content over the Internet medium, ” Multimedia and Expo, 2000. ICME 2000. 2000 IEEE International Conference on Vol.1, No.30 July 2 Aug. 2000, pp.67-70.

[6] World Wide Web Consortium, http://www. w3c.org/

[7] Abstrax Syntax Notation One, http://asn1.elibel.tm.fr/en/index.htm

[8] Fast Infoset, http://asn1.elibel.tm.fr/en/xml/#fast-infoset

[9] John, Larmouth., “ ASN.1 Complete, ” , http://www.oss.com/asn1/larmouth.html

[10] XML Binary Information Set, http://sourceforge.net/projects/xmill/

[11] WAP, http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html

[12] Paul, Sasndoz., Alessando, Triglia., Santiego, Pericas-Geertsen., “ Fast Infoset ” ,

[13] 박종근 , “ XML Binary 특성화 분석 , ” 한국전자통신연구원 , 관리번호 TM031020050734, 2005, 5. 30.

[14] Fast Web Service, http://java.sun.com/developer/technicalArticles/WebServices/fastWS/

[15] Hongzhi Wang., Jianzhong Li., Jizhou Luo; Zhenying He., ” XCpaqs: compression of XML document with XPath query support, ” Information Technology: Coding and Computing, 2004. Proceedings. ITCC 2004. International Conference 바이너리의 단점 on Vol.1, No.5-7, Apr. 2004, pp.354-358.

.NET 객체 직렬화 방법

.NET 객체 직렬화는 주로 다른 도메인간 객체를 전송하기 위해 많이 이용하는 기법입니다. 객체의 상태를 지속시키거나 전송 할 수 있는 연속적인 바이트의 배열로 변환하는 직렬화(Serialization)와 반대로 저장장치로부터 다시 객체의 상태로 되돌리는 역직렬화(deSerialzation) 작업으로 나눌 수 있습니다.

이때 직렬화와 역직렬화 작업 수행시 중간에 포매터(Formatter)를 선택해야 하는데 .NET 에서는 기본적으로 두가지의 포매터를 제공해줍니다.

객체직렬화

첫번째는 BinaryFormatter 로 객체를 바이너리 형식으로 직렬화/역직렬화 해줍니다. 두번째는 SoapFormatter 로 객체를 XML 포맷으로 SOAP 형식으로 직렬화/역직렬화 해줍니다. 객체 직렬화 과정은 내부적으로 상당히 복잡한 과정을 거치지만, 자동으로 내부적으로 해주므로 규칙만 익히면 됩니다.

객체 직렬화의 목적

.NET 객체 직렬화는 기본적으로 두가지 목적으로 사용됩니다. 객체의 상태를 저장매체에 기록해 두었다가 나중에, 그 객체의 상태 그대로 다시 꺼내오는 목적과 .NET 리모팅 기술에서 어플리케이션 도메인간에 객체가 갖는 데이터 자체를 전송해야 하는 경우입니다.

객체 직렬화의 장단점

직렬화의 주요한 장점은 DOM을 이용하지 않고 XML 문서를 수정할 수 있으며 어떤 어플리케이션으로부터 다른 어플리케이션으로 객체를 전달할 수 있다는 장점이 있습니다. 더불어 객체를 XML 문자열의 형태로 직렬화 하게 되면 80번 포트로 방화벽을 거쳐 전달 할 수 있는데 이는 방화벽에 제약을 받지 않고 객체를 전달할 수 있다는 의미가 됩니다.

반면 직렬화의 주요한 단점은 직렬화와 역직렬화 연산 과정에서 자원(CPU와 IO 장치)의 소모가 많다는 것입니다. 또한, 네트워크를 통해 객체를 전달할 경우 직렬화 과정이 느려서 지연 문제가 발생할 수 있습니다. 마지막으로 XML로 직렬화하는 것은 XML 문서를 다른 프로그램이나 사용자가 실수나 고의로 문서의 내용을 변경할 수 있어서 안전하지 않으며, 많은 저장 공간을 차지하고, public 클래스에 대해서만 직렬화가 이루어질 수 있으므로 private 클래스 또는 internal 클래스는 직렬화할 수 없다는 단점이 존재합니다.

직렬화 개체의 선언

직렬화 가능한 클래스를 만들기 위해서는 클래스에 SerializableAttribute 특성을 적용해야 합니다. 이 특성이 적용된 클래스는 직렬화가 가능합니다.
하지만, 그 클래스의 멤버 중 NonSerializableAttribute 특성이 적용된 멤버를 제외한 나머지 모든 멤버가 직렬화가 가능해야 합니다. NonSerializableAttribute 특성이 적용된 멤버는 직렬화할 때 무시되며 SerializableAttrbute 특성이 적용된 클래스의 private 멤버와 public 멤버는 기본적으로 직렬화됩니다.

Binary Seralization 유형

Binary Serialization은 출력 스트림에 데이터를 기록하는 메커니즘으로 이 출력 스트림은 객체를 자동으로 재구성하는데 사용할 수 있습니다. binary라는 용어가 저장매체에 저장되어 있는 객체와 동일한 복사본을 생성하는데 필요한 필수적인 정보라는 뜻을 가지고 있습니다.

binary serialization과 XML serialization간의 주목할만한 차이는 binary serialization이 인스턴스의 identity(instance identity)를 가지고 있는 반면에 XML serialization은 그렇지 않다는 점입니다. 다시 말하자면, binary serialization은 객체의 모든 상태값을 저장하고 있는 반면, XML serialization은 객체가 가지고 있는 데이터의 일부분만을 저장하고 있다는 것으로 풀이됩니다.

다음 코드는 Binary Serialization의 예입니다.

SOAP Serialization 유형

SOAP 프로토콜은 서로 다른(heterogeneous) 아키텍쳐를 가지는 어플리케이션 간의 통신에 이상적입니다. .NET에서 SOAP Serialization을 이용하려면 어플리케이션이 System.Runtime.Serialization.Formatters.Soap을 참조해야 합니다.

SOAP Serializaion의 기본적인 장점은 이식성입니다. SoapFormatter는 객체를 직렬화해서 SOAP 메시지로 바꾸거나, SOAP 메시지로를 파싱해서 직렬화된 객체를 추출해낼 수 있습니다.

다음은 SOAP Serialization의 예제입니다.

XML Serialization 유형

“XML serialization은 어떤 오브젝트의 공용 필드와 속성 또는 메서드의 매개변수와 반환값을 명시적인 XML 스키마 정의 언어 문서(XSD; XML Schema definition language)에 맞는 XML 스트림으로 변환(직렬화)한다. XML serialization의 결과로 전송이나 저장을 위해 순차적인 포맷(여기서는 XML)으로 변환된, 공용 속성과 필드들을 가진 강력한 형식의 클래스(strongly typed classes)가 만들어진다. XML은 개방형 표준이기 때문에, 그 XML 스트림은 어떤 플랫폼이 어떤 프로그램에서도 처리될 수 있다.”라고 되어 있습니다.

.NET에서 XML Serialization을 구현하는 것은 아주 쉽습니다. serializatin과 de-serialization을 위해 필요한 기본 클래스는 XmlSerializer입니다. Web 서비스는 통신에 SOAP 프로토콜을 사용하는데, 이 XmlSerializer 클래스를 이용하여 반환형과 매개변수를 모두 직렬화합니다. 다만 XML Serialization은 Binary Serialization과 비교하면 상당히 느리다고 할 수 있습니다.

Formatters 활용

formatter는 객체의 직렬화 포맷을 결정합니다. 다시 말하자면, 객체를 스트림으로 직렬화하거나 스트림을 역직렬화하여 객체를 재생성해내는 것을 제어합니다. formatter는 객체를 네트워크를 통해 전송하기 전에 암호화하고 적합한 포맷으로 직렬화하는데 사용됩니다.

.NET은 BinaryFormatter와 SoapFormatter라는 2개의 formatter 클래스를 제공하는데 이 두 클래스 모두 IFormatter 인터페이스를 구현하고 있습니다.

Binary formatter는 이진(binary) 인코딩을 이용한 직렬화하는 방법을 제공합니다. BinaryFormater 클래스는 .NET의 Remoting기술에서 흔히 사용되는 이진 직렬화(binary serialziation)를 책임지고 있으며 이 클래스는 데이터가 방화벽을 통해 전달되어야 할 경우에는 적합하지 않습니다.

SOAP formatter는 SOAP 프로토콜을 이용하는 객체의 직렬화에 사용됩니다. SOAP formatter는 객체를 직렬화해서 SOAP 메시지로 바꾸거나 SOAP 메시지를 파싱해 직렬화된 객체를 추출해내는 역할을 합니다. SOAP formatter는 .바이너리의 단점 NET에서 WebServices에 널리 사용되고 있는 실정입니다.

[Encoding] 3. Binary/ BaseN encoding

데이터를 처리하다보면 범주형 자료를 수치형 자료로 바꾸어야할 필요성이 많습니다. 이러한 변환을 인코딩이라고 하는데, 다양한 목적과 자료의 특징에 맞추어 올바르게 인코딩한 범주형 자료는 모델의 퍼포먼스와 효율에 상당한 영향을 끼칩니다. 특히 최근 각광받는 머신러닝과 딥러닝에서 범주형 자료에 대한 인코딩은 필수적입니다. 그러나 인코딩은 생각만큼 단순하지 않습니다. One-Hot-Encoding/ Ordinal-Encoding/ Label Encoding/ Target Encoding… 등 종류도 다양할 뿐더러, 비슷한 인코딩도 library에 따라 크고작은 차이가 있습니다. 인코딩 특집 글에서는 자주 쓰이고, 중요한 인코딩 방식들을 소개합니다.

OneHotEncoding은 매우 직관적이고 모든 범주형 자료에서 활용가능합니다. 하지만 차원이 피쳐의 수만큼 증가한다는 커다란 단점이 있습니다. 따라서 가지고 있는 샘플 수가 많다면, 필요한 연산량과 메모리가 기하급수적으로 증가할 수 있습니다. 원핫인코딩 때문에 GCP를 사용한다면 여간 불편할 일일 뿐 아니라, GCP를 사용해도 데이터의 크기가 너무 크기 때문에 불편합니다. 그리고 무엇보다 차원의 저주라는 문제에 봉착할 확률이 높아집니다. 1 여러 해결방법이 있겠지만, N진법으로 표현하는 것도 그 중 하나입니다. 이를 BaseN Encoding이라고 하며, 그 중에서 N=2인 Binary Encoding이 가장 대표적입니다. 오늘은 이 두 방식을 소개합니다.

category_encoders

Binary와 BaseN 인코딩 모두 sklearn의 Categorical Encoding Methods 중 하나입니다. 이는 범주형 자료에 대한 인코딩을 전문적으로 다루기 때문에 앞선 포스팅에서 주로 다루었던, sklearn 기본 패키지 (sklearn.preprocessing) 보다 뛰어난 장점이 많습니다. 먼저 sklearn.preprocessing 는 array형태로 값을 반환하고, 설사 이를 DataFrame으로 반환한다고 해도 컬럼의 이름이 모두 없어진 상태입니다. 이 때문에 DataFrame으로 만들더라도 0과 1로만 이루어진 결과값을 만나게 됩니다. 이에 반해 category_encoders는 DataFrame으로 결과를 반환할 뿐아니라, 컬럼에 각각 원래의 변수이름이 표현되기 때문에 편리합니다. 2

예를 들어, 아래 사진은 범주형 자료 (CHAS, RAD) 를 binary로 바꾼 모습입니다. 별다른 코드 없이도 알아서 DatFrame으로 바꿔줄 뿐 아니라 컬럼 이름까지 get_dummies 와 유사하게 보여줍니다. 물론 원핫인코딩처럼 각 컬럼이 특정한 의미를 갖는다고 말할수는 없어집니다. 단순히 어느 범주형 자료를 가공한 것인지를 표현한다고 할 수 있습니다.

im1

추가적으로 sklearn.preprocessing 과 비교하여 인풋으로 받는 type은 다음과 같이 구별됩니다.

옵션도 다양할 뿐 아니라 앞으로 소개할 다양한 인코딩 기법들은 이 method로 작업하기 때문에 사용법을 익혀두는 것이 유용합니다. 먼저 아래처럼 라이브러리를 설치합니다.

BinaryEncoder

먼저 2진법으로 표현하는 것의 장점을 간략하게 말씀드리려고 합니다. 평소에 원핫으로 인코딩을 한다는 것은, 완전히 맞는 말은 아니지만 1진법으로 표현하는 것과 유사합니다. 1진법이란, 흔히 개표를 할 때 바를 정(正)자를 써서 득표수를 쓰는 것을 의미합니다. 이 경우, 득표수만큼 획순을 더해가게 되는데, 원핫인코딩도 사실 같은 논리입니다. 다만 피쳐의 갯수만큼 벡터의 길이가 늘어납니다.

반면 2진법은 각 자릿수마다 0과 1 두가지 숫자로 표현합니다. 예를 들어, 100 은 1100100 이 됩니다. 만약 100가지의 피쳐를 가지는 범주형 변수를 원핫인코딩을 한다거나, 이를 1진법으로 표현하기 위해서는 100차원의 벡터 혹은 100번의 획순이 필요한 것과 비교하면 단 7자리로 표현이 가능하니 엄청난 차원축소라고 할 수 있습니다. 따라서 원핫인코딩이 가지는 메모리 부족 3 과 차원의 저주도 꽤나 잘 해결할 수 있습니다. 두 인코딩 기법의 차이와 관련해서는 글 가장 아래 참고문헌에서 확인하실 수 있습니다.

처음에 numeric value로 바꿔줄 때는, Ordinal Encoder 를 사용합니다. 여러 이유가 있겠지만, Label 인코딩이 0부터 시작하는 반면, Ordinal 인코딩은 1부터 시작하기 때문에 그렇습니다.

코딩은 다음과 같이 해주면 됩니다.

BinaryEncoder 불러오기

자신이 원하는 옵션을 결정하는 곳입니다. 다양한 기능을 사용할 수 있지만, 대다수 default로 잘 설정이 되어있습니다. 위에 처럼만 코딩을 해주어도, 새로운 변수를 0 벡터꼴로 바꿔주기 때문에 차원변화없이 문제를 잘 해결할 수 있습니다. 참고로, drop_invariant는 모두 하나의 값으로만 이루어진 컬럼을 제거하는 기능을 수행합니다.

fit_transform

fit 과 transform 의 기능을 합친 것입니다. 인코딩을 원하는 데이터를 집어넣는 첫 단계이며, 결과가 위에서 생성한 instance에 저장이 됩니다. 따라서 새로운 값을 마주할 때 차원을 유지하거나, 원래 값이 궁금할 때에 손쉽게 확인할 수 있습니다.

transform, inverse_transform

transform 은 앞서 인코딩한 방식에 새로운 데이터셋을 집어넣어 같은 방식으로 변환을 해줍니다. 이때 여러 새로운 피쳐를 집어넣어도 모두 0으로 이루어진 컬럼으로 값을 반환합니다. 원래 데이터가 궁금하다면 inverse_transform 을 해주면 됩니다. 새로운 데이터셋에 해당하는 값들은 NaN 으로 반환합니다.

추가로 이 역시 make_column_transfer과 함께 쓰여서 하나의 데이터 안에서 일부분에만 작업을 해주는 것이 가능합니다. 자세한 예시는 저의 깃헙을 참고하시면 됩니다.

BaseN

앞에서 Binary는 BaseN 인코딩에서 N을 2로 설정한 것과 동일함을 이야기했습니다. 조금 더 확장하면, 다음과 같을 것입니다.

N = 1일 때는 완벽하게 OneHot 인코딩과 같지는 않지만, 사실상 같다고 봐도 무방합니다.

앞에서 2진법으로 표현하여 차원의 수를 대폭 줄였다면, N을 더욱 크게 해서 더욱 간결하게 차원을 축소한다면 좋을 것이라고 생각할지 모릅니다. 하지만 실제로 2진법 이외의 인코딩 기법은 많이 사용하지 않습니다. 몇 가지 이유를 추측할 수 있을 것입니다. 첫째, 3진법 이상부터는 0과 1이 아닌 더 큰 숫자가 등장합니다. 이렇게 되면, 하나의 컬럼에 대소관계가 점차 많이 드러나게 됩니다. 이 경우, Ordinal한 데이터가 아님에도 그렇게 해석될 여지가 생겨버립니다. 둘째, 이미 2진법으로도 충분히 차원을 축소할 수 있습니다. 앞에서 말했듯이 100자리의 원핫인코딩은 단 7자리로 대체가 가능합니다.

따라서 실제로 BaseN을 사용하는 사례는 매우 적습니다. 다만 Grid 서치처럼 최적 변수를 찾기 위해서 간혹 사용하는 것처럼 보입니다. 자세한 사례는 이 곳에서 확인하실 수 있습니다.

각주 및 참고문헌

OneHot 인코딩과 예측 성능 비교

쉽게 다룰 수 있는 주제는 아니지만, 쉽게 요약은 할 수 있습니다. 설명변수가 많아질수록 모델 정확도가 떨어진다 정도로 해석할 수 있을 겁니다. ↩

물론 numpy array 형태로 값을 반환할 수도 있습니다. 만약 딥러닝과 같이 곧바로 array를 인풋으로 입력받는 상황이라면 초기 설정에 return_df = False 로 해줌으로써 가능합니다. ↩

계속해서 피쳐들을 정리해가면서 원핫인코딩을 적용을 하려고 해도, 로컬컴퓨터와 Colab에서는 메모리 부족의 에러가 발생하는 ipynb 파일입니다. ↩

Daum 블로그

​대부분의 바이너리 플랜에는 001, 002, 003 ····과같은 숫자화된 비지니스 센터(business center)라는 것들이 있다. 또한 바이너리 방식의 디스트리뷰터 들은 고정된 금액만큼의 상품을 구매하여 최고 세 개의 비지니스 센터를 확보 한 상태에서 출발할 수 있다.

001은 최고 자리의 센터로, 좌측에 하향 확장되고 있는 002와 우측에 역시 하향 확장되고 있는 003을 둔다. 또 002센터와 003센터는 각각 좌 002, 우 002, 좌 003, 우 003이라는 두 개씩의 후원계열을 둔다.

양측은 매출량을 쌓아가 한 주(한 달이 아니다)의 마지막에 측면별로 각 후원 계열에서 발생한 매출을 합하여 양측을 비교한다.

만약 '약한'측의(매출이 적은 측의) 후원계열이 커미션을 받을 수 있을 정도의 판매 실적을 올렸다면 당신은 그것에 대해 수당을 받게 된다. 이렇게 바이너리 방식은 약한 측의 후원계열이 달성한 판매 실적이 수당의 책정에 중요한 요인 으로 작용한다.

2. 특성 및 장단점​

​ ​ ​ ​
바이너리 방식은 분명히 다운라인 구축을 위한 가장 단순하고 자기증식성이 강한 시스템이 될 수 있는 좋은 초석이 된다.

두 명만 모집하고 한 명은 002에 또 한 명은 003에, 다음은 이 두 사람도 당신처럼 할 수 있도록 노력을 기울여라.

혹시 한 쪽이 약해지면 약한 쪽의 사람들을 더 많이 후원하라. 매우 간단 명료하다. 그러나 실제로 대부분의 디스트리뷰터들이 이것을 이해하는데는 상당한 시간이 필요하다.

바이너리 방식에서 가장 과장되게 알려져 있는 장점은 자신에게 상계될 수 있는 레벨의 깊이가 무한정이라는 것이다. 이것은 틀림없는 사실이지만 매우 깊은 레벨에서의 판매실적이 실질적으로 가져와 주는 수당은 무의미할 정도로 작다.

예를 들어 1000레벨 깊이까지 확장된 계열을 갖고 있다고 가정해 보자 (대부분의 바이너리 방식은 재등록이 가능하기 때문에 이 정도의 깊이도 가능한 일이다.).

여기서 자격이 안되는 비즈니스 센터나 이미 활동을 하지 않는 센터를 감안 하여 200레벨 정도만 1000레벨에서 판매실적에 대한 수당을 받을 자격이 있다 고 해도 실질적인 액수는 매우 작다는 것을 알 수 있다.

그렇다고 해서 바이너리 방식이 나쁘다는 결론은 곤란하다. 다만 겉으로 드러나는 장점들이 과장되어 해석될 가능성에 대한 경각심이다. 특히 이 방식은 직급보다는 판매액이 수당을 결정하는 요인이기 때문에 네트워크 마케팅 기업이 취급하는 제품에 따라서는 매우 적합한 보상플랜이 될 수 있다.

특히 회사가 소유하는 지불되지 않은 수당3)에 대한 수당을 어떻게 처리하느냐가 바이너리 방식의 또 한가지 중요한 요소이다.

​- 보상플랜에 대한 요약

​ ​장점 : ​ 1. 최고 3개의 비즈니스 센터를 확보한 상태에서 출발할 수 있다.

2. 분리 독립에서 생기는 수수료가 많다.

3. 레벨의 깊이가 무한정이다 .

4. 자신의 업라인이 다운라인이 될 수도 있다.

단점 : 1. 직급보다 판매액이 우선이다.

2. 구조가 복잡해서 리쿠르팅할때 ​설명하기가 어렵다.

통신비 절감은물론 더불어 월 정기적인 수익의 혜택을 얻으실 기회 입니다.
이런 부업도 있네요
무료가입으로 소득을 얻을수 있다고 하네요
가입시 추천인 010-5695-1881
하셔서 가입하시구요
지인들에게도 알려주세요~
스토아에서 커피톡 어플깔면됩니다~ ^^


0 개 댓글

답장을 남겨주세요