Hutool은 Java 개발에서 자주 사용되는 작업을 단순화하기 위해 설계된 오픈 소스 라이브러리입니다. 이 라이브러리는 문자열 처리, 컬렉션 조작, IO, 날짜 및 시간 관리, 암호화, JSON, HTTP 통신, 파일 압축 등 다양한 기능을 제공하는 툴 클래스들을 포함하고 있습니다. Hutool은 제3자 프레임워크에 의존하지 않으며, 핵심 모듈의 크기는 약 1MB로 매우 가볍고 쉽게 통합할 수 있어 중소 규모 프로젝트나 빠른 개발 환경에 적합합니다.
기본 기능
- 개발 간소화: 반복적인 작업을 캡슐화하여 코드 재사용성을 증가시킵니다.
- 코드 가독성 향상: 메서드 명명이 직관적이고 체인 호출 방식으로 사용이 용이합니다.
- 제3자 의존성 감소: 핵심 모듈은 외부 라이브러리에 의존하지 않습니다.
- 강력한 호환성: Java 8 이상 버전과 호환되며, 다양한 JDK 버전에 최적화되어 있습니다.
- 풍부한 문서: 상세한 공식 문서와 예제를 제공합니다.
주요 모듈 및 기능
| 모듈 이름 | 설명 |
|---|---|
| `core` | 핵심 모듈로, 문자열, 컬렉션, 날짜, IO, 리플렉션, 암호화, 시스템 정보 등의 도구를 포함합니다. |
| `crypto` | AES, RSA, SHA, MD5, Base64, 해싱 등을 지원하는 암호화 도구입니다. |
| `db` | JDBC 작업을 간단하게 처리하며, `Db`, `SqlRunner` 클래스를 통해 원시 SQL 작성 없이 데이터베이스 작업을 수행할 수 있습니다. |
| `http` | GET/POST/PUT/DELETE 요청을 캡슐화하며, 업로드, 쿠키, 헤더, 프록시 등을 지원합니다. |
| `json` | `org.json` 기반의 JSON 처리 도구로, `JSONObject`, `JSONArray` 등을 편리하게 다룰 수 있습니다. |
| `log` | Log4j, Logback, SLF4J 등을 지원하는 로깅 인터페이스를 제공합니다. |
| `cache` | LRU, TTL 등의 구현체를 포함하는 캐시 인터페이스를 제공합니다. |
| `extra` | 이메일, 템플릿 엔진(Velocity), QR 코드, PDF, Excel 등 고급 기능을 포함합니다. |
주요 도구 클래스 사용 예제
1. 문자열 처리: `StringUtil`
import cn.hutool.core.util.StringUtil;
public class StringUtilDemo {
public static void main(String[] args) {
boolean isEmpty = StringUtil.isEmpty(" "); // true
System.out.println("문자열 비어있음: " + isEmpty);
boolean isNotEmpty = StringUtil.isNotEmpty("Hello"); // true
System.out.println("문자열 비어있지 않음: " + isNotEmpty);
String subStr = StringUtil.sub("HelloWorld", 2, 5); // "llo"
System.out.println("부분 문자열: " + subStr);
String formatted = StringUtil.format("이름: {}, 나이: {}", "김철수", 30);
System.out.println("형식화된 문자열: " + formatted);
String camelCase = StringUtil.toCamelCase("user_name"); // "userName"
System.out.println("언더바에서 카멜케이스 변환: " + camelCase);
}
}
2. 컬렉션 처리: `CollectionTool`
import cn.hutool.core.collection.CollectionTool;
import java.util.*;
public class CollectionToolDemo {
public static void main(String[] args) {
List<String> list = CollectionTool.newArrayList("사과", "바나나", "오렌지");
System.out.println("리스트 생성: " + list);
boolean isEmpty = CollectionTool.isEmpty(list); // false
System.out.println("리스트 비어있음: " + isEmpty);
String joined = CollectionTool.join(",", list); // "사과,바나나,오렌지"
System.out.println("조인된 문자열: " + joined);
}
}
3. 날짜 처리: `DateTimeUtil`
import cn.hutool.core.date.DateTimeUtil;
import java.util.Date;
public class DateTimeUtilDemo {
public static void main(String[] args) {
Date now = new Date();
System.out.println("현재 시간: " + now);
String formattedDate = DateTimeUtil.format(now, "yyyy-MM-dd HH:mm:ss");
System.out.println("형식화된 날짜: " + formattedDate);
Date parsedDate = DateTimeUtil.parse("2025-01-01 12:30:00", "yyyy-MM-dd HH:mm:ss");
System.out.println("파싱된 날짜: " + parsedDate);
}
}
4. 파일 및 IO 처리: `FileTool`
import cn.hutool.core.io.FileTool;
import java.io.File;
public class FileToolDemo {
public static void main(String[] args) {
File tempFile = FileTool.tempFile();
System.out.println("임시 파일 경로: " + tempFile.getAbsolutePath());
boolean exists = FileTool.exist("C:/test.txt");
System.out.println("파일 존재 여부: " + exists);
String content = FileTool.readString("C:/test.txt", "UTF-8");
System.out.println("파일 내용: " + content);
}
}
5. JSON 처리: `JsonTool`
import cn.hutool.json.JsonTool;
import java.util.HashMap;
import java.util.Map;
public class JsonToolDemo {
public static void main(String[] args) {
Map user = new HashMap<>();
user.put("name", "박영희");
user.put("age", 27);
String jsonStr = JsonTool.toJsonStr(user);
System.out.println("JSON 문자열 변환: " + jsonStr);
Map parsedMap = JsonTool.parseObj(jsonStr);
System.out.println("JSON 파싱 후 맵 값: " + parsedMap.get("name"));
}
}
6. HTTP 요청: `HttpTool`
import cn.hutool.http.HttpTool;
import cn.hutool.http.Method;
import cn.hutool.http.Request;
import cn.hutool.http.Response;
public class HttpToolDemo {
public static void main(String[] args) {
String response = HttpTool.get("https://api.example.com/data");
System.out.println("GET 응답: " + response);
Request request = new Request(Method.POST, "https://api.example.com/data")
.addHeader("Content-Type", "application/json")
.body("{\"name\":\"홍길동\"}");
Response resp = request.execute();
System.out.println("POST 응답 상태: " + resp.getStatus());
}
}