최근 프로젝트에서 드론 촬영 원본 이미지(.TIF) 를 기반으로 썸네일을 생성해야 하는 작업이 있었다.
그런데 특정 서버에서는 썸네일 생성이 실패하고, 어떤 서버에서는 정상 작동하는 이상한 현상을 발견했다.
결론부터 말하면,
Java 1.8의 기본 ImageIO는 TIFF 읽기를 지원하지 않고, Java 11은 공식적으로 TIFF 읽기를 지원한다
이 차이 때문에 발생한 문제였다.
아래는 실제로 겪은 문제 상황과 해결 과정이다.
썸네일 생성 코드에서 .TIF 파일을 읽는 부분이 있었다.
BufferedImage image = ImageIO.read(new File(imagePath));
Java 11 서버에서는 정상적으로 이미지가 로딩되지만,
Java 1.8 서버에서는 다음과 같은 에러가 발생했다:
javax.imageio.IIOException: Can't read input file!
또는
No ImageReader found for format 'tif'
두 메시지는 공통적으로 ImageIO가 TIFF 포맷을 처리하지 못한다는 의미다.
문제가 더 어려웠던 이유는:
| 서버 | Java 버전 | 결과 |
|---|---|---|
| 서버 A | Java 1.8 | TIFF 읽기 실패(Thumbnail 생성 실패) |
| 서버 B | Java 11 | TIFF 정상 로딩(Thumbnail 생성 성공) |
정확히 같은 코드인데도 결과가 갈림.
이때 직감했다:
“버전 차이에서 오는 ImageIO TIFF 지원 문제다.”
TIFF는 오래전부터 특수 이미지 포맷으로 분류되어
Java 1.8에서는 ImageIO에 기본 포함되지 않는다.
Java 11부터는 OpenJDK에 TIFF 플러그인이 기본 포함되어서
별도 라이브러리 없이 ImageIO에서 TIFF를 읽을 수 있게 되었다.
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("tif");
while (readers.hasNext()) {
System.out.println("Reader: " + readers.next().getClass());
}
Java 11에서는 아래와 같이 정상 Reader가 잡힘:
Reader: com.sun.imageio.plugins.tiff.TIFFImageReader
Java 1.8에서는 아무 것도 출력되지 않음.
실제로 서버 환경을 다음과 같이 변경했다:
echo $JAVA_HOME
# 기존: /usr/lib/jvm/jdk-1.8.x
java -version
# 기존: openjdk version "1.8.0_462"
→ Java 11로 변경
export JAVA_HOME=/usr/lib/jvm/jdk-11.0.21
업그레이드 후, TIFF 썸네일 생성은 즉시 정상 작동했다.
BufferedImage img = ImageIO.read(new File("/path/image.TIF"));
System.out.println(img != null ? "OK" : "Fail");
결과:
OK
문제 완전히 해결!
이번 문제의 핵심은:
Java 1.8의 ImageIO는 TIFF 를 지원하지 않는다. → Java 11 이상에서는 TIFF 지원됨
따라서 TIF 이미지를 사용하는 프로젝트라면 다음 중 하나를 선택해야 한다.
twelve-monkeys 같은 외부 이미지 라이브러리 추가| 항목 | Java 1.8 | Java 11 |
|---|---|---|
| TIFF 포맷 ImageIO 지원 | ❌ 미지원 | ✔ 기본 지원 |
| Thumbnail 생성 | 실패 | 정상 |
| 추가 라이브러리 필요 | O | X |
이 문제는 경로 오류처럼 보였지만, 실제 원인은 Java 버전 차이로 인한 TIFF 지원 여부였다.
같은 코드가 서버 A에서는 실패하고 B에서는 성공한다면
환경(Java 버전)을 먼저 확인하는 것이 큰 도움이 된다.
이런 문제 다시 안 겪도록 기록 차원에서 남겨본다.