[java] Spring Framework를 사용한 FTP 파일 업로드 및 다운로드 구현

Spring Framework는 Java 기반의 애플리케이션 개발을 위한 강력한 프레임워크입니다. 이번 블로그 포스트에서는 Spring Framework를 사용하여 FTP(File Transfer Protocol)를 이용한 파일 업로드 및 다운로드를 구현하는 방법에 대해 알아보겠습니다.

1. 의존성 추가

먼저, 프로젝트의 의존성에 Spring Framework와 Spring의 FTP 기능을 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 아래 의존성을 추가하세요.

<dependencies>
   <!-- Spring Framework 의존성 -->
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.8</version>
   </dependency>
   
   <!-- Spring의 FTP 의존성 -->
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-integration</artifactId>
      <version>2.5.2</version>
   </dependency>
</dependencies>

2. FTP 연결 설정

업로드 및 다운로드를 위해 FTP 서버에 연결해야 합니다. Spring Framework에서는 DefaultFtpSessionFactory 클래스를 사용하여 FTP 연결을 설정할 수 있습니다. 아래는 FTP 서버의 호스트, 포트, 사용자 이름 및 암호를 설정하는 방법입니다.

@Configuration
public class FtpConfig {
    
    @Value("${ftp.host}")
    private String host;
    
    @Value("${ftp.port}")
    private int port;
    
    @Value("${ftp.username}")
    private String username;
    
    @Value("${ftp.password}")
    private String password;
    
    @Bean
    public DefaultFtpSessionFactory ftpSessionFactory() {
        DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory();
        sessionFactory.setHost(host);
        sessionFactory.setPort(port);
        sessionFactory.setUsername(username);
        sessionFactory.setPassword(password);
        return sessionFactory;
    }
}

위의 코드에서 ${ftp.host}, ${ftp.port}, ${ftp.username}, ${ftp.password}application.properties 파일에 정의된 프로퍼티 값을 사용하는 예시입니다.

3. 파일 업로드 구현

이제 FTP 서버에 파일을 업로드하는 방법을 알아보겠습니다. Spring Framework의 FtpOutboundGateway를 사용하여 파일을 업로드할 수 있습니다.

@Component
public class FileUploader {
    
    @Autowired
    private FtpConfig ftpConfig;
    
    public void uploadFile(File file, String remoteDirectory) {
        Message<File> message = MessageBuilder.withPayload(file).build();
        
        FtpOutboundGateway gateway = new FtpOutboundGateway(ftpConfig.ftpSessionFactory(), "send", "payload");
        gateway.setRemoteDirectoryExpressionString("'" + remoteDirectory + "'");
        
        gateway.handleMessage(message);
    }
}

위의 코드에서 FileUploader 클래스는 uploadFile 메소드를 통해 파일을 업로드합니다. ftpConfig 객체는 앞서 설정한 FTP 연결을 가져오는데 사용됩니다. remoteDirectory 매개변수는 업로드할 파일이 저장될 원격 디렉터리를 나타냅니다.

4. 파일 다운로드 구현

이번에는 FTP 서버에서 파일을 다운로드하는 방법을 알아보겠습니다. Spring Framework의 FtpInboundFileSynchronizer를 사용하여 파일을 다운로드할 수 있습니다.

@Component
public class FileDownloader {
    
    @Autowired
    private FtpConfig ftpConfig;
    
    public void downloadFile(String remoteFilePath, String localDirectory) {
        FtpInboundFileSynchronizer synchronizer = new FtpInboundFileSynchronizer(ftpConfig.ftpSessionFactory());
        synchronizer.setRemoteDirectory(remoteFilePath);
        
        File localDir = new File(localDirectory);
        synchronizer.setLocalDirectory(localDir);
        
        synchronizer.synchronizeToLocalDirectory();
    }
}

위의 코드에서 FileDownloader 클래스는 downloadFile 메소드를 사용하여 FTP 서버에서 파일을 다운로드합니다. remoteFilePath 매개변수는 원격 파일의 경로를, localDirectory 매개변수는 로컬에 저장될 파일의 디렉터리를 나타냅니다.

마무리

이제 Spring Framework를 사용하여 FTP를 이용한 파일 업로드 및 다운로드를 구현하는 방법을 알아보았습니다. 이를 통해 파일 전송과 관련된 기능을 간단하게 구현할 수 있으며, Spring의 강력한 기능과 편리한 설정을 활용할 수 있습니다.

본 코드 예제는 Spring Framework 5.3.8 버전을 기준으로 작성되었습니다.

참고 자료