2015. 3. 31. 03:48

Introduction to the Domain Name System


Domain Name System (DNS)는 지속적으로 증가하는 인터넷 사용자를 수용하기 위해 설계되었다. DNS는 www.google.com 같은 명칭을 59.18.44.50 같은 IP 주소로 변환하여 (혹은 보다 확장된 IPv6 주소로 변환), 컴퓨터들이 상호 통신할 수 있게끔 하고, 월드 와이드 웹 같은 인터넷 어플리케이션을 사용할 수 있도록 해준다. DNS 의 역할은 마치 친구에게 전화를 하고자 할 때, 친구의 전화번호를 일일이 외울 필요가 없이 친구의 이름만으로 통화를 할 수 있게 해주는 것과 같다.


 DNS는 어떻게 동작하는가?

DNS를 이해하기 위해서 자신의 컴퓨터에 로그인하고 있는 사용자 홍길동을 상상해보자. 홍길동은 웹 브라우저를 실행해 근무하고 있는 회사인 Acme.co의 웹 사이트를 조회할 수 있다. 회사 홈페이지를 조회하기 위해서 웹 브라우저에 http://www.acme.com을 입력할 것이다.


  1. 홍길동의 컴퓨터는 DNS 서버에 www.acme.com 의 IP 주소를 알려달라는 요청을 전송할 것이다.
  2. DNS 서버는 www.acme.com 의 IP 주소인 192.168.1.4를 찾기 위해 위해 자체 데이터베이스를 확인할 것이다.
  3. 서버는 확인한 IP 주소를 홍길동의 브라우저에 반환한다.
  4. 브라우저는 IP 주소를 이용해 웹 사이트의 위치를 파악한다.
  5. 브라우저는 홍길동의 컴퓨터 모니터에 웹 사이트를 출력한다.



그림 : 도메인 명칭과 주소 (Domain Names and Addresses)


 도메인 (Domains)

홍길동은 DNS 서버가 www.acme.com의 IP 주소를 주소를 알고 있기 때문에 회사 홈페이지에 접근할 수 있다. DNS 서버는 도메인 네임스페이스(domain namespace)를 검색해 회사 홈페이지 서버의 주소를 알아낸다. DNS 는 각각 이름이 부여된 도메인(domain)이라는 노드(node)로 구성된 트리 구조(tree structure)로 설계되어 있다. 트리의 최상위 노드는 DNS 루트 도메인(DNS root domain)이다. 그 아래에 .com, .edu,, .gov, .mil 같은 하위 도메인(sub domain)들이 존재한다.




그림 : 도메인 명칭 시스템 계층도 (The Domain Name System Hierarchy)


정규화된 도메인 이름(Fully qualified domain name : FQDN) 은 모든 네트워크 도메인 명칭이 루트까지 점(.)으로 연결된 문자열이다. FQDN 은 인터넷에 존재하는 모든 호스트(host)들을 구분하는 고유한 명칭(unique name)이다. 예제 도메인의 FQDN은 sample.com 이며, 부모 도메인은 .com 이고, 루트 도메인은 "." (dot)이다.


 Acme.co 회사의 주소 학습


홍길동의 서버가 www.acme.com 의 IP 주소를 요청하는 과정을 좀 더 자세하게 살펴보자.



그림 : DNS 계층도 검색 (DNS Hierarchical Name Search)


  1. 로컬 DNS 서버는 www.acme.com 도메인이 자체 데이터베이스에 등록되어 있는지를 확인한다. 만일 찾을 수 없다면, 해당 도메인을 관리하고 있지 않다는 것을 알게 된다.
  2. 로컬 DNS 서버는 루트 네임서버(root nameserver)에 최상위 레벨의 도메인 "."(dot)에 대한 정보를 요청한다.
  3. 루트 네임서버는 .com 도메인 및 하위 도메인을 관리하는 .com 네임서버에 요청하도록 지시한다.
  4. .com 네임서버는 acme.com이 자신의 하위 도메인임을 확인하고, acme.com 도메인을 관리하는 네임서버의 위치를 알려준다.
  5. 로컬 서버는 acme.com 네임서버에 www.acme.com 서버의 위치를 요청한다.
  6. acme.com 네임서버가 IP 주소 192.168.1.4를 알려준다.
  7. 로컬 서버는 최종적으로 검색한 IP 주소를 홍길동의 웹 브라우저에 반환한다.


 도메인 등록 (Establishing a Domain)

Acme.co 는 홍길동이 접속할 수 있는 웹사이트를 운영하고 있는데, 이는 해당 도메인이 공인된 도메인 관리 회사(업체)에 등록되어 있기 때문이다. 또한 .com 서버의 데이터베이스에 도메인 명칭을 등록하고, IP 주소 범위를 규정하는 네트워크 번호(network number)를 요청했다. acme.com이 부여받은 네트워크 번호는 192.168.1.0이며, 이는 192.168.1.1 부터 192.168.1.255 까지를 포함한다. IP 주소는 옥텟(octet) 이라고 부르는 4개의 숫자로 구성되어 있고 각 숫자(번호)는 0부터 256까지 사용할 수 있다. 그러나, 0과 256는 브로드캐스트(broadcast) 및 네트워크 자체를 위해 예약되어 있으므로 호스트의 주소를 지정하는데 사용할 수 없다. 


 도메인과 존(zone)의 차이 

도메인 네임스페이스는 DNS 트리의 특정(일부) 영역을 나타내는 존(zone)으로 구분되어 있다. 존은 특정 지점의 하위에 존재하는 모든 도메인을 포함한다. 


각 존은 일반적으로 해당 존을 관할하는 하나 이상의 네임서버를 가지고 있다. 각 기관(혹은 기업)은 복수의 네임서버를 소유(및 운영)할 수 있지만 인터넷 클라이언트들을 루트 네임서버가 알고 있는 (혹은 루트 네임서버)에 등록된 네임서버에만 주소 검색을 요청할 수 있다. 루트 네임서버에 등록되지 않은 서버들은 각 기관의 내부에서 자체적인 용도로 사용된다.


Acme.co 회사는 acme.com 이라는 도메인을 등록했다. 또한 acme.com, marketing.acme.com 및 finance.acme.com이라는 3개의 존을 구성했다. Acme.co 는 마케팅 및 재무 부서에 marketing.acme.com 및 finance.acme.com DNS 서버에 대한 관리 권한을 위임하였다. acme.com에 속한 누군가가 marketing.acme.com 내에 존재하는 호스트의 주소를 요청하면, acme.com은 주소 요청을 marketing.acme.com으로 유도할 것이다. Figure 13-4 acme.com은 3개의 존으로 구성되어 있으며, acme.com 존은 자체에 대한 관리만을 수행한다.



그림 :  Acme.com With Delegated Subdomains


Acme.co 는 하위 도메인(subdomain)들에 대한 관리 권한을 위임하지 않을 수도 있다. 이런 경우, acme.com 도메인은 marketing 및 finance 을 관리하는 존이 된다. acme.com 서버는 마케팅 및 재무 영역에 대한 주소 요청에 대해서도 응답한다.


그림 : Acme.com Without Delegation


존을 설정할 경우, 각 존에 네임서버를 필히 설정해야 한다. 각 존 마다 로컬 설정 데이터베이스를 가지고 있는 하나의 기본 네임서버(primary server)가 있어야 한다. 각 존은 기본 네임서버로부터 복사한 데이터를 가지고 있는 여러 개의 보조(secondary) 서버를 가질 수 있다. 다음 그림은 하나의 보조 서버를 구성한 사례이다.




그림 : Primary and Secondary Servers for Zones


 네임서버

DNS는 클라이언트/서버 모델을 기초로 만들어졌다. 네임서버는 DNS 데이터베이스를 저장하고 있으며, 네트워크를 통해 IP 주소를 요청하는 클라이언트에 해당 정보를 제공한다. 네임서버는 물리적 서버에서 실행되는 프로그램이며, 존 데이터(zone data)를 저장한다. 도메인의 관리자는 하나 이상의 존에 위치한 호스트들에 대한 정보를 표현하는 Resource Records (RR) 데이터베이스를 네임서버에 구성(입력)한다.


그림 : Client/Server Name Resolution


DNS 서버는 호스트 명칭을 주소로 변환하는 기능 혹은 명칭 식별 기능을 제공하며, 정규화된 도메인 명칭(FQDN)을 이용해 주소를 변환한다. 만일 로컬 네임서버가 변환을 요청 받은 명칭에 대한 데이터를 가지고 있지 않을 경우, 찾을 수 있을 때까지 다른 네임서버에 질의한다. 일반적으로 IP 주소 변환은 네임서버가 도메인 네임스페이스에 대한 질의 내역을 캐시(cache)에 담아두고 있기 때문에 매우 빠르게 수행된다.


각각의 존은 필수적으로 기본 네임서버가 존 내의 호스트들에 대한 정보를 담고 있는 데이터베이스를 가지고 있으며, 복수의 보조 서버들은 기본 서버 데이터의 복사본을 저장하고 있다. 기본 서버의 정보를 이용해 보조 서버의 데이터를 최신 상태로 업데이트하는 작업을 존 전송(zone transfer)라고 한다.



그림 : DNS Zone Transfer


보조 네임서버가 기본 서버의 백업 역할을 수행할지라도, 두 가지 서버 모두 존에 대한 관리를 할 수 있다. 두 서버 모두 주소 변환 요청을 수행하면서 얻는 정보(RR) 뿐만 아니라, 존 데이터베이스의 호스트 정보를 활용한다. 클라이언트는 두 가지 종류의 서버에 모두 주소 변환을 요청할 수 있다.


네크워크 관리 기관(업체, Network Registrar)의 DNS 네임서버에 자체 네임서버를 등록할 때, 존의 기본 서버, 보조, 혹은 캐시 기능만을 수행할 지 지정할 수 있다. 각 네임서버의 유형은 어떤 역할을 지정하느냐로 구분된다. 하나의 서버가 어떤 존의 기본 서버이면서 다른 존의 보조 서버가 될 수 있다. 기본 혹은 보조 서버의 역할만을 수행하거나, 존에 대한 관리 서버가 아니라 캐시(cache)를 이용해 주소 변환만을 수행하는 기능을 수행할 수도 있다.


▶ 참조 문서

  http://www.cisco.com/c/en/us/td/docs/net_mgmt/network_registrar/6-2/user/guide/Userguide/UG15_DNS.pdf


Posted by 곽중선
2015. 3. 26. 23:50

온라인 소스 코드 공유 사이트에 대해 지원 언어와 기능, 특징 등을 중심으로 소개한다. 소스 코드 공유 사이트는 다양하나, 소스의 문법을 강조해주는 기능 이외에 컴파일 및 실행 지원, SNS를 통한 소스 링크 공유, 선택적 공유, 회원 가입을 통한 히스토리 관리 등 세부적인 기능 면에서 차이가 있으므로 취향에 따라 선택해서 사용하면 된다. 또한 각 사이트가 지원하는 언어 종류를 확인해 두는 것이 좋다.

소스 코드 공유 사이트의 용도는 다음과 같다.


  • 인터넷에서 발견한 쓸만한 코드 저장 해두기... (책갈피, 갈무리)
  • 공용 PC에서 작업하는데 컴파일러, IDE가 없을 경우, 간단한 코딩 및 테스트.
  • 내가 짠 소스를 친구에게 보내거나 받아볼 때, 코드 리뷰하기 위해 공유할 때...
  • 4. 블로그 등에 소스 붙여넣기 하는데 이쁘게 보이도록 문법 강조를 하거나, SNS에 물어보고 싶을 때...

▶ pastebin.com

  : 지원 언어 - 238가지.

   기능 및 특징 - 페이스북 계정 연동. 심플한 사용자 인터페이스. 광고 있음.


 codepad.org

  : 지원 언어 - C, C++, D, Haskell, Lua, OCaml, PHP, Perl, Plain Text, Python, Ruby, Scheme, Tcl

   기능 및 특징 - 온라인 컴파일러/인터프리터 그리고 간편한 협업 도구이다, 소스를 코드패드에 붙여넣고 실행하면, 짧은 URL (short URL)을 얻을 수 있고, 링크를 채팅이나 이메일을 통해 공유할 수 있다. 비밀/공개 링크 선택 가능. 광고 없음.


 gist.github.com

 : 지원 언어 - 대략 많다.

   기능 및 특징 - Git 저장소와 연동되는 소스 코드 공유 서비스. GitHub 계정 보유자에게 유용함. 비밀/공개 링크 선택 가능. 광고 없음.

 ideone.com

 : 지원 언어 - 60가지 프로그래밍 언어(어셈블리에서 클로져까지..)

  기능 및 특징 - 온라인 코드 컴파일/디버깅 툴. 회원 가입은 페이스북 연동 방식이며, 원하는 친구와 제한적 공유 가능하며 SNS 를 통한 공유가 간편함. 광고 있음.


 dpaste.com

 : 지원 언어 - Python. Framework: Django. Syntax coloring: Pygments. Base 32 conversion for IDs: basewhat. Hashing for IDs: MurmurHash. WSGI server: Gunicorn. Reverse proxy web server: nginx. Database: SQLite. Administration tooling: Fabric. Process control: Supervisor. Version control: Mercurial. Project hosting: Bitbucket. Static hosting: Amazon S3. Application hosting: JohnCompanies FreeBSD VPS. 

 기능 및 특징 - 단순히 문법 강조(syntax highlighting) 및 소스 공유 기능만 제공심플한 사용자 인터페이스와 간편한 사용법. 광고 없음.


 colorscripter.com

 : 지원 언어 - Action Script, ASP, C, C#, CSS, HaXe, HTML, Java, JavaScript, JSP, Objective C, Perl, PHP, Python, Ruby, SQL, Swift, Visual Basic.
  기능 및 특징 - 한국(한글) 사이트. 다양한 언어를 하이라이트하여 소스 코드를 더 보기좋게 블로그 등에 업로드 할 수 있다. Color Scripter는 네이버 블로그등 <script> 태그가 지원되지 않아 Syntax HighLighter를 사용할 수 없는 곳에서도 사용할 수 있으며, 간단한 설정만으로 자신이 원하는 방식으로 소스코드를 하이라이팅 할 수 있다. Adobe Air로 PC 버전을 다운로드 받아 설치할 수 있다.


▶ joel.franusic.com/Online-REPs-and-REPLs

 : 소스 코드 공유 사이트를 
프로그래밍 언어 별로 분류해 놓은 즐겨찾기 모음 사이트.

Posted by 곽중선
2015. 3. 26. 21:46

Git, GitHub 초보자를 학습 사이트 및 자료 모음. (제보해주시면 추가합니다.)



Posted by 곽중선
2015. 3. 25. 18:01

▶ 시스템 엔지니어(SE : System Engineer)라는 역할은 무엇인가?


IT 분야에서는 다양한 역할을 수행하는 사람들이 공존한다. 일반적으로 IT를 대표하는 직종은 프로그래머이나, 그외에도 다양한 역할을 수행하는 사람들이 함께 일하고 있다. 그중에서 시스템 엔지니어는 프로그래머가 아니나 프로그래머와 가장 밀접한 관계를 맺고 일하는 사람들이다. 이들은 프로그래머가 개발한 소프트웨어(혹은 서비스)가 동작할 수 있도록 기반 시스템(base system) 혹은 인프라 구조(infra structure)를 설계 및 구축하고 운영하며 늘 정상적으로 동작하는지 감시하는데다가 끊임없이 보수한다. 예기치 못한 장애로 인해 어느 한 부분에 장애가 발생하면 문제를 파악하고 고치기도 하며 - 때로는 하드웨어 뿐만 아니라 소프트웨어 오류 또한 관리하고 수정한다 -, 노후한 부분에 대한 보수 및 장비 교체 등을 주도하기도 한다. 시스템이 최고의 성능을 발휘할 수 있도록 튜닝(tunning)하는 역할 또한 이들의 몫이다.


프로그램을 개발하는 것도 아니고, 아름다운 그래픽을 만들어 내는 디자이너처럼 화려하지도 않고, 전체 팀을 총괄하는 프로젝트 매니저처럼 세련된 모습도 아니며 눈에 띄지 않고 조용히 자신의 역할을 수행하는 사람들이지만, 너른 바다를 항해하는 거대한 여객선 밑에서 묵묵히 엔진을 움직이는 사람들처럼 그들의 책임은 막중하다. 물에 떠 있기만 한 배는 아무 의미가 없지 않은가? 발전소가 멈추면 도시가 암흑에 빠지듯 시스템 엔지니어가 서버를 제대로 운영하지 않으면 인터넷에 연결된 소프트웨어 사용자들은 패닉에 빠지고, 모든 기업을 업무가 마비되고 마는것이다. 휴대폰 통화와 항공기 운항 등 거의 모든 문명을 지탱하고 있는 사람들이라 칭할 수 있다.


▶ 무엇을 배워야 하고, 어떤 일을 하는가?


IT 시스템이라는 단어는 네트워크, 하드웨어 그리고 운영체제와 서버 소프트웨어를 포함하는 포괄적인 단어이다. 일부 보안 관련 기술에 대한 이해가 필요한 경우도 있기 때문에 시스템 엔지니어가 배워야할 지식은 실로 방대하다.


시스템의 가장 하위 기술은 네트워크 기술이다. 인터넷 상에서 서버와 PC 그리고 모바일 기기들이 어떻게 서로 통신하는지, 인터넷 주소 체계와 프로그램 간에 데이터를 주고 받는 규약인 인터넷 프로토콜 등 네트워크 기반 원리를 우선 이해해야 한다. 이러한 이론적 배경 위에서 실제 데이터를 주고 받는 스위치, 라우터 등의 장비들을 설치하고, 정상적으로 동작하도록 적절한 설정을 수행하며, 정상적인 통신 유무를 판단하기 위한 관리 및 모니터링 기술들을 익힌다. 네트워크 분야는 그 자체로 매우 전문화 되어 있기 때문에 깊이 학습하면 네트워크 만을 전문적으로 설계, 구성하고, 또 관리하는 네트워크 설계 및 관리 엔지니어로 진출할 수 있다. 이러한 전문가들은 유/무선 통신사, 케이블 TV 사업자, 인터넷 망 사업자, 클라우드 서비스 등 거대 기업에 소속되어 거대한 네크워크의 일부를 설계하거나, 관리하는 업무를 맡는다. 인터넷 데이터 센터(IDC) 등에서 수백/수천 대의 서버 간의 네크워크를 통제하고 주시하는 업무를 수행하기도 한다.


네트워크가 갖추어진 상태에서 필요한 것, 그 다음에 논할 주제는 하드웨어이다. 하드웨어는 소위 말하는 서버 컴퓨터를 떠올릴 수 있지만, 대용량 저장 장치, 백업 장치, 네트워크 스위치와 라우터, 그리고 방화벽 등 네트워크에 연결되거나 그 위에서 동작하는 다양한 요소들이 존재한다. 하드웨어를 다루는 업무를 담당하는 직군은 다양한 회사 혹은 기관에 소속되어, 그 나름의 역할을 담당하게 된다.


가장 먼저 떠올릴 수 있는 역할은 하드웨어를 제작하고 판매하는 회사에 근무하는 엔지니어들이다. IT 분야의 하드웨어, 그중에서 소위 엔터프라이즈(enterprise) 영역이라고 부르는 기업 및 공공기관에서 사용하는 장비들은 개인이 사용하는 것들에 비해 성능, 용량, 가격 등에서 큰 차이가 있다. 이러한 장비들은 냉장고나 TV와는 다르다. 전원만 꽂는다고 동작하는 것도 아니고, 사용 매뉴얼만 읽어보고 쓸 수 있는 것도 아니다. 제품을 설치하고, 각종 설정을 하고 네트워크에 연결하고, 설치 후에 문제가 발생했을 사후 지원하는 기술지원 엔지니어가 필요한 것이다. 따라서, 대다수의 하드웨어 제조사들은 자신들이 판매하는 제품에 대한 전문 기술지원 팀을 운영하고 있다. 이러한 부류의 업체 중에서 우리가 쉽게 떠올릴 수 있는 기업들은 IBM, Oracle, HP 등이 있다. 다만, 안타깝게도 이들 회사의 한국 지사에서 근무하는 기술지원 엔지니어는 거의 없다고 보면 된다. 직접 하드웨어를 판매하기 보다는 벤더(vendor)라고 불리는 판매 대행사들이 직접 고객을 상대하기 때문에 기술지원 엔지니어들은 벤더 사에 소속된 경우가 많다.


대규모의 하드웨어를 운영하는 공공(정부,공기업)/기업(금융,게임,온라인쇼핑,제조,포털 서비스등등)/기관(학교/재단), 그리고 서버 호스팅 업체 등에서 상주 근무하는 하드웨어 엔지니어들도 있다. 이들의 역할은 지속적으로 서버 및 네트워크 등 인프라 상태를 확인하고 관리하는 것이다. 착각하기 쉬운 점은 서버라는 것이 충분한 전원과 항온항습기를 통한 적정한 외부 환경만 갖추어지면 잘 동작할거라 믿는 것이다. 기계도 간혹 오동작을 하는데다, 지속적으로 다양한 작업을 처리하다 보면 데이터가 쌓이기에 시간이 지남에 따라 불필요한 정보를 삭제해야 하고, 주기적을 백업해야 한다. 노후 장비를 찾아서 교체해야 하며, 장비가 변경될 때마다 이런저런 설정을 계속 고쳐줘야 한다. 사용 중인 소프트웨어가 변경되면 그에 따른 다양한 조치는 말할 것도 없다. 대규모의 시스템을 운영하는 기업(예를 들어 포털/컨텐츠/게임/쇼핑 서비스 등)이 자체적으로 IT 인프라를 설계하고, 운영하는 조직을 가지고 있다면, 단지 서버를 관리하는 역할을 담당하는 엔지니어들 이외에 시스템을 설계하는 팀이 있기 마련인데, 이들이 하는 일에 대해서는 TA(Technical Architect)에 대해 이야기할 때 자세히 다루도록 하겠다.


앞서 이야기한 IT 담당자들은 이미구축되어 있는 하드웨어와 소프트웨어를 운영하는 역할을 수행한다. 그러나, 사업 분야가 확장되거나, 법령이 바뀌거나, 모바일 등 새로운 서비스 채널을 만들어야 하거나, 업무 수행 방식이 대폭적으로 바뀌는 등의 새로운 비즈니스 요구가 발생했을 때, 그에 걸맞는 시스템을 재구축 하기에는 역부족이다. 한국 IT 업계에서는 이렇게 조직의 소프트웨어 및 하드웨어 전체를 새로 설계/구축하는 일을 차세대 프로젝트라고 부른다. 차세대 프로젝트 요구가 발생하거나, 일부 비지니스를 새로 시작해야 할 때 외부 용역 업체의 도움을 받게 되는데, 이럴 때 나타나 해결사 역할을 수행하는 기업들이 SI(System Integration, 한국에서만 사용하는 IT 용어이며 외국에서는 IT Outsourcing이라는 용어를 사용함) 회사들이다. SI 회사에서 소속되어 잠재 고객의 현재 시스템 구조를 진단하고, 새로운 요구사항에 맞추어 네트워크 및 하드웨어 설계를 진행하는 엔지니어들이 있다. 이들을 System Engineer 라고 부르기도 하고, 최근 들어서는 TA (Technical Architect)라고 부른다. (간혹 Architecture라고 잘못 지칭하는데 Architect가 역할/직책을 나타내는 정확한 표현이다.) 참고로, Architect는 TA(Tehchnical Architect), DA(Data Architect)., AA(Application Architect),. QA(Quality Architect) 등의 역할이 존재한다.


SI 회사에서 TA의 역할은 기존에 구축된 시스템의 네트워크 및 하드웨어 설계와 세밀한 설정, 용량 등을 검토한 후, 새로운 비즈니스를 수행하고자 하는 고객의 요구에 맞추어 시스템 아키텍쳐(구조)를 재설계하는 것이다. 고객이 제시하는 예산이 허용하는 범위 내에서 가장 고급스러운(?) 장비를 선정해 납품할 수 있어야 하며, 기존 네트워크 구성의 문제점을 파악해 새로운 네트워크 구조를 제시한다. 새로운 장비가 몇 년 간 문제없이 동작할 수 있다는 것을 보증하기 위해 서버의 메모리, CPU 등의 용량을 계산하여 얼마나 많은 부하(load)를 감당할 수 있는지 계산하기도 한다. 고객 측과 계약이 이루어져 시스템 구축 프로젝트를 수행하게 되면, 하드웨어와 네트워크가 원활히 동작하도록 각종 설정을 수행하고, 운영체제를 설치 및 설정하며, 웹/웹 어플리케이션 서버 등의 소프트웨어를 설치한다. 서버가 일정 수준 이상의 부하를 감당할 수 있는지 확인하기 위해 성능 테스트(performance test)를 수행하고, 결과 보고서를 제출하는 것도 이들의 몫이다. SI 기업에 소속된 TA 들이 고객사의 시스템을 설계하는 서비스를 제공하는 반면에, 자체 서비스를 구축 및 운영하는 기업에 속한 이들은 소속 회사의 시스템을 설계하는 일을 한다는 점이 다르다.


이제 다음에 논할 이야기는 소프트웨어에 관련된 것이다. 기업에서 사용하는 소프트웨어의 종류는 다양한다. 서버용 운영체제(유닉스,리눅스,윈도우), 웹 서버, 웹 어플리케이션 서버, APM(Application Performance Monitoring), 데이터베이스, BPM(Business Process Management), 그룹웨어(groupware), ERP(Enterprise Resource Planning), 이미지 처리 소프트웨어(image processing software), 문서관리시스템(Electronic Document Management System), 문서보안, EAI(Enterprise Application Integration), MCI (Multi Channel Interface), 그외에 산업 분야 별로 특화된 소프트웨어들을 나열하자면 수백/수천가지의 소프트웨어 제품들이 존재한다. 이러한 소프트웨어 역시 기업에서 사용하기 위해서는 설치, 환경설정, 문제해결 그외에 다양한 기술지원을 필요로 하고, 그에 기술지원 담당 엔지니어들이 있기 마련이다.


SI 기업에서 고객사 소프트웨어 인프라를 검토하고, 새로운 아키텍쳐 설계를 담당하는 사람들이 AA(Application Architect)이다. AA는 고객사의 업무를 수행하는데 있어 가장 적합한 소프트웨어들을 선정하는 역할을 최우선적으로 수행한다. AA 역할을 수행하며 기업용 소프트웨어 구조를 설계하기 위해서는 다양한 소프트웨어 관련 이론들을 이해해야 하며, 어느 정도 하드웨어 지식 또한 갖추어야만 한다. 자료구조와 알고리즘에 대한 기초 지식을 이해해야 소프트웨어의 성능을 예측할 수 있고, 성능 문제 발생시 합리적인 판단을 수행할 수 있다. 운영체제를 설치할 수는 없더라도 운영체제의 다양한 명령어를 다룰 줄 알며, 각종 설정을 이해하고 있어야 한다. 운영체제를 모르면 최적의 성능을 이끌어 낼 수 없는데다, 소프트웨어/하드웨어들이 서로 충돌했을 때 원인 파악이 불가능하다. 네트워크 이론과 실전 지식을 갖추지 못할 경우, 다양한 소프트웨어가 통신하는 기업 환경을 설계할 수 없다. (네트워크 영역은 TA/AA가 함계 설계하고 구축한다.) 다양한 소프트웨어 제품들의 기능을 이해하고, 오픈소스들의 장단점을 파악하고 있어야 고객 환경에 최적의 구성을 제안할 수 있다.


AA가 소프트웨어 아키텍쳐를 설계할 때 사용하는 소프트웨어들은 앞서 이야기한 다양한 기업에서 파는 제품일수도 있고, 오픈소스를 활용할 수도 있다. AA는 오픈 소스를 다룰 줄 알아야 하고 기능을 이해하며, 필요하면 수정할 수도 있어야 하기 때문에 TA와 달리 프로그래밍 역량을 필요로 한다. TA와 마찬가지로 자신에 설계하고 제시한 구조가 합리적이고 충분한 성능을 발휘할 수 있다는 것을 증명해야 하므로, TA 와 함께 성능 테스트를 수행하고 각종 소프트웨어의 설정을 수정하거나 필요하면 수정하는 작업을 통해 성능 최적화(performance optimization)을 실시한다.


개략적으로 SE의 역할과 필요한 지식을 요약했다. 충분치 못한 부분은 추후에 보완할 생각이고, 다행히 아직은 밥은 먹고 산다.

짤방(?) 원작자 - 김국현 블로그 

Posted by 곽중선
2015. 3. 24. 00:38

▶ 직렬화 기술 이해

  • 직렬화란 무엇인가?
    컴퓨터 과학, 그중에서 데이터 저장소(data storage)의 맥락에서, 직렬화는 객체의 상태 혹은 데이터 구조를 기록할 수 있는 포맷(예를 들면 파일 또는 메모리 버퍼,  또는 네트워크 연결 링크를 통해 전송될 수 있는 형태)으로 변환하며, 나중에 동일 혹은 다른 컴퓨터 환경에서 재구성할 수 있게끔 하는 절차이다.

    직렬화의 결과로 생성된 연속된 비트 데이터는 원래의 객체와 동일한 의미를 가진 객체를 생성하는데 사용된다. 광범위한 참조를 사용하는 복잡한 객체의 경우,  직렬화 과정이 간단하지 않다. 객체지향 프로그램의 객체들을 직렬화할 경우 객체와 불가분의 관계를 맺는 메소드들은 직렬화 대상에 포함되지 않는다.

    참조 링크 : 위키피디아 - serialization

  • 직렬화는 왜 중요한가?
    직렬화는 인터넷이 보편화된 시대에 빼놓을 수 없는 기술이 되었다. 거의 모든 소프트웨어는 네트워크를 통해 데이터를 주고 받고 있다. 따라서, 프로그램의 구현하는데 필요한 기반 기술 중에서 빼놓을 수 없게 되었다. 게다가 직렬화는 네크워크 의존성이 높은 소프트웨어일 경우, 전체 성능을 좌우할 수도 있는 중요한 기술이다. 

  • 마샬링(marshalling)과의 차이점
    마샬링과 직렬화는 원격 프로시저 호출(remote procedure call)이라는 맥락에서는 대략적으로 비슷한 단어이다, 의도적인 측면에서는 그 의미가 다르다. 
    깊이 얘기해 보자면, 마샬링은 이곳에서 저곳으로 인자(parameter)들을 전달하는 작업이고, 직렬화는 구조적인 데이터를 원시형(primitive) 형태에서 바이트 스트림과 같은 형식을 복사하는 작업이다. 이러한 의미에서 직렬화는 마샬링의 pass-by-value 개념을 구현하는 수단이다.

    참조 링크 : 스택오버플로우 - 직렬화와 마샬링은 어떻게 다른가?

  • 분산 컴퓨팅의 흑역사 (COM and CORBA)
    COM (Component Object Model)컴포넌트 객체 모델 (COM)는 마이크로소프트에 의해 1993 년에 도입된 소프트웨어 컴포넌트에 대한 바이너리 인터페이스(binary interface) 표준이다. 다양한 프로그래밍 언어로 작성된 프로세스 간 통신 및 동적 객체 생성을 가능하도록 하는 기술이다. COM 표준은 OLE, OLE 자동화(automation), ActiveX, COM+, DCOM, 윈도우 쉘, DirectX, UMDF 및 윈도우 런타임 등 여러 가지 다양한 Microsoft 기술 및 프레임 워크의 기초가 된다.

    참조 링크 : 위키피디아 - COM

    CORBA (Common Object Request Broker Architecture)
    Common Object Request Broker Architecture (CORBA)는 Object Management Group(OMG)에 의해 정의된 다양한 플랫폼 상에서 동작하는 시스템 간의 통신을 용이하게 하기 위한 표준이다. CORBA는 서로 다른 운영 체제, 프로그래밍 언어, 컴퓨팅 하드웨어 위에서 동작하는 시스템들이 협업(collaboration)할 수 있게 해준다. CORBA는 캡슐화와 재사용 등 객체지향 프로그래밍과 동일한 설계 목표를 가진다. CORBA를 사용하는 시스템은 객체지향 프로그램일 필요는 없지만, CORBA 자체는 객체지향 모델을 사용한다. CORBA는 분산 객체 패러다임의 사례이다.

    참조 링크 : 위키피디아 - CORBA

  • 직렬화 적용 분야
    직렬화가 적용되는 분야는 구체적으로 다음과 같다.

    파일 저장소 (File storage) :  프로그램 실행 중에 생성된 데이터를 영구 저장소(파일 시스템) 등에 저장한 후, 이후에 프로그램이 다시 실행되었을 때 저장된 데이터를 메로리 상에 객체(혹은 구조체) 형태로 복구해 사용한다.

    네트워크 통신 (Network communication)네크워크 상에 떨어져 있는 프로그램 간에 데이터를 주고 받기 위해 데이터를 직렬화한 후, 패킷(packet)에 담아 전송한다.

    데이터베이스 (Database)복잡한 형태의 객체를 데이터베이스에 저장할 때 직렬화한 문자열 형태로 테이블의 컬럼에 저장하기도 한다.

    웹 환경 (Web environment) : 웹 서버에서 브라우저(클라이언트)로 구조화된 데이터를 전송할 때 직렬화 한 후 -JSON 형식 등- 전달하는 방식이 점차 많이 사용되고 있다.

  • 직렬화 기법 선택 시 고려할 점
    다양한 직렬화 기법(프레임워크)가 존재하며 특정 기술을 선택해서 적용해야만 한다. 직렬화 기법을 선택하는데 활용할 수 있는 기준들은 다음과 같다. 

    단순성 (simple) : 사용하기가 복잡하지 않아야 한다. 직렬화를 위해 추가해야 할 코드가 적거나, 이상적인 것은 기존 코드를 변경하는 작업이 아예 없어야 한다.

    경량 (compact) : 프레임워크(혹은 라이브러리)의 규모가 작아야 한다. 라이브러리 혹은 프레임워크의 크기가 작다는 것(small foot-print)은 시스템에 대한 추가 부담(overhead)가 적어지므로 소규모의 시스템 - 이상적인 것은 안드로이드 같은 모바일 시스템까지-에서 구동될 수 있는 확률을 높다는 것을 의미한다.

    유연성 (flexible) : 다양한 데이터 타입을 직렬화할 수 있어야 한다. 한정된 자료형(숫자 타입, 문자열 타입 등)만 직렬화할 수 있다면, 도입 자체가 불가능하거나, 혹은 개발/테스트 단계에서 뒤늦게 오류를 유발하여 프로젝트 실패의 원인이 될 수도 있다.

    버전지원 (viersioning) : 객체의 데이터 구조는 설계 및 개발, 나아가 유지보수 단계에서 변화할 수 있다. 객체의 구조가 변경되더라도 클래스의 명칭을 변경하지 않고 새로운 버전을 부여할 수 있고, 서로 다른 버전의 객체들을 자동으로 변환(직렬화 및 역직렬화)해주는 기능을 프레임워크에서 제공해 줄 경우, 시스템의 유지관리가 용이해진다.

    속도 (fast) : 처리 속도가 빠르면 빠를수록 좋다!

    확장성 (scalable) : 복잡하거나, 거대한 형태의 데이터를 직렬화 할 수 있어야 한다. 예를 들어 메모리 사용량이 많아, 직렬화 대상 객체가 증가함에 따라 메모리 부족(out of memory)를 유발한다면 심각한 수준의 문제로 인해 직렬화 프레임워크를 사용할 수 없게 된다.

  • 직렬화 데이터 형식
    직렬화된 데이터는 다양한 형식(foramat)으로 표현될 수 있다.

    Binary : 메모리에 저장된 데이터를 최소한의 가공 혹은 가공 없이 바이트의 연속된 형태로 저장하는 방식이나, 사람이 읽기 불편하기 때문에, 데이터의 무결성(integrity)을 검사하기 어렵다.

    JSON (JavaScript Object Notation) : 텍스트 형식이므로 사람과 기계 모두 읽기 가능하다. 다양한 프로그래밍 언어에서 읽고 쓸 수 있기 때문에 널리 사용된다. XML 에 비해 파싱(parsign) 속도가 빠르다. 참조 링크 : 위키피디아 - JSON

    XML (eXtensible Markup Language) : 텍스트 형식이며, JSON에 비해 복잡하다. JSON에 대해 가지는 장점은 스키마(schema)를 적용할 수 있어, 데이터 구조의 무결성을 검사할 수 있다는 점이다. 참조 링크 : 위키피디아 - XML

    YAML (YAML Ain't Markup Language) :  XML에 비해 사람이 읽고 쓰기 쉽도록 고안된 마크업(markup) 언어이다. 문법이 상대적을 단순하고, 가독성이 높게 설계되어 있다. 참조 링크 : 위키피디아 - YAML

  • 구현 기법에 따른 성능 차이
    직렬화는 내부적으로 사용하는 구현 기법에 따라 속도가 달라진다. 다음에 나열된 순서대로 점차 처리 속도가 느리다.

    Native memory copying using C operations : 객체가 할당되어 있는 메모리 영역 자체를 복사하기 위해 C 함수를 사용한다.

    “Unsafe” operationsUnsafe Java 는 본래 자바 코어 개발자들이 low-level 프로그래밍 하기 위해 만든 API이다. JNI(Java Native Interface) 와 비슷하거나 유사한 수준의 성능을 내는 자바 코딩 기술이며 자바의 캡슐화 기반의 보안을 무시할 수 있다는 장점 등이 있어서 몇몇 라이브러리에서 사용되었다. 참조 링크 : Unsafe Java

    Ignore object introspectionintrospection 은 reflection과 유사한 기술이다. 다만, introspection 은 자바의 instanceof 연산자 처럼 객체의 타입 정보만 조회하는 것이고, reflection 은 메타 정보 조회 뿐 아니라, 객체에 대한 조작 기술까지를 의미한다.

    Direct object-object copying : 자바 코드로 객체 내의 모든 멤버 변수를 복사하는 로직을 구현하는 것이다.


  • "성능"! 왜 성능이 가장 중요한가?
    앞서 다양한 직렬화 프레임워크 중에서 한가지를 선택하기 위한 다양한 지표를 제시하였으나 , 가장 중요한 평가 기준은 성능이다. 성능은 왜 중요한가? 성능이 바로 '비용(cost)'에 직결되기 때문이다. 비용은 소프트웨어의 성패를 좌우하는 매우 중요한 요소이다.

    CPU 비용 : 메모리에 존재하는 바이너리 형태의 객체를 디스크 등에 저장할 수 있는 형태 (텍스트 등)로 저장하기 위해서는 변환(transform) 처리 과정이 필요하며, 반대의 처리 또한 필요하다. 객체를 스캔(scan)하고, 데이터 타입을 문자열로 변환하거나 반대의 작업은 CPU 자원을 소모하는데다가 데이터 형식(format)이 복잡할수록 긴 시간을 소모한다.

    메모리 비용 : 변환 작업을 수행하는 과정에서 임시 버퍼(temporary buffer)를 할당하고, 네트워크를 통한 송수신 과정에서 스트림 처리 등에 따른 공간 할당이 필요하다. 메모리 및 각종 통신 자원을 할당하고 해제하는 일은 상당히 많은 자원을 소모하는 작업이므로 보다 적은 메모리를 사용하는 것이 좋다. 

    네크워크 비용 : 직렬화를 수행하는 대다수의 프로그램 혹은 시스템은 네트워크를 통해 데이터를 주고 받게 된다. 네트워크 송수신에 있어서 패킷(packet)의 크기가 커질수록 전체 성능은 떨어진다.


▶ 직렬화 프레임워크 개요

  • JDK (Serializable)
    • 프로그래밍하기 가장 쉽고, Serializable 인터페이스를 이용해 별도의 라이브러리 없이 즉시 사용할 수 있다.
    • 클래스를 릴리즈(release)한 후에는 구현을 변경하기 어려워 유연성(flexibility)을 감소시킨다.
    • C++, 파이썬(python)등 다른 언어로 구현된 프로그램과 데이터를 교환(exchange)할 수 없다.
    • 기본 연산자의 취약점(hole)으로 인해 불변 값이 손상되거나, 비정상적인 접근이 발생할 수 있다.
      (invariant corruption and illegal access)
    • 커스터마이징(customization)이 불가능하고, 소스 코드를 수정할 수 있어야 한다.

  • Java externalization
    • 객체를 저장(persist) 및 복구(restore)하는 Externalizable 인터페이스를 구현해 직접 직렬화를 구현한다.
    • 인스턴스의 컨텐츠를 저장하고 복구하는 역할을 수행하는 클래스를 구현해야 한다.
    • 클래스의 구조가 변경될 때 마다, 읽고 쓰는 코드를 수정해야 한다.

      

  • Google GSON
    • 자바 객체를 JSON으로 변환하거나 반대의 작업을 수행하는 자바 라이브러리.
    • 직렬화된 객체의 소스 코드를 필요로 하지 않는다.
    • 커스텀 표현(custom representatives)을 지원한다.

       

  • Jackson
    • 고성능, 인간공학적 JSON 프로세서 자바 라이브러리
    • 광범위한 커스터마이징 툴 지원
    • 혼합 어노테이션 (Mix-in annotations)
    • 실체화된 인터페이스 (Materialized interfaces)
    • 다양한 데이터 포맷 : JSON, CSV, Smile(binary JSON), XML, YAML

  • BSON for Jackson
    • 바이너리 인코딩된 JSON (Binary encoded JSON)
    • 몽고 DB의 주된 데이터 교환 포맷 (Main data exchange format for MongoDB)
    • 확장 프로그램 작성 가능 (Allows writing custom extensions)

  • Protocol buffers
    • 구조적인 데이터를 확장가능하며 효율적인 포맷을 변환하는 방법 제공
    • 구글 내부에서 대부분의 내부 RPC 프로토콜과 파일 포맷에 Protocol Buffers를 사용 중.
    • Java, C++, Python 지원

  • Kryo
    • 빠르고 효율적인 객체 그래프 직렬화 자바 프레임워크
    • 구글 코드 상의 오픈 소스 프로젝트
    • 자동화된 깊고 얕은 복사/복제 (Automatic deep and shallow copying/cloning)
    • 소스 클래스에 대한 코드 작성 요건이 거의 없음
      (Doesn’t put requirements on the source classes in most cases)

▶ 성능 비교 분석


Posted by 곽중선
2015. 3. 22. 13:17

▶ Apache Tika 예제 테스트

  • 다양한 문서에서 메타 정보와 컨텐츠를 추출하기 위해 사용할 수 있는 유용한 라이브러리는 아파치 Tika이다.
  • Docar 프로젝트에 Tika를 적용을 위한 사전 검증으로서 프로젝트 환경 설정 및 예제 테스트를 수행한다.

▶ 프로젝트 환경 설정 및 예제 작성

  • Maven 환경 설정
    : 프로젝트 내에서 Tika를 사용하기 위해 의존성(dependencies)을 설정한다. 2015년 3월 기준, 아파치 Tika의 최신 버전은 1.7 이다.

     	<!-- [end] 아파치 Tika 라이브러리 -->
      <properties>
     	<tika.version>1.7</tika.version>
      </properties>
    
            <!-- [start] 아파치 Tika 라이브러리 -->  	
     	<dependency>
     		<groupId>org.apache.tika</groupId>
     		<artifactId>tika-core</artifactId>
     		<version>${tika.version}</version>
     	</dependency>
     	<dependency>
     		<groupId>org.apache.tika</groupId>
     		<artifactId>tika-parsers</artifactId>
     		<version>${tika.version}</version>
     	</dependency>
    


  • 예제 코드 작성
    : MS Word 문서 파일 읽어들여, 메타 데이터를 검출하고 컨텐츠를 추출하는 예제는 다음과 같다.

    package docar.archive.extraction;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.tika.exception.TikaException;
    import org.apache.tika.metadata.Metadata;
    import org.apache.tika.parser.AutoDetectParser;
    import org.apache.tika.parser.ParseContext;
    import org.apache.tika.parser.Parser;
    import org.apache.tika.sax.BodyContentHandler;
    import org.xml.sax.SAXException;
    
    public class AutoDetectionExample {
    	public static void main(final String[] args) throws IOException,
    			SAXException, TikaException {
    		Parser parser = new AutoDetectParser();
    
    		System.out.println("------------ Parsing an Office Document:");
    		extractFromFile(parser, "/demo.doc");
    	}
    
    	private static void extractFromFile(final Parser parser,
    			final String fileName) throws IOException, SAXException,
    			TikaException {
    		long start = System.currentTimeMillis();
    		BodyContentHandler handler = new BodyContentHandler(10000000);
    		Metadata metadata = new Metadata();
    		InputStream content = AutoDetectionExample.class
    				.getResourceAsStream(fileName);
    		parser.parse(content, handler, metadata, new ParseContext());
    		for (String name : metadata.names()) {
    			System.out.println(name + ":\t" + metadata.get(name));
    		}
    		System.out.println(String.format(
    				"------------ Processing took %s millis\n\n",
    				System.currentTimeMillis() - start));
    		System.out.println("------------ content of document\n" + handler.toString());
    	}
    }
    


▶ 추가 고려 사항

  • 다양한 문서 형식에서 추출할 수 있는 메타 데이터에서 '문서관리 시스템'에서 활용할 수 있는 유용한 후보(candidates)들은 다음과 같다. : "Content-Type", "Author", "Last-Modified", "Creation-Date", "title"
  • "Content-Type" : 파일 형식 별 검색을 위해 필요한 정보이므로 필수 항목이다.
  • "Author" : "작성자" 혹은 "저자" 정보는 MS-Office 등의 문서 형식에서 부정확한 경우가 많다. 예를 들어 타인이 작성한 문서를 복사 및 편집한 후 저장한 문서일 경우에는 원래 파일의 작성자 정보만이 남아 있게 된다. 따라서, 부수적인 정보로 취급해야 한다.
  • "Creation-Date" : 문서의 생성일자는 특정 기간에 생성된 문서를 검색하는데 유용한 정보이다.
  • "Last-Modified" : 문서의 최종 변경일자는 버전 관리를 위해 필요한 정보이다. 문서 저장소에 저장된 파일과 입력된 파일을 비교해서 입력된 파일의 변경일자가 저장소의 파일보다 나중인 경우에는 새로운 버전으로 문서 저장소에 추가해야 한다.
  • "title" : 제목 또한 부정확한 정보가 될 수 있다. 앞서 작성자 정보와 마찬가지로 복사한 파일을 편집한 후에 저장하면 이전 작성자의 정보가 그대로 남아있게 된다.

▶ 참조 링크 및 이클립스 프로젝트 (소스 다운로드)


Posted by 곽중선
2015. 3. 21. 13:21

▶ Non Functional Requirement

  • "성능 측정(performance estimation) 혹은 프로파일링(profiling)"은 서비스 혹은 어플리케이션이 '실용적인지 여부'를 판단하는 기준이 된다. 아무로 기능 면에서 좋은 소프트웨어라고 할지라도 필요한 시스템 사양(specification)이 과다하다면 써먹을 수 없다. 혹은 실행 속도가 느리다면 환영 받지 못할 것이다. 
  • 성능 측정을 모든 기능을 개발한 후에 수행하게 되면 2가지 문제가 발생할 수 있다.

    • 성능 문제를 해결하는데 필요한 시간이 부족해서, 최초에 수립한 일정을 지키기 못하거나,
    • 문제를 해결할 수 없어서 실패한 프로젝트가 되고 마는 것이다. 

  • 따라서, 성능 측정 준비는 기능 설계를 진행하면서 함께 준비하고, 기능 구현 과정 중에 몇 차례에 걸쳐 성능을 측정함으로써 중간 과정에서 취약점(weak point)가 어느 부분인지, 어떤 기능으로 인해 급작스럽게 성능이 하락하는지 검사하는 것이 현명하다.


▶ 성능에 대한 핵심 개념과 사전 지식

  • "성능(performance)"를 좌우하는 2가지 요소는 "공간"과 "시간"이다. 프로그래밍에서 "공간"이라는 개념은 프로그램이 소모하는 메모리(작게는 메인 메모리, 크게 보면 디스크와 네트워크)이며, "시간" 개념은 얼마나 CPU 자원을 오래 사용하는가 이다.
  • 따라서, 소프트웨어 성능은 "메모리 사용량(공간")과 "CPU 사용량(시간)" 등 2가지 측정 지표(metrics)가 존재한다.
  • 개발자가 작성하는 "코드"가 얼마나 많은 "공간"과 "시간"을 필요로 하는가에 대해서는 "알고리즘"과 "자료구조" 지식을 통해 이론적으로 예측할 수는 있으나, 다음과 같은 조건에 따라 "같은 문제"라고 하더라도 실질적으로 상당한 차이가 발생한다.

    • 어떤 언어로 개발하는가?
      : 하위 수준 언어일수록 빠르고, 컴파일러(compiler) 방식의 언어가 인터프리터(interpreter) 언어보다 빠르다.
    • 개발자가 구체적으로 어떤 방법으로 구현했는가?
      : 구현 방식은 API 호출, 라이브러리 활용, 직접 구현 등 방식을 한정할 수 없다.
    • 어떤 컴파일러를 사용해서 컴파일 했는다?
      : 컴파일러에 따라서 기계어를 생성하는 로직이 다르다. 컴파일러 자체에 성능 최적화 기능이 포함되어 있는 경우도 많다.
    • 어떤 머신(machine)에서 실행하는가?
      : 게임과 같은 실수형 계산 및 그래픽 처리를 많이 하는 프로그램은 GPU 성능에 의존하는 경향이 있다.

  • 위와 같은 이유로 성능은 정적인 "코드"만으로 예측할 수 없기 때문에 실행하면서 측정하는 것이 가장 '정확하다'! 프로그램을 실행하면서 성능을 측정하고, 분석하는 행위를 "프로파일링(profiling)"이라고 하며, 프로그램의 성능을 측정하는 도구를 "프로파일러(profiler)"라고 한다. 프로그램의 성능을 측정한 후, 개선하는 작업을 "최적화(optimizing)"라고 한다.

▶ 성능에 대한 정의와 이해 at slideshare.net



▶ DIY Profiling at slideshare.net



▶ 성능 측정 유형

  • CPU 측정
    • Times/ Calls 
      : 함수 혹은 메소드가 얼마나 오랜동안 CPU를 사용하는가 혹은 얼마나 많이 호출되는가를 측정하는 것이다.
    • Sampling
      : 아주 짧은 시간동안 호출되는 함수의 수행 시간을 측정하면 해당 함수의 수행 시간을 왜곡하게 된다. (함수가 수행되는 시간보다 더 많은 시간을 측정하는데 소모하거나, 수행시간이 느린 것으로 잘못 판단할 수 있다.) 혹은 초당 10만번 이상 호출되는 함수들을 측정하고자 할 경우 샘플링(sampling) 기법을 사용한다. 샘플링 기법은 프로그램 수행 중 일정 주기 마다 현재 실행 상태 (실행 중인 위치 정보)를 기록하는 기법이다.

  • 메모리 측정
    • Usage
      : 메모리를 얼마나 "자주" 할당 및 해제하는가를 측정한다. 메모리의 할당 및 해제는 비용이 많이 드는 '비싼' 작업이다.
    • Allocation
      : 메모리를 얼마나 "많이" 할당하느냐를 측정한다. 메모리를 과다하게 할당할 경우 "메모리 부족(Out of memory)" 오류를 발생 시키거나, 스왑(swap) 메모리를 사용하게 되어 급격한 성능 저하를 유발하게 된다.


▶ 스스로 하는 성능 측정 (DIY Java Profiling)

  • 앞서 Romon Elizrov 의 자료에서 제시하는 프로파일링 기법들은 다음과 같다.

  • 자바 코드 내에서 성능 측정 코드 삽입 (Just code it in Java)
    : 개발자가 직접 성능을 측정하는 코드를 자바 코드 내에 삽입하는 방법이다.

  • 자바 가상 머신의 기능 활용 (Know your JVM features)
    : JVM 에서는 메모리 사용 상태 및 스레드(thread)의 실행 상태를 확인할 수 있는 기능(옵션)이 제공된다.

  • 바이트 코드 조작 활용 (Use byte code manipulation)
    : 자신이 작성한 프로그램이 아니거가 - 소스 코드가 없다거나 -, 이미 완성된 프로그램의 성능을 측정하고자 하는 경우에 사용되는 기법이다. 컴파일된 클래스 파일 (확장자가 .class)을 조작해서 성능 로그를 생성하는 코드를 삽입하는 기법이며, 자칫 JVM의 비정상 종료(crush)를 유발할 수 있기 때문에 조심스럽게 적용해야 한다.

▶ 프로파일링 클래스 구현

  • docar.util.profile.Profiler
    : 성능 측정 정보를 기록하는 싱글턴(singleton) 패턴의 클래스. addCallEvent() 메소드를 호출할 때마다, 특정 기능의 수행 횟수 및 누적 수행 시간을 기록한다.
  • docar.util.profile.StopWatch
    : 특정 기능(메소드, 클래스)의 수행 시간을 측정하는 클래스.
  • docar.uti.Report
    : 성능 측정 결과를 출력하는 클래스. "기능 명칭 및 호출 횟수", "총 수행 시간", "평균 수행 시간" 등을 출력한다.

  • 사용 방법 예시
    // 메소드 시작 부분에서 "기능 명칭"을 인자로 스톱워치 생성
    StopWatch stopWatch = new StopWatch("DuplicationFinder.main");
    
    // 메소드 종료 부분에서 수행 시간 기록(누적)
    Profiler.getInstance().addCallEvent(stopWatch.stop());
    
    // 수행 시간 측정 결과 출력
    Report.report(System.out);
    
    
  • 측정 결과 예시



Posted by 곽중선
2015. 3. 20. 03:15

▶ 로깅(logging) 설정 이전에 "이클립스 Maven 환경 설정"을 선행해야 한다.

▶ 로깅(logging 설정

  • pom.xml 파일에 slf4j 와 logback 의존성(dependency)를 추가한다.

    <dependencies>
  	<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>slf4j-api</artifactId>
  		<version>1.7.10</version>
  		<scope>runtime</scope>
  	</dependency>
  	<dependency>
  		<groupId>ch.qos.logback</groupId>
  		<artifactId>logback-classic</artifactId>
  		<version>1.1.2</version>
  		<exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
  	</dependency>
  	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>jcl-over-slf4j</artifactId>
	    <version>1.7.7</version>
	</dependency>
  </dependencies>
  • logback 설정파일(logback.xml)을 생성한다.
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="docar" level="DEBUG"></logger>
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
  • log 출력 테스트 코드를 작성한다. 

▶ Maven 설정 및 로그 설정 프로젝트 백업

DocAr_MavenAndLogging.zip


▶ 참고 링크 : SLF4J 로깅 처리



Posted by 곽중선
2015. 3. 20. 02:54
▶ 메이븐 기본 이해

메이븐(Maven)에 대한 기본 개념을 이해하기 위해서는 다음 슬라이드를 참조하기 바란다.


▶ 이클립스 메이븐 환경 설정


만일 이클립스에 메이븐이 설치되어 있지 않다면 다음 절차들을 따라하기 바란다.


  • https://www.eclipse.org/m2e/m2e-downloads.html 링크를 웹 브라우저에서 연다. 테이블 형태로 출력 m2e 플러그인 목록을 찾을 수 있을 것이다.
  • 가장 최신 버전을 선택하고, "p2 url" 컬럼의 URL 경로를 클립보드에 복사해둔다.

  • 이클립스로 돌아간 후, Help 메뉴를 선택하고 "Install New Software" 항목을 클릭한다.



  • "Add" 버튼을 클릭한 후, 아무 명칭이나 입력한다. "Location" 항목에 클립보드에 복사해둔 URL을 붙여넣는다.

  • 이전 단계에서 선택한 플러그인이 목록에 출력될  것이며, 앞에 표시된 체크박스를 체크한 후, "Next" 버튼을 클릭한다.

  • 설치가 진행되고, 설치가 완료되면 이클립스를 재시작한다.

  • 프로젝트를 우클릭하고, 설정(configure) 옵션 중에서 "convert to maven project"를 선택한다.

  • 새로운 POM을 생성하기 위한 "new wizard"가 나타날 것이다. 적절한 그룹 ID와 버전을 입력한다. "Packing as jar"를 선택한 후, "Finish" 버튼을 클릭한다.

  • Maven 프로젝트가 성공적으로 설치되었다. 이제 프로젝트가 성공적으로 Maven 프로젝트로 변환된 것이며, pom.xml 파일을 수정해야 한다.


Posted by 곽중선
2015. 3. 19. 18:19

Apache Tika 개요

  • 아파치 Tika는 문서 타입 검출 및 다양한 파일 형식에서 컨텐츠를 추출하는 기능을 제공하는 라이브러리이다.
  • 내부적으로, Tika는 현존하는 다양한 문서 파서(parse)들과 문서 타입 검출 및 데이터를 추출하는 기법들을 활용하고 있다.
  • Tika를 활용해 광범위한(universal) 타입 검출기 및 스프레드 시트, 텍스트 문서, 이미지, PDF 및 멀티미디어 입력 포맷 등의 다양한 형식의 문서에서 구조화된 텍스트와 메타 데이터를 추출할 수 있는 컨텐츠 추출기를 제작할 수 있다.
  • Tika는 다양한 파일 형식을 파싱(parsing)할 수 있는 단일 범용 API를 제공한다. 각각의 문서 타입을 처리하기 위해 83가지 전문화된 파서(parser) 라이브러리를 사용한다.
  • 이러한 파서 라이브리들은 Parser 인터페이스라는 단일 인터페이스 내에 캡슐화 되어 있다.


왜 Tika를 써야 하는가?

filext.com 에 따르면 1,5000 에서 51000 가지의 컨텐츠 타입이 존재하는 것으로 추정되며, 이러한 수치는 날마다 증가하고 있다. 데이터 텍스트 문서, 엑셀 스프레드 시트, PDF, 이미지, 멀티미디어 등 다양한 형식으로 저장 되어지고 있다. 따라서, 검색엔진과 컨텐츠 관리 시스템 등의 어플리케이션은 다양한 문서 타입에서 손쉽게 데이터를 추출할 수 있는 기능을 필요로 한다. Apache Tika는 다양한 파일 형식에서 데이터를 찾아내고 추출하는 범용적인 API를 제공하기 위해 만들어 졌다.


Apache Tika 어플리케이션들

다양한 어플리케이션들을 Tika를 이용해 만들 수 있다.


검색 엔진(Search Engine)

Tika는 검색 엔진이 디지털 문서들의 텍스트 컨텐츠를 색인하는데 사용된다.


문서 분석(Document Analysis)

인공 지능 분야에서는 문서를 자동으로 의미론(semantic)적으로 분석하고, 모든 유형의 데이터를 추출하는 도구들이 있다.

이러한 어플리케이션에서는 문서에서 추출된 컨텐츠에 포함된 중요한 용어들을 기반으로 문서들이 저절로 분류된다.

이러한 도구들에서 Tica는 문서를 분석하기 위해 컨텐츠를 추출하는 기능을 수행한다.


디지털 자산 관리 (Digital Asset Management)

어떤 기관들은 사진, e-book, 음악, 설계도, 그림, 비디오 등의 디지털 자산을 관리하는 특별한 어플리케이션을 사용하는데 이를 디지털 자산 관리 시스템이라고 부른다.

이러한 어플리케이션에서 문서의 타입 검출 기능과 다양한 문서들을 분류하기 위한 메타 데이터 추출기를 사용한다.


컨텐츠 분석(Contents Analysis)

Amazon 같은 웹 사이트들은 고객들의 관심사에 기반한 맞춤형 컨텐츠를 제공한다. 이렇게 하기 위해, 머신 러닝(machine learning) 기술을 적용하거나, Facebook 같은 소셜 미디어 네트워크의 도움을 받아 사용자의 기호(interest)와 좋아하는 것들에 대한 정보를 수집한다. 이렇게 수집된 정보들은 HTML와 그외의 다양한 형식으로 존재하며, 컨텐츠 타입 검출 및 추출 과정을 거치게 된다.

문서의 컨텐츠를 분석하기 위해 UIMA 및 Mahout 같은 머신 러닝 기술이 활용된다. 이러한 기술들은 문서의 데이터를 클러스터링하고 분석하는데 쓰인다.

Apache Mahout는 Apache Hadoop 위에서 Machine Learning 알고리즘을 제공하는 프레임워크이다. Mahout은 클러스터링 및 필터링 기술을 제공하며, 프로그래머들은 자신만의 고유한 ML 알고리즘을 이용해 다양한 텍스트와 메타데이터 조합을 이용해 추천 정보를 생산할 수 있게 된다. 최근 버전의 Mahout은 ML을 위한 입력 데이터를 생성하기 위해 Tika를 이용하고 있다.

Apache UIMA 는 다양한 프로그래밍 언어를 분석하고 처리하고, UIMA 어노테이션(annotations)을 생성한다. 내부적으로 Tika Annotator를 문서의 텍스트와 메타 데이터를 추출하기 위해 사용한다.


출처 : http://www.tutorialspoint.com/tika/tika_quick_guide.htm

Posted by 곽중선