😱 문제원인
FTP로 파일을 전송할 때 파일 사이즈가 커지는 문제가 발생했다.
같은 파일인데 파일 사이즈가 커지는 부분이 문제 되었다. (파일 사이즈를 비교하여 동작하는 기능이 있기 때문이다.)
참고로 아래 라이브러리를 사용하여 FTP, FTPS, SFTP 기능을 구현했다.
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.11.1</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
😊 해결방법
FTP 설정 문제임을 파악하여 FTP 접속 시 조건을 변경했다.
바이너리 모드로 설정해야 파일 사이즈가 그대로 간다고 한다.
옵션에 대한 자세한 설명은 아래에 작성했다.
if(ftp.login(user, pass)) {
ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 바이너리 모드 설정
ftp.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE); // 스트림 모드 설정
ftp.setFileStructure(FTPClient.FILE_STRUCTURE); // 파일 구조 설정
log.info("Passive mode set: " + ftp.getReplyString());
log.info("Binary file type set: " + ftp.sendCommand("TYPE I"));
log.info("File transfer mode set: " + ftp.getReplyString());
log.info("File structure set: " + ftp.getReplyString());
} else {
throw new Exception("login error");
}
💡설정한 옵션에 대한 정리
File Type (파일 유형 설정)
설명
: 파일을 전송할 때의 형식을 지정합니다. 주로 텍스트 파일과 바이너리 파일 간의 구분이 필요합니다.
옵션
- FTP.ASCII_FILE_TYPE (기본값):
- 텍스트 파일(예: .txt, .csv) 전송에 적합.
- 클라이언트와 서버 간에 텍스트 형식을 변환(줄 바꿈 등)하며 전송합니다.
- 주의: 바이너리 파일 전송 시 데이터 손상 가능.
- FTP.BINARY_FILE_TYPE:
- 바이너리 파일(예: .png, .zip, .mp4) 전송에 적합.
- 데이터가 원본 그대로 전송됩니다.
- 텍스트 변환 없음.
- 일반적으로 파일 손상 방지를 위해 가장 자주 사용.
- FTP.EBCDIC_FILE_TYPE:
- IBM 메인프레임과 같이 EBCDIC(Extended Binary Coded Decimal Interchange Code) 형식을 사용하는 시스템과의 통신에 사용.
- 일반적으로 잘 사용하지 않음.
File Transfer Mode (파일 전송 모드 설정)
설명
: 데이터를 전송할 때 사용하는 전송 방법을 지정합니다.
옵션
- FTP.STREAM_TRANSFER_MODE (기본값):
- 데이터를 스트림(연속적인 흐름)으로 전송합니다.
- 대부분의 상황에서 기본으로 사용.
- 전송 중 데이터가 손실되거나 중단되면 재전송이 어려움.
- FTP.BLOCK_TRANSFER_MODE:
- 데이터를 블록 단위로 전송합니다.
- 각 블록에 헤더가 포함되어 있어 손실되었을 때 복구가 가능.
- 속도가 느릴 수 있으므로 일반적으로 사용하지 않음.
- FTP.COMPRESSED_TRANSFER_MODE:
- 데이터를 전송하기 전에 압축하여 전송.
- 네트워크 대역폭을 절약할 수 있음.
- 서버와 클라이언트가 모두 압축 전송을 지원해야 사용 가능.
File Structure (파일 구조 설정)
설명
: 서버가 파일을 어떻게 관리하고 구조화하는지에 대한 정보를 설정합니다.
옵션
- FTP.FILE_STRUCTURE (기본값):
- 파일이 연속적인 바이트 스트림으로 구성되어 있음을 나타냅니다.
- 대부분의 일반적인 파일 전송에서 사용.
- FTP.RECORD_STRUCTURE:
- 파일이 레코드 단위로 구성된 경우 사용합니다.
- 예: 메인프레임 시스템에서 레코드 기반 파일 전송 시.
- FTP.PAGE_STRUCTURE:
- 파일이 페이지 단위로 나뉘어 저장되고 전송될 때 사용.
- 거의 사용되지 않음.
🌻참고
'Java' 카테고리의 다른 글
[RxJava] RxJava 이해하기 - 1. Reactive Programming이란 (0) | 2022.07.06 |
---|---|
3주차 - 연산자 (1) | 2021.12.29 |
2주차 - 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.08.27 |
1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.08.22 |