프로젝트를 하다보면 비슷한 기능들이 자주 사용되는 경우가 있고 개발자들은 흔히 이런 기능들을 스태틱(static) 메서드로 만들어 유틸리티 클래스를 만들곤 한다. 그런데 이런 유틸리티 기능들이 사실 우리가 이미 사용하는 오픈소스 프레임웍이나 라이브러리에 포함된 경우가 상당히 많다. 또한 개발자가 나름 만든 클래스에는 버그가 숨어 있는 경우도 많아서 가급적 검증된 라이브러리를 사용하는 게 훨씬 낫다. 이번 글에서는 알아두면 편리한 자바 유틸리티 클래스들 에 대해 찾아보았다.

스프링 프레임웍

스프링 프레임웍에는 다양한 패키지가 있는데 그중 코어의 org.springframework.util 패키지에 다양한 유틸리티가 있다. 개발자들이 가장 흔하게 사용하는 유틸리티 기능은 아마도 문자열 처리 작업일 것이다. StringUtils 클래스의 다음과 같은 유틸리티성 스태틱 메서드들을 사용해보면 편리하다. 대부분은 String 클래스를 조금만 활용하면 간단히 처리할 수 있는 기능들이지만 특히 일일이 null 검사를 안해도 된다는 점이 개발자들에게 유용한 것 같다. 다음에 나열한 것 외에도 많은 메서드가 있으므로 필요하면 API를 확인해보기 바란다.

다음으로는 FileCopyUtils를 살펴보라. 다음과 같은 여러 버전으로 파일 복사 기능을 제공한다. 이 외에도 많다.

이 밖에도 org.springframework.util 패키지에서는 다음과 같은 클래스를 구비해놓고 있다. 모두 거들떠볼 필요가 있다.

StopWatch w = new StopWatch();
w.start("작업 1");
... // 뭔가 작업 실행
w.stop();
w.start("작업 2");
... // 뭔가 또 다른 작업 실행
w.stop();
System.out.print(w.prettyPrint()); // 작업별 경과 시간 출력

org.springframework.web.util 패키지에도 유용한 유틸리티 클래스들이 있다.

commons 라이브러리

아파치 커먼스(Apache Commons) 라이브러리는 그 자체가 이미 유틸리티 라이브러리므로 유틸리티 클래스를 선별하는 건 의미가 없지만 내 경험상 다음 몇 가지 클래스는 자주 나타나는 번거로운 작업을 단순화해주었길래 나열해본다. 먼저 IO 라이브러리의 FileUtils 클래스를 보자.

다음으로 IO 라이브러리의 IOUtils 클래스를 살펴보자. 파일 복사 기능 같은 건 위 FileUtils에 있었지만 이 클래스는 스트림 수준에서 복사 또는 읽기, 쓰기 기능을 제공한다.

커먼스 Email 라이브러리도 유용하다. 스프링 프레임웍을 사용할 경우 MailSenderImpl 등을 사용할 수 있다고 언급한 적이 있는데 커먼스의 e메일 라이브러리는 좀더 기능이 많다. 기본적으로 HTML, 첨부 파일 메일을 보낼 수 있는 건 같지만 SMTP 암호화, 원격 웹사이트의 파일 첨부, 이미지 내장 e메일 등을 보내는 게 가능하다. 자세한 설명은 사용자 지침서를 참고한다. 예시가 잘 나와 있다.

구슬이 서말이라도

스프링 프레임웍과 아파치 커먼스 라이브러리 두 가지에 대해서만 살펴봤지만 사실 대부분의 프레임웍과 라이브러리는 자체적인 유틸리티 클래스와 메서드를 구비해놓고 있다. 또한 Google Guava, 커먼스 Lang와 같이 특정 기술 분야에 대한 라이브러리가 아니라 자바 언어 자체에 대한 유틸리티성 라이브러리도 있다.

그러나 구슬이 서말이라도 꿰어야 보배라고 이를 잘 활용하지 않으면 아무 소용이 없겠지… 그리고 "Do not reinvent the wheel"이라는 유명한 격언도 있어서 남들이 해놓은 걸 다시 할 필요는 없다는 게 상식이다. 잘 찾아서 가져다 쓰는 것도 사실 쉽지 않은데 그걸 다시 더 잘 만드는 건 더욱 쉽지 않은 일이니까 말이다. 남들이 해놓은 걸 굳이 다시 만들 경우는 내가 스티브 잡스 같은 사람일 경우 뿐이라 생각된다…