웹에서 고객이 대용량 동영상 파일을 첨부하는도중 오류가 발생했다.
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space
..
..
..
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.lang.String.toCharArray(String.java:2748)
at org.apache.oro.text.perl.Perl5Util.match(Unknown Source)
at net.sf.jmimemagic.MagicMatcher.testRegex(MagicMatcher.java:676)
at net.sf.jmimemagic.MagicMatcher.testInternal(MagicMatcher.java:446)
at net.sf.jmimemagic.MagicMatcher.test(MagicMatcher.java:240)
at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:344)
at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:240)
OutOfMemoryError 는 말그대로 메모리 부족문제가 원인이다. jvm에 할당된 메모리 사이즈보다 큰 작업을 수행하기에 발생하는 것이다.
1. 파일 크기제한 예제
# context-core.xml의 maxInMemorySize 속성을 작은 값으로 설정해 큰 파일은 메모리가 아닌 디스크에 임시 저장하도록 설정
# 현재 <property name="maxInMemorySize" value="500000000" />라고 지정되어 잇음.
# 476.8 MB까지 메모리에 저장가능하며. 이 값을 초과하는 파일은 메모리가 아닌 임시 디스크 공간에 자동 저장됨.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 업로드 파일 최대 크기 -->
<property name="maxUploadSize" value="500000000" />
<!-- 메모리에 저장할 수 있는 최대 크기 -->
<property name="maxInMemorySize" value="1000000" />
<!-- 업로드된 파일을 저장할 디렉토리 (절대 경로) -->
<property name="uploadTempDir" value="/custom/upload/temp/dir" />
</bean>
2. MIME 타입 체크 최적화 예제
// 최초 maven의존성 추가 하기
// pom.xml
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>2.7.0</version>
</dependency>
// FileServiceImpl.java
..
..
File uploadFile = new File(uploadFullPath, uploadFileName);
String mimeType = FileUtils.getMimeTypeByTika(uploadFile);
..
..
..
// FileUtils.java
public static String getMimeType(File file) {
String mimeType = null;
try {
MagicMatch match = Magic.getMagicMatch(file, false);
if (match != null) {
mimeType = match.getMimeType();
}
} catch (Exception e) {
log.debug(e.getMessage());
}
return mimeType;
}
// 위 소스를 apache Tika로 수정 ---------------------------------------------
public static String getMimeType(File file) throws IOException {
Tika tika = new Tika();
return tika.detect(file);
}
[ 웹개발 ] 로그인 후 상세페이지로 이동(session) (1) | 2024.12.26 |
---|---|
[ RabbitMq ] RabbitMq 재기동 시 큐 데이터 삭제 여부(durable) (3) | 2024.10.14 |
[ 웹 개발 ] 반환 컨트롤러 String VS ResponseEntity<String> 차이 (0) | 2024.08.22 |
[ 웹 개발 ] 리눅스 명령어로 자바 파일 (컴파일, 실행) (0) | 2024.07.24 |
[ 웹개발 ] android 앱을 tomcat서버에 연동(.apk) (0) | 2024.07.11 |