2015.05.09 13:43

JBUG(JBoss User Group) 스터디 모임에서 "기업 통합 패턴 Enterprise Integration Patterns"을 번역하신 차정호 님의 강의를 듣는 귀한 기회를 얻었다.


 


강의 초반에 '알고리즘의 시대에서 패턴의 시대'로 변모하는 것이 아닌가 라는 말씀을 하신다. 소프트웨어 개발에 있어서 알고리즘(algorithm)와 패턴(pattern)은 모두 중요하다고 생각한다. 어느 한 쪽이 더 중요하다 하기도 어렵고, 두 가지 기술의 적용 범위 혹은 특징이 상이하지 않은가 라는 생각에 강의를 들으면서 짧은 노트를 적어 봤다. 거듭 말하지만 두 가지 기술은 반대되는 개념은 아니다, 다만 몇 가지 면에서 차이를 비교해볼 수 있다.


1.문제 풀이를 위한 공식(formula)인가? 아니면, 문제를 풀기 위한 행동 방식인가?


"알고리즘"은 개별적인 '문제(사례)를 해결하기 위한 논리와 기법'이다. 즉, 알고리즘은 문제 자체를 해결하는데 쓰인다. 알고리즘은 그 자체가 가치를 지닌다. 완성된 논리이며, 코드로 씌어졌을 때 즉각적으로 유용하다. "패턴"은 빈번하거나, 다양한 문제들을 해결하는 과정에서 발견된 문제 풀이에 도움을 주는'유용한 사례들'이다. 패턴은 소프트웨어 개발자 간의 의사 소통을 돕고, 문제 해결을 위한 실마리가 된다. 패턴은 문제 자체를 해결해주지는 않는다. 패턴을 현실 세계에 비유하자면 레고 블록과 같다. 개별 레고 블럭(패턴)은 가치가 없다. 그것들을 연결했을 가치가 생겨난다.


2. 상대적으로 좁거나 반대로 넓은 적용 범위


대다수의 "알고리즘"은 특정 문제를 해결하기 위해 고안된 것이다. 다양한 문제가 있다면, 그만큼 많은 알고리즘이 만들어진다. 하나의 문제에 대해서도 복수의 알고리즘이 있을 수 있다. 반면에 "패턴"의 적용 범위는 넓다. 특정 문제 자체를 위한 해결책이 아니라, 본래 다양한 사례를 조사하고 그 과정에서 반복적으로 쓰이는 기법을 문장의 숙어(idiom)처럼 골라낸 것이다. 요약하면, 알고리즘은 좁은(narrow) 범위를 해결하는데 사용되고, 패턴은 넓은(wide) 범위의 문제들을 해결할 때 유용하다. (어느 한 쪽이 우월하다고 해석해서는 안된다.)


3. 관습적이거나, 개성적이거나...


"알고리즘"이나 "패턴"이나 모두 문제 해결을 위한 도구이다. 그러나, "패턴"은 보다 관습적이다. 누군가 패턴을 제안하거나, 발견할 수 있지만 그것이 과연 유용한 것인지는 많은 개발자들의 선호도(?) 라거나, 지지 여부에 따라 가치가 달라진다. 반면에 알고리즘은 알고리즘을 고안한 사람의 개성을 뚜렷히 드러낸다. 또한 그 성능과 가치는 (대게) 객관적으로 조사 가능하다. 각각의 패턴을 속도라거나, 자원 사용량 등으로 비교할 수는 없는 노릇이다.


4. 논리적이거나, 직관적이거나..


알고리즘은 수학적으로 증명 가능해야 한다. 주어진 입력에 대해 정확한 출력 값을 내놓는다는 증거(혹은 테스트)를 거친다. 하지만, 패턴은 나름 인간적이다. 증명을 거치지 않는다, 오히려 아름다운지 여부를 판단한다. 알고리즘 또한 아름다울 수 있다. 수학적 혹은 코드의 아름다움은 정교할 뿐만 아니라 간결한 형태를 통해 완벽함, 경이로움을 느끼는 것이리라. 하지만, 패턴에서 느끼는 아름다움은 정교함 보다는 단순함, 그리고 완벽함 보다는 복잡한 세상에서 찾아낸 보편성에 대한 감탄이라고 표현할 수 있다.

Posted by 善 곽중선
2015.04.20 23:57

자바 필기 및 실기 문제

다음 내용은 위에 나온 문제 중에서 필기 6번 문제와 해설입니다.


[Q6] 아래 프로그램의 출력 결과를 적으시오.

 

public class SetValues {

   

    public static void main(String[] argv) {

 

        String stringObj = "Hello";

        int intValue = 0;

        Float floatObj = new Float(1.0);

 

        setValues(stringObj, intValue, floatObj);

 

        System.out.println( stringObj + ", "

                       + intValue + ", " + floatObj );

 

    }

 

    private static void setValues(String strValue, int intValue, Float floatObj) {

        strValue.replace("H", "h");

        strValue += " World";

        intValue = 99;

        floatObj.valueOf((float) 2.0);

    }

}

 

위 문제는 call by value, call by reference의 차이를 식별할 줄 아는지를 묻는 것이라고 착각을 유도하는 문제이다. 시험 응시자가 자칫 핵심을 잘못 간파해서 엉뚱한데 집중하지는 않는지 여부와 자바에서 제공하는 기본 메소드들의 동작 방식을 제대로 이해했는가 여부를 파악하고자 출제된 것이다.


아래 주석을 통해 객체가 어떻게 메소드 간에 전달되고, 어떻게 변화하는지를 설명하였다.
(
객체의 ID는 임의로 부여한 것이며, 실제 실행 중에는 달라질 수 있다.)

 

public class SetValues {

   

    public static void main(String[] argv) {

 

        // stringObj (object id = 15)

        String stringObj = "Hello";

        // intValue (, 객체 아님)

        int intValue = 0;

        // floatObj (object id = 16)

        Float floatObj = new Float(1.0);

 

        setValues(stringObj, intValue, floatObj);

 

        System.out.println( stringObj + ", "

                       + intValue + ", " + floatObj );

     }

  

    // strValue (object id = 15), call by reference 방식으로 전달

    // intValue (, 객체 아님), call by value 방식으로 전달

    // floatObj (object id = 16), call by reference 방식으로 전달

    private static void setValues(String strValue, int intValue, Float floatObj) {

 

        // replace 메소드는 새로운 String 객체 (object id = 17) 만들어 반환하지만,

        // 변수에 반환 값이 할당되지 않으므로, 무시됨.

        strValue.replace("H", "h");

 

        // += (문자열 조합) 연산자를 실행하면, 새로운 객체(object id = 18) 생성되며,

        // strValue (지역변수) 참조하는 객체는 object id = 18 변경됨.

        strValue += " World";

       

        // intValue 변수는 기본형(primitive type)이므로, intValue 변수에 저장된 값이

        // 99 변경됨.

        intValue = 99;

 

        // Float 클래스의 valueOf() 메소드는 static 메소드이며,

        // 2.0 값을 지니는 새로운 Float 객체 (object id = 19) 생성해 반환함.

        // 반환된 객체는 어느 변수에도 할당되지 않기 때문에 무시됨.

        floatObj.valueOf((float) 2.0);

    }

}

 

결국 메인 함수로 복귀(return)하게 되면, setValues 함수 내에서 생성된 모든 객체는 무시되고, setValues 메소드 호출 이전 상태의 값들이 그대로 출력된다.

Posted by 善 곽중선
2015.04.17 20:15

예전에 모 대기업 의뢰를 받아 "중급 자바 개발자 실력 검증"을 위해 출제한 문제들입니다.


필기 문제 20문항과 실기 문제 1문항으로 이루어져 있으며, 

자바 문법 / 객체지향 이해도 / 자바 프로그램의 동작 원리 이해 등을 묻는 질문으로 구성했습니다.


[MS 워드 형식]


JAVA 필기문제.docx


JAVA 필기문제_답안.docx


JAVA 실기문제.docx


AddressBook_exam.zip


[PDF 형식]


JAVA 필기문제.pdf


JAVA 필기문제_답안.pdf


JAVA 실기문제.pdf


Posted by 善 곽중선
2015.03.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.03.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.03.26 21:46

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



Posted by 善 곽중선
2015.03.16 22:45

로깅(logging)은 "비 기능 요구사항(Non Functional Requirement)"에 속한다. 그러나 고객의 요구 여부에 상관없이 로그 출력 기능은 프로그램 개발 중 디버깅 및 개발 완료 후 문제 발생 시 원인 분석을 위해 좋은 프로그램이 필수적으로 갖추어야 하는 요구조건에 속한다.


로깅이란 무엇인가? How To BeAProgrammer 발췌


로그 기록(logging)이란 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동을 말한다. 프린트 줄 넣기(printlining)는 간단한, 보통은 일시적인, 로그를 생성하기만 한다. 완전한 초보자들은 프로그래밍에 대해 아는 것에 한계가 있기 때문에 로그를 이해하고 사용해야 한다. 시스템 설계자들은 시스템의 복잡성 때문에 로그를 이해하고 사용해야 한다. 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정 가능해야 한다. 일반적으로 로그 기록은 다음의 이점이 있다.

  • 그는 재현하기 힘든 (예를 들어, 개발 완료된 환경에서는 발생하지만 테스트 환경에서는 재현할 수 없는) 버그에 대한 유용한 정보를 제공할 수 있다.
  • 로그는, 예를 들어, 구문(statement)들 사이에 걸리는 시간과 같이, 성능에 관한 통계와 정보를 제공할 수 있다.
  • 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여 다시 적용하지(redeploy) 않아도, 일반적인 정보를 갈무리할 수 있게 한다.


    자바에서 로그를 출력하는 방법

    초보자들은 System.out.print() 메소드를 이용해 실행 중 다양한 입출력 및 변수 값들을 출력한다. System.out.println 명령은 출력되는 로그의 양(혹은 수준)을 조절할 수가 없고, 표준출력(standard out)을 통해 출력하는 것은 로그를 파일 등에 저장하기도 불편하고 성능 면에서도 낮은 편에 속한다.


    자바 개발자를 위한 로깅 라이브러리는 이미 다양하게 개발되어 있기 때문에 직접 로그 출력 기능을 개발하는 것은 무의미하다. 다만, 다양한 라이브러리 중에서 적합한 것을 고르는 안목이 필요하다. 


    널리 쓰이는 로그 출력 라이브러리

    다양한 오픈 소스 로그 라이브러리가 존재하지만, 그 중에 널리 쓰이는 것들이 있기 마련이다.

    • java.util.logging
      JDK(Java Development Kit) 1.4 버전부터 자바에 포함된 표준 로그 API 이다. 별도의 라이브러리를 추가할 필요가 없다는 점이 장점이나, 다른 것들이 더 많이 사용되는 이유는 아마도 제공하는 기능이 가장 적다는 이유 때문일 것이다.
      Java Doc 혹은 Java Logging API - Tutorial 사이트를 참조하길 바란다.

    • Apache Commons logging
      아파치 재단(Apache Foundation)이 웹 서버(Apache Web Server)나 톰캣(Apache Tomcat) 서버만 제공하는 것이 아니다. 오히려, 아파치 재단에서 제공하는 다양한 오픈 소스 자바 라이브러리들이 아파치 재단의 영향력을 잘 보여준다. 그중에서 Commons 라이브러리는 프로그램의 기초를 단단히 다지고자 하는 학생에서는 멋진 도서관이다. Commons 라이브러리 중에서 로그 출력 기능을 제공하는 라이브러리가 Commons Logging 이다. Apache Commons logging 공식 홈페이지를 참조하길 바란다.

    • Log4j
      재밋는 사실은 아파치 재단에서 제작되는 로그 라이브러리가 하나 더 있다는 점이다. log4j 는 로그 라이브러리 중에서 가장 성공적이고 널리 사용된 라이브러리일 것이다. (공식 통계는 없지만....) Log4j 공식 홈페이지는 역시 아파치 사이트 중 하나이다. 참고로 Log4j version 2 부터는 JAVA 6 이상을 필요로 한다.

    • Logback
      Log4j를 만드신 분은 Ceki Gülcü 인데, Log4j를 만들어 놓고 더 좋은 라이브러리를 새로 만들게 된 것이 logback 이다. 오픈 소스 진영은 이렇듯 "창조적 파괴"가 빈번히 일어나기 때문에, 이미 잘 알고 있거나 오래도록 쓰고 있던 기술이 있더라도 항상 더 나은 기술이 나오지는 않았는지 살펴보는 주의력이 필요하다. 자칫 뒤떨어지기 마련이다. Logback 홈페이지는 다른 라이브러리에 비해서 매뉴얼이 상세한 편이다. 그만큼 제공하는 기능이 많다는 점은 확실히 부담스럽다.

    • 세상의 모든 로그 라이브러리
      남들이 쓰지 않는 특이한 것에 관심이 있다면 거의 모든 오픈 소스 로그 라이브러리 목록 : 
      Open Source Logging in Java 을 참고하면 된다.

    로그 라이브러리를 갈아끼울 수는 없을까?
    컴퓨터에 설치된 소프트웨어는 언제나 지우고 다른 제품을 설치할 수 있다. 그렇다면, 로그 라이브러리도 필요에 따라 갈아끼울 수는 없을까? 이런 생각을 하는 사람들이 분명 있다. 앞서 설명한 바와 같이 오픈 소스 진영에서 계속 새로운 라이브러리가 나오고 있으니 말이다.
    로그 라이브러리를 갈아 끼울 수 있게 만드려면 무엇이 필요할까? 혹은 어떤 선행 조건이 필요한가? 전기 콘센트에는 TV, 냉장고, 세탁기, 그외에 다양한 전자제품을 연결할 수 있다. 콘센트와 플러그가 호환만 된다면 말이다. 플러그는 제품에 붙어 있지만, 콘센트는 항상 벽에 붙여 있다. 이렇듯 프로그램에서 콘센트 역할을 하는 모듈과 플러그 역할을 하는 모듈을 분리하면 언제든 기능을 교체할 수 있다.

    그래서 콘센트 역할 - 이것을 디자인 패턴에서 사드(facade) 패턴이라고 한다 -을 하는 라이브러리가 나오게 되었고 SLF4J 라고 한다. SLF4J 자체는 로그를 출력하는 기능을 제공하는 것이 아니다. (콘센트가 있다고 저절로 냉장고가 생기는게 아닌 것처럼...) 하지만, 다양한 로그 라이브러리를 골라가며 쓰고 싶다면 한번쯤 공부해볼 만한 기법이다. 실제로 다양한 오픈 소스 제품들이 SLF4J를 활용하고 있다.


    그외에 읽을만한 거리...

    로거(logger)쯤은 이미 잘 활용하고 있기에 끝까지 한 달음에 읽었다면 다음 글들도 한 번 읽어보시길 권한다.

    logback을 사용해야 하는 이유

    아키텍처 설계: Logback을 활용한 Remote Logging


    SLF4J 로깅 처리


    Logging framework logback

    Posted by 善 곽중선
    2015.02.20 14:15
    소프트웨어 개발자가 알아야할 기본 지식들을 정리한 문서들입니다.
    일부 완성되지 못한 문서들이 있으나 계속 업데이트될 예정입니다.


    Posted by 善 곽중선
    2015.02.20 14:04


    0. 컴퓨터 시스템

    1. API (Application Programming Interface)

    2. 라이브러리 (Library)

    3. API vs. Library

    4. 프레임워크 (Frameworks)

    5. 통합개발환경(IDE : Integred Development Environment)

    6. 지속적인 통합 (continuous integration)

    7. 소셜 코드 공유

    .... and more

    Posted by 善 곽중선
    2015.02.20 14:01



    • 소프트웨어 기술 요소
    • 학사 커리큘럼에서 익힐 수 있는 것들
    • 전공 필수와 선택, 우선 순위는?
    • 소프트웨어 개발자 직무의 다양성과 변화
    • 소프트웨어 개발자 직무별 필수 기술 요소
    • 직무 유형별 필수 기술 정리
    • 학생으로서 공부해야 할 것들


    Posted by 善 곽중선