티스토리 뷰
파일업로드 테스트(MultipartFile.getByte, MultipartFile.transferTo, MultipartFile.getInputStream)
주디 𝙹𝚞𝚍𝚢 2022. 6. 21. 17:42이번 개발건에 대용량 파일 업로드가 있어서 대리님이 실험을 해보라고 하셨고, 위 세 가지를 이용하여 테스트해보았다.
Case#1 MultipartFile.getByte
multipartFile.getByte로 바이트배열을 받고 그 바이트배열을 FileOutputStream을 이용하여 쓰는 방법이다.
1기가 파일을 업로드한다고 했을 때 위와 같은 결과가 나왔다. 항목에 대해 설명하자면, 첫번째 Max Heap은 최대 Heap 사이즈, used(before)은 작업 전 Heap 사이즈, used(after)는 작업 후 Heap 사이즈, used(gc-after)는 GC 후 Heap 사이즈이다. 위와 같은 경우, 작업 후에 메모리를 많이 차지하는 걸 알 수 있다.
Case#2 MultipartFile.transferTo
multipartFile에서 지원하는 transferTo를 사용하는 방법이다.
내부가 어떻게 구현되어있는지 봤는데 내부적으로 FileCopyUtils.copy를 사용하는데, 이것도 더 들어가보면 inputstream과 outputstream을 사용하고 있다. 그리고 더 깊게 들어가면 StreamUtils.copy를 사용한다.
Case#3 MultipartFile.getInputStream
마지막으로 MultipartFile에서 Inputstream을 얻어서 쓰는 파일을 쓰는 방법이다.
살펴보다가 정말 재미있는걸 발견했는데 사실 테스트를 위해 작성한 코드와 Case2#에서 최종적으로 사용하는 StreamUtils.copy메서드가 거의 똑같다는것이다.
이렇게 테스트를 해서 어떤 방법을 사용할지는 결정했는데 궁금한 게 또 생겼다. Case#1 MultipartFile.getByte에서는 작업이 다 끝나도 메모리를 계속 차지하고 있는데, 왜 Case#2와 Case#3은 그렇지 않을까? 더 찾아봐야겠다.
'공부흔적 > 자바' 카테고리의 다른 글
병렬스트림(ParallelStream)은 내부적으로 어떻게 동작할까? (0) | 2023.07.11 |
---|---|
예외 처리 (0) | 2022.06.22 |
try-with-resources와 AutoCloseable 인터페이스 (0) | 2022.04.04 |
형태는 같지만 사실 다른 메서드를 사용하는 메서드 참조 (0) | 2022.03.31 |
Logback 설정에 관하여 (0) | 2022.02.23 |