본문 바로가기

Language/Java

Apache Commons Library

효과적인 자바 개발을 위한 Apache Commons Library


자바는 Java Development Kit(JDK)라는 라이브러리를 기본적으로 제공해 자바의 효율성을 극대화하도록 설계됐다. 객체지향 개념을 이해하고 라이브러리를 학습하면 다양한 프로그램을 손쉽게 개발할 수 있다. 이번 시간에는 기본적인 자바 라이브러리를 활용해 좀더 고수준의 프로그램을 개발할 수 있도록 도와주는 Apache Commons Library에 대해서 알아보도록 하자.

김흥래 hrkim3468@gmail.com|NHN I&S에서 근무하고 있다. 최근에는 스프링 프레임워크와 안드로이드 플랫폼에 관심이 많으며 현재 자바카페 커뮤니티 운영진으로 활동하고 있다.

처음 자바 API 문서를 보면 방대한 라이브러리에 주눅이 든다. 라이브러리를 구성하고 있는 수백 개의 클래스 수에 한번 놀라게 되고 다양한 분야를 지원한다는 점에 또 한번 놀라게 된다. 지난 십수년 간 자바가 발전해오면서 자바 API 또한 다양한 방식으로 발전해왔다. 자바 API는 Java Development Kit(JDK)라는 형태로 배포된다. JDK의 경우 플랫폼에 따라 Enterprise Edition(Java EE API), Standard Edition(Java SE API), Mobile Edition(Java ME API)의 세 가지 형태로 분류가 된다. 

자바 기본 API 외의 추가 라이브러리를 학습해야 하는 이유
JDK에서 제공하는 공식 API로도 대부분의 프로그램을 구현하는 것에는 문제가 없다. 하지만 많은 개발자들이 추가적인 라이브러리를 학습해 사용하고 있다. 그 이유는 무엇일까

첫째, 내가 구현할 대부분의 기능은 이미 누군가 개발해 놓았다. 전 세계적으로 수많은 프로그램이 개발되고 있으며 내가 필요한 기능을 누군가 개발해 놓았을 확률 또한 높다. 이미 구현된 기능을 중복적으로 개발하는 것은 비효율적이다.
둘째, 대중적으로 사용되는 라이브러리는 이미 검증된 코드로 이뤄져 있다. 많은 사람들이 사용함으로써 대부분의 버그가 수정되고 발전 속도가 빠르다.
셋째, 대중적인 라이브러리는 코드의 효율성이 높다. 다수의 개발자가 코드를 수정해 코드가 최적화돼 있다. 그러므로 작성하는 프로그램의 기능을 좀더 탄탄하게 구현할 수 있다.

Enterprise Edition은 기업용 애플리케이션을 제작하기에 적합한 API들로 구성돼 있어 대용량 Transaction 처리나 Enterprise Java Beans(EJB) 등을 개발하는 데 사용된다. Standard Edition은 기본적인 API들로 구성돼 일반적인 애플리케이션을 제작하기에 적합하다. 또한 Mobile Edition은 모바일용 애플리케이션을 개발하기에 적합한 API들로 구성됐다. 

이번 시간에는 Standard Edition(Java SE API)을 기준으로 프로그램 개발 시 좀더 효율적인 코드를 작성하기 위한 Apache Commons Library에 대해서 알아보자.

Java SE API
Java SE 플랫폼은 다양한 형태의 라이브러리들로 구성됐다. 애플리케이션 구성을 위한 기본적인 Lang and Util, 다양한 입·출력 처리를 위한 I/O, 데이터베이스 핸들링을 위한 JDBC, UI개발을 위한 AWT 패키지 등 개발에 필요한 대부분의 API를 제공하고 있다. 

<그림 1> Java SE 플랫폼(참고 : www.oracle.com/us/techhologies/java)

각각의 API에 대해 이번 시간에는 간략하게 소개하겠다. 

Java.lang 패키지
자바 프로그래밍을 위한 기본적인 클래스를 모아둔 패키지로 import 키워드를 이용해 명시적으로 작성하지 않아도 자동적으로 포함된다. Java.lang 패키지에 수록된 클래스들 중에서 대표적인 클래스들을 알아보자.

● Object 클래스 (java.lang.Object)
- 모든 자바 클래스의 부모 클래스다.
- 모든 자바 클래스는 Object 클래스의 메소드를 포함하고 있다.
- 주요 메소드 : equals(), hashCode(), toString()

● String 클래스 (java.lang.String)
- 문자열 처리를 위한 가장 기본적인 클래스다.
- 자바의 기본형처럼 사용이 가능하다.
-  주요 메소드 : equals(), compareTo(), indexOf(), substring()

● Wrapper 클래스
- 자바의 기본형과 대응되는 클래스들을 통칭하는 개념이다.
- 기본형을 객체처럼 다루기 위해 제공된다.
- Byte(), Short(), Integer(), Long(), Float(), Double(), Character (), Boolean()

Java.util 패키지
개발 시 항상 필요한 유틸리티 클래스들을 모아둔 패키지로 날짜 처리, 리소스 관리 및 수학적인 연산 등 프로그램 개발 효율성을 위한 클래스들이 제공된다. 또한 강력한 콜렉션 클래스들을 포함하고 있다.

● Date 클래스
- 날짜와 시간을 관리하는 클래스다.
- 주요 메소드 : getYear(), getHours(), getMinutes(), getSeconds()

● ArrayList 클래스
- 배열과 비슷한 개념의 클래스다.
- 저장 순서가 유지되고 종복 데이터 저장이 가능하다.
- 주요 메소드 : add(), set(), get(), remove()

Java.io 패키지
스트림 기반의 입·출력 모델을 제공한다. 다양한 형태의 입·출력을 처리할 수 있으며 파일 시스템을 다룰 수 있는 클래스들이 제공된다. 자바 1.4부터 NIO(New I/O) API가 추가됐는데 메모리 버퍼를 이용한 채널이라는 개념으로 고성능의 입·출력 프로그램의 개발이 가능해 졌다.

● File 클래스
- 파일을 핸들링하기 위한 클래스다.
- 파일의 생성, 삭제, 수정 등이 가능하다.
- 주요 메소드 : createNewFile(), delete(), exists(), getName()

● FileInputStream 클래스
- 파일스트림을 입력받기 위한 클래스다.
- 주요 메소드 : read(), close(), getFD()

● FileOutputStream 클래스
- 파일스트림을 출력하기 위한 클래스다.
- 주요 메소드 : write(), close(), getDF()

Apache Commons Library
Commons Library(http://commons.apache.org/)는 아파치 재단에서 관리하고 있는 라이브러리로 프로그램 개발 시 재사용 가능한 자바 컴포넌트들을 모아둔 라이브러리다. 아파치 재단에서는 프로젝트에서 유틸리티 클래스와 공통적으로 사용되는 기능 등을 다른 프로젝트에서 재사용 가능하도록 컴포넌트 형태로 개발해 Apache Commons Library라는 이름으로 배포하고 있다. 대부분의 아파치 프로젝트에서는 중복 개발을 피하기 위해 Commons Library를 기본적으로 사용하고 있고, 전 세계적으로도 많은 개발자들이 Commons Library를 사용하고 있다. 그 숫자는 지금도 증가하고 있으며 Commons Library는 구글 라이브러리와 더불어 전 세계적으로 가장 많이 사용되고 있는 라이브러리다. 

아파치 소프트웨어 재단 (The Apache Software Foundation)
아파치 재단(www.apache.org/)은 아파치 HTTP 서버를 포함한 아파치 소프트웨어 프로젝트를 지원하는 비영리 재단이다. 이곳에서 개발되고 있는 소프트웨어는 전 세계의 개발자들에 의해 자발적으로 개발돼 오픈소스로 공개된다. 아파치 재단에서 개발된 대표적인 소프트웨어는 다음과 같다.

· Apache Web Server : 웹서버
· iBatis : SQL 쿼리를 POJO로 맵핑하는 ORM 프레임워크
· Lucene : 자바로 제작된 검색 엔진
· Tomcat : 서블릿 컨데이너
· Maven : 프로젝트 빌드 시스템
· Hadoop : 대용량 처리를 위한 분산 데이터저장소

현재 Commons Library는 40여개의 컴포넌트로 구성돼 있으며 각각의 컴포넌트를 필요에 따라서 선택적으로 적용하는 것이 가능하다. Commons Library를 구성하고 있는 컴포넌트들은 다른 라이브러리와의 의존성을 최소화하기 위해 설계됐으며 버전업에 따른 하위호환성을 유지하기 위해 API Interface를 안정적이고 효율적으로 구성하고 있다. Apache Commons 공식사이트(http://commons.apache.org/)에 접속하면 Commons Library는 3개의 파트로 분류돼 있다. 첫 번째 파트는 ‘The Commons Proper’라고 불리며 현재 공식적으로 사용되고 있는 컴포넌트들을 모아둔 파트다. 두 번째 파트는 ‘The Commons Sandbox’라고 불리며 새롭게 구현 중인 컴포넌트들만을 모아둔 파트다. 마지막으로 세 번째 파트는 ‘The Commons Dormant’로 현재 사용하지 않는 컴포넌트들을 모아둔 파트다. Commons Library를 사용하고자 하는 경우 ‘The Commons Proper’ 파트에 속한 컴포넌트를 사용하면 된다.

<그림 2> Apache Commons Library 중 가장 많이 사용하고 있는 컴포넌트(참고 :  www.antelink.com/blog/apache-commons-ues-case.html)

<그림 2>는 대표적인 코드 저장소인 Google Code (http:// code.google.com/)와 소스포지(http://sourceforge.net/)에 공개된 약 16만 개의 오픈소스 프로젝트 중 Commons Library가 사용된 프로젝트를 분석해 시각적으로 표현한 것이다. 상대적으로 크게 표현된 컴포넌트가 많이 사용되는 컴포넌트다.

Commons Library에 포함돼 있는 컴포넌트 중 가장 많은 사용률을 보이는 컴포넌트를 기준으로 TOP5를 뽑으면 Logging 컴포넌트, Collections 컴포넌트, Lang 컴포넌트, BeanUtils 컴포넌트, Httpclient 컴포넌트 순이다. 이 중 프로그램 개발 시 유용한 유틸리티가 제공되는 Lang 컴포넌트를 자세히 알아보자.

Lang 컴포넌트
자바 기본 API의 경우 핵심 클래스들의 핸들링을 위한 충분한 메소드를 제공하지 못한다. Commons Library의 Lang 컴포넌트는 java.lang 패키지를 확장한 다양한 기능들을 제공한다.

문자열 조작
Lang 컴포넌트는 문자열 처리를 위한 다양한 유틸리티 시리즈를 가지고 있다.

● StringUtils 클래스
- 문자열 처리 시 안전한 null 처리 연산이 제공된다.
- 문자열 처리와 관련된 특정 단어를 정의해 처리할 수 있다.
- 주요 메소드 
  ▶ isBlank(CharSequence cs) : 파라미터로 넘어온 cs가 white space 혹은 empty 또는 null인지 검사해 true, false를 반환한다.
  ▶ isEmpty(CharSequence cs) : 파라미터로 넘어온 cs가 empty 혹은 null 인지 검사해 true, false를 반환한다.
  ▶ defaultString(String str, String defaultString) : 파라미터로 넘어온 str이 empty혹은 null이라면 defaultString을 반환한다.

● StringEscapeUtils 클래스
- HTML이나 XML 등 Escape 문자를 포함한 문서의 문자열 처리 연산이 제공된다.
- 주요 메소드
  ▶ escapeHtml4(String input) : html4 기반의 태그를 포함한 문자열의 경우 escape 처리가 된 문자열로 변환해 반환한다.
  ▶ unescapeHtml4(String input) : html4 기반의 태그를 포함한 문자열의 경우 escape 처리가 된 문자열을 원래 문자로 변환해 반환한다.
  ▶ escapeXml(String input) : xml 기반의 문자열의 경우 escape 처리가 된 문자열로 변환해 반환한다.
  ▶ unescapeHtml(String input) : xml 기반의 문자열의 경우 escape 처리가 된 문자열을 원래 문자로 변환해 반환한다.

Escape 문자URL의 경우 모든 문자를 사용할 수 없으며 ASCII 코드의 일부분만을 이용해 표현하는 것으로 제한돼 있다.

숫자와 알파벳 영문 대소문자   [0-9a-zA-Z]
일부 특수문자 [$-_,+!*’(),]

모든 ASCII 코드를 표현할 수 없으므로 제한된 코드의 경우 별로도 변환해 전송해야 한다. 이렇게 변환한 문자를 URL Escape 문자라고 한다. 대표적인 Escape 문자는 다음과 같다.

ASCII 제어 문자
Non-ASCII 문자

URL 예약 문자(“$”, ” &”, ”+”, ”, ”, ”/”, “:”, “;”, “=”, “?”, “@”)
 
●  RandomStringUtils 클래스
- 문자열을 위한 Random 연산을 제공한다.
- 주요 메소드
  ▶ random(int count) : count 개수만큼의 문자열을 반환한다.
  ▶ randomAscii(int count) : count 개수만큼의 ASCII  문자열을 반환한다.

Character 핸들링
Lang 컴포넌트는 문자를 핸들링하기 위한 다양한 유틸리티를 제공한다.

● CharUtils 클래스
- 문자를 위한 연산을 제공한다.
- 주요 메소드
  ▶ isAscii(char ch) : 문자가 Ascii 코드인지 여부를 true, false로 반환한다.
  ▶ isAsciiAlphaLower(char ch) : 문자가 Ascii 소문자인지 여부를 true, false로 반환한다.
  ▶ isAsciiAlphaUpper(char ch) : 문자가 Ascii 대문자인지 여부를 true, false로 반환한다.
  ▶ IsAsciiAlphanumeric(char ch) : 문자가 Ascii 숫자인지 여부를 true, false로 반환한다.

JVM 상호작용
다양한 플랫폼의 정보를 알려주는 기능을 제공한다.

● SystemUtils 클래스
- Java.lang.System 클래스의 Helper 기능을 제공한다.
- 주요 메소드
  ▶ getJavaHome() : 자바 Home 디렉터리를 파일 객체로 반환한다.
  ▶ getJavaIoTmpDic() : 자바 IO Temp 디렉터리를 파일 객체로 반환한다.
  ▶ getUserDir() : User 디렉터리를 파일 객체로 반환한다.
  ▶ getUserHome() : User Home 디렉터리를 파일 객체로 반환한다.
 
● CharEncoding 클래스
- 플랫폼에서 문자셋을 지원하는지 검사하는 기능을 제공한다.
- 주요 메소드
  ▶ isSupported(String name) : 플랫폼에서 파라미터로 넘어온 문자셋을 지원하는지 검사해 true, false로 반환한다.

Serialization
Lang 컴포넌트는 손쉽게 Serialization하는 기능을 제공한다.

● SerializationUtils 클래스
- 손쉬운 객체 직렬화 기능을 제공한다.
- 주요 메소드
  ▶ serialize(Serializable obj) : 직렬화할 객체를 byte 배열로 변환해 반환한다.
  ▶ serialize(Serializable obj, OutputStream outputStream) : 직렬화할 객체를 OutputStream 객체로 변환해 반환한다.
  ▶ deserialize(InputStream inputStream) : InputStream 객체로 넘어온 직렬화 데이터를 Object 객체로 변환해 반환한다.

Utility
Lang 컴포넌트는 객체를 다루기 위한 다양한 유틸리티를 제공한다.

● ObjectUtils 클래스
- 객체를 조작하는 다양한 기능을 제공한다.
- 주요 메소드
  ▶ clone(T obj) : 객체를 복제한다.
  ▶ compare(T c1, T c2) : 2개의 객체간에 Null 처리에 대한 안정성을 비교해 알려준다.
  ▶ equals(Object  object1, Object object2) : 2개의 객체간의 Null 처리에 대해 비교해 알려준다.
 
● ClassUtils 클래스
- Replection을 사용하지 않고 클래스를 조작하는 기능을 제공한다.
- 주요 메소드
  ▶ getClass(ClassLoader classLoader, String className) : 클래스 로더를 이용해 클래스를 로딩한다.
  ▶ getPackageName(Object object, String valueIfNull) : 객체의 패키지명을 반환한다.
  ▶ getPackageName(String className) : 클래스 이름을 이용해 패키지명을 반환한다.

● ArrayUtils 클래스
- 배열을 조작하는 다양한 기능을 제공한다.
- 주요 메소드
  ▶ add(char[] array, char element) : 배열의 끝에 주어진 요소를 추가한다.
  ▶ add(char[] array, int index, char element) : 배열에서 지정한 위치에 주어진 요소를 추가한다.
  ▶ remove(char[] array, Int index) : 배열에서 지정한 위치에 요소를 삭제한다.
  ▶ toObject(char[] array) : 배열에 속한 요소들을 객체로 변환한다.
  ▶ toPrimitive(Char[] array) : 객체 배열의 요소들을 기본형으로 변환한다.

마치며
Apache 재단에서는 다양한 분야의 오픈소스들을 제공하고 있다. 그 중에서도 Commons Library의 경우 모든 Apache 프로젝트들의 기본이 되는 라이브러리로, 이미 Apache 프로젝트뿐만 아니라 전 세계적으로 사용되고 있으며 대다수의 사용자에게서 이미 검증된 라이브러리다. 구현하려고 하는 기능의 대부분은 이미 누군가가 구현해 놓은 경우가 많아 현재의 프로그램 개발 동향은 모든 기능을 직접 구현하는 것이 아니라 이미 구현된 기능을 최대한 재활용하는 것이다. 개발 시 이를 최대한 활용해 효율적인 프로그램을 작성하도록 하자. 지면 관계상 많은 컴포넌트들을 다루지는 못했지만 Commons Library에는 소개하지 못한 유용한 컴포넌트들이 다수 존재한다. 관심 있는 독자라면 Commons Library 공식사이트(http://commons.apache.org/)를 방문해 확인하길 바라며 이 글이 시작하는 분들을 위한 유용한 길잡이가 되길 바란다.

릴리즈된 Apache Commons 컴포넌트

Commons Library의 경우 다수의 컴포넌트들로 구성돼 있다. 자바 언어가 발전함에 따라 제공하던 컴포넌트가 추가되기도 하고 삭제되기도 한다. 2012년 현재 Commons Library에서 공식적으로 서비스하고 있는 컴포넌트는 40여 개에 이른다. 각각의 컴포넌트의 간략한 소개와 링크는 다음과 같다.

- Attributes (http://commons.apache.org/attributes/) : Doclet 태그와 같은 메타데이터 속성에 대한 Runtime API
- BCEL (http://commons.apache.org/bcel/) : Byte Code Engineering Library - 자바클래스 파일을 수정할 수 있는 라이브러리
- BeanUtils (http://commons.apache.org/beanutils/) : 자바 API와 Reflection을 쉽게 사용할 수 있도록 하는 Wrapper
- Betwixt (http://commons.apache.org/betwixt/) : XML 문서와 자바 Beans를 맵핑하는 라이브러리
- BSF (http://commons.apache.org/bsf/) : Bean Scripting Framework
- Chain (http://commons.apache.org/chain/) : 신뢰성 있는 Chain 패턴을 구현한 라이브러리
- CLI (http://commons.apache.org/cli/) : Command Line 파서
- Codec (http://commons.apache.org/codec/) : 일반적인 인코딩·디코딩 알고리즘을 구현한 라이브러리
- Collections (http://commons.apache.org/collections/) : Java Collection Framework
- Compress (http://commons.apache.org/compress/) : Tar, zip, bzip2 등을 구현한 라이브러리
- Configuration (http://commons.apache.org/configuration/) : 다양한 format의 설정파일을 읽기 위한 라이브러리
- CSV (http://commons.apache.org/csv/) : CSV(Comma Separated Value) 파일을 읽기 위한 라이브러리
- Daemon (http://commons.apache.org/daemon/) :Unix Demon과 같은 형태를 구현하기 위한 라이브러리
- DBCP (http://commons.apache.org/dbcp/):Database Connection Pooling Services
- DbUtils (http://commons.apache.org/dbutils/) : JDBC Helper 라이브러리
- Digester (http://commons.apache.org/digester/) : XML과 자바 객체를 맵핑하는 라이브러리
- Discovery (http://commons.apache.org/discovery/) : 서비스명으로 리소스를 맵핑해 찾아주는 라이브러리
- EL (http://commons.apache.org/el/) : JSP 2.0에 정의된 Expre ssion Language 인터프리터
- Email (http://commons.apache.org/email/) : 이메일을 보내기 위한 라이브러리
- Exec (http://commons.apache.org/exec/) : 자바에서 외부 프로세스 실행을 위한 API
- FileUpload (http://commons.apache.org/fileupload/) : 웹에서 파일 업로드를 위한 라이브러리
- Functor (http://commons.apache.org/functor/) : 기능성 스타일로 프로그래밍할 수 있도록 구성하는 라이브러리
- IO (http://commons.apache.org/io/) : I/O 유틸리티를 제공하는 라이브러리
- JCI (http://commons.apache.org/jci/) : Java Compiler Interface
- JCS (http://commons.apache.org/jcs/) : Java Cashing System
- Jelly (http://commons.apache.org/jelly/) : XML 기반의 스트립트 엔진
- Jexl (http://commons.apache.org/jexl/) : JSTL을 확장한 Express ing Language
- JXPath (http://commons.apache.org/jxpath/) : XPath 문법을 이용해 Java Beans를 조작하는 유틸리티
- Lang (http://commons.apache.org/lang/) : Java.lang 패키지의 확장 기능을 제공
- Launcher (http://commons.apache.org/launcher/) : Cross Platform에서 자바 프로그램을 실행시키는 라이브러리 
- Logging (http://commons.apache.org/logging/) : Logging API의 다양한 Wrapper를 제공한다.
- Math (http://commons.apache.org/math/) : 확장된 수학, 통계 라이브러리
- Modeler (http://commons.apache.org/modeler/) : JMX Spec과 호환되는 MBeans 생성을 제공한다.
- Net (http://commons.apache.org/net/) : 네트워크 관련 유틸리티
- OGNL (http://commons.apache.org/ognl/) : Object-Graph Navi gation Language
- Pool (http://commons.apache.org/pool/) : 일반적인 객체 pooling을 제공하는 컴포넌트
- Primitives (http://commons.apache.org/primitives/) : 자바 Primitive 타입을 쉽게 사용할 수 있도록 도와주는 라이브러리 
- Proxy (http://commons.apache.org/proxy/) : 동적 프록시를 구성하기 위한 라이브러리
- Sanselan (http://commons.apache.org/imaging/) : 자바 이미지 라이브러리
- SCXML (http://commons.apache.org/scxml/) : State Chart XML 엔진을 구현한 라이브러리
- Transaction (http://commons.apache.org/transaction/) : 다중 Lock 트랜잭션 구현을 위한 라이브러리
- Validator (http://commons.apache.org/validator/) : XML 파일에서 Validation 규칙을 정하는 프레임워크
- VFS (http://commons.apache.org/vfs/) : Virtual 파일시스템 구성을 위한 라이브러리