병갈이 블록

ubuntu, tomcat, java - javax.imageio.IIOException: Can't create cache file! 본문

개발공부 이야기(New)/각종 에러에 대처하는 자세

ubuntu, tomcat, java - javax.imageio.IIOException: Can't create cache file!

woojang 2021. 1. 20. 23:34

이 에러가 발생하게 된 프로그램은 인스타그램 공유 시 얻을 수 있는 ID를 넘기면 1080사이즈의 이미지 파일을 리턴하는 REST서비스 프로그램으로, 우분투에 설치된 톰캣으로 운영하던 도중 발생했다. 에러 발생 상황은 ip/{공유이미지ID}를 입력했을 때 웹에서 에러코드를 리턴하였다.(404였는지 500이었는지 기억이...;;)

우선 에러가 발생했으니 로그를 확인해본다.

 

1. 로그 확인.

터미널로 나스에 ssh로 접속한 뒤 도커에 올라가 있는 우분투에 접속을 한다.(ㅎㅎㅎㅎㅎㅎ) 그리고 톰캣이 위치한 tomcat8/ 폴더를 기준으로 tomcat8/logs/catalina.out 파일을 tail 명령어로 실행시킨다.

$ tail -f tomcat8/logs/catalina.out

그러면 아래와 같은 에러로그가 쭉 나온다.(에러 내용은 다를 수 있다.)

javax.imageio.IIOException: Can't create cache file!
    at javax.imageio.ImageIO.createImageInputStream(ImageIO.java:361)
    at javax.imageio.ImageIO.read(ImageIO.java:1403)
    at com.myID.controller.InstagramImgDownloadController.getImgFile(InstagramImgDownloadController.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

우선 첫번째 라인을 본다. (첫번째 줄에 Exception 종류와 에러가 발생한 이유가 출력된다. 만약 에러내용이 코드의 문제로 인한 에러라면 아래로 로그를 따라가 내가 만든 프로그램의 라인을 확인하고 해당 클래스를 찾아 수정하면 된다.)

javax.imageio.IIOException: Can't create cache file!

음...캐쉬파일을 만들수 없다고 한다.

 

2. 해결방법 찾기

에러가 난 원인을 찾았으니 해결밥법을 찾을 차례이다. 복잡하게 생각하지 말고 구글에서 검색해보자. (구글에서 검색하는 팁은 별거 없다. 그냥 저 첫번째 줄 전체를 복사해서 구글검색을 하면 대부분 비슷한 케이스로 물어보는 내용의 글들이 검색이 된다. 정말 잘 발생하지 않는 특이한 에러가 아니라면 이미 나와같은 경험을 한 사람들의 수많은 글들이 웹에 떠돌고 있다. 물론 예외적으로 쉽게 발생하지 않는 에러일 경우 영어로된 결과도 찾기가 어려울 때가 있는데, 그 때는 진짜 몇가지 키워드를 가지고 꼬리물기식으로 검색하고 찾고 유추하고 다시 검색하는 과정이 필요하다.) 조회 결과 중에서 몇가지를 열어보던 중 금방 그 해결방법이 적힌 글을 발견했다. tomcat설정에 잡혀있는 CATALINA_TMPDIR라는 경로가 있는데, 실제로 그 경로에 해당폴더가 없을 경우 위와 같은 에러가 발생한다고 한다. CATALINA_TMPDIR 에 지정된 경로를 확인하는 방법은 직접 파일을 열어봐도 되는데, 그보다는 톰캣 실행/종료시 터미널 콘솔에 출력되는 정보를 확인하면 된다. (catalina.sh파일을 한참 살펴보다가 아무생각없이 톰캣을 실행했는데 그제서야 CATALINA_TMPDIR 라는 단어가 눈에 들어와서 알게되었다. 톰켓 실행/종료 시 출력되는 내용이 저 내용인지는 생각지도 못했다.)

# tomcat8/ 폴더 기준
$ sh bin/startup.sh 
Using CATALINA_BASE:   /usr/share/tomcat8
Using CATALINA_HOME:   /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp	//요녀석!!
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
Tomcat started.

그리고 위 콘솔에서 확인한 위치에 정말 temp폴더가 존재하는지 확인을 해보면 된다. 나같은 경우에 temp라는 폴더가 없었기 때문에 해당 폴더를 생성하고 tomcat을 다시 실행시킨 후 서비스를 호출했을 때 로컬테스트와 동일하게 이미지파일이 불러와지는것을 확인했다.

(tomcat8/ 폴더 기준)
$ sh bin/shutdown.sh
$ mkdir temp
$ sh bin/startup.sh

더 깊이 찾아보지는 않았지만 ImageIO클래스가 이미지파일을 읽어오기 위해서는 임시로 데이터를 캐쉬해놓을 임시공간이 필요한데 실제로 지정된 위치에 그 임시폴더가 존재하지 않았기에 캐쉬파일을 만들 수 없다는 에러가 발생한 걸로 보인다.

 

결론!!

케이스 바이 케이스겠지만, "javax.imageio.IIOException: Can't create cache file!" 라는 에러가 발생하면, 톰캣 실행/종료 시 확인가능한 CATALINA_TMPDIR에 지정된 경로에 해당 폴더가 존재하는지 확인하기 바란다.

 

Comments