최신 글
8
제목 게시일
17
Web

[FTP] FTP Client로 CDN 서비스에 연결해보자

profile
코우
2021-07-10 14:05
조회 수 : 2781

이 블로그를 호스팅을 cafe24를 통해 진행하였었다. cafe24를 통해 트래픽을 모니터링하던 도중 CDN 서비스를 무료로 제공한다는 정보를 알게 되었다.
따라서 기존 FTP서버에서 함께 관리하던 이미지 파일들을 CDN으로 옮겨 트래픽 부담을 분산시키기로 결정했다.

기존 FTP서버는 단순하게 경로를 통해 업로드하면 되었다. 따라서 /home/hosting_users/[사용자 ID] 경로로 단순하게 업로드를 진행할 수 있었다.
그러나 이번에 CDN으로 업로드하기 위해서는 CDN과 연결 설정을 해주어야 한다. 

이번 포스팅에서는 외부 FTP서버에 연결하기 위한 방법을 소개할 예정이다.


1. 연결

우선 첫번째로 진행해야 할 작업은 FTP서버와의 연결이다. 
CDN 서비스를 신청하자 메일로 host와 id, pw를 제공받았다. 이 세가지 정보는 FTP서버와 연결할 때 필요한 정보이다.

이제 연결을 하기 위한 준비를 해보자.
FTP 서버에 연결하기 위해 FTP Client를 사용할 것이다. 이를 사용하기 위해서는 commons-net을 다운받아야 한다.
Pom.xml파일에 아래의 Dependency를 추가해주자.

 
1
2
3
4
5
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>
cs


이제 FTP client를 사용할 수 있다.
FTP client가 FTP 서버와의 연결을 위해 제공하는 몇 가지 메서드를 알아보자.

  • connect(String host, int port) : 지정된 포트의 remote 호스트에 연결되고 시스템 할당 포트의 현재 호스트에서 시작되는 소켓을 open한다.

  • login(String username, String password) : 사용자 이름과 암호를 사용하여 FTP 서버에 로그인한다.

연결 설정을 완료하였다. 이제 업로드를 하면 된다. 주의할 사항은 FTP Client는 별도의 설정을 해주지 않으면 기본적으로 ASCII형식으로 저장하게 되는데 파일 타입에 맞게 별도로 설정을 해주어야 한다. 따라서 FTP 서버에 연결할 때 FileType도 설정해주는 것을 잊지말자.  

  • setFileType(int fileType) : ASCII_FILE_TYPE , BINARY_FILE_TYPE 중 하나로 전송할 파일 유형을 설정한다.


블로그의 프로젝트에 FTP 연결, 해제를 담당하는 FTPManager라는 새로운 Class를 만들었다. 
FTPManager는 Singleton Class이며 host, id, pw 정보는 별도의 properties 파일에서 관리하며 bean을 통해 주입받도록 구성했다. 
FTP 서버와 연결이 필요할 때마다 FTPManager의 connect 메서드를 호출하여 연결하고 작업이 끝나면 disconnect 메서드로 연결을 해제한다.


FTPManager.JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.lifencoding.util;
 
import java.io.IOException;
import java.net.SocketException;
 
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
 
public class FTPManager {
    private String host;            // FTP 접속 호스트
    private String username;        // FTP 로그인 id
    private String password;        // FTP 로그인 pw
 
    public FTPManager(String host, String username, String password) {
        this.host = host;
        this.username = username;
        this.password = password;
    }
 
    //FTP connect 
    public FTPClient connect() {
        FTPClient client = new FTPClient();                        // FTP 연결 및 조작 객체 생성 
        client.setControlEncoding("UTF-8");
 
        FTPClientConfig config = new FTPClientConfig();
        client.configure(config);
 
        try {
            client.connect(host, 21);                            // FTP 서버에 연결, FTP 포트번호 21
            if(client.login(username, password)) {                // FTP 서버 로그인
                client.setFileType(FTP.BINARY_FILE_TYPE);        // 로그인 성공 시 업로드 파일 타입 세팅(기본 값 : ASCII)
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return client;                                            // client 객체 반환
    }
    
    //FTP disconnect
    public void disconnect(FTPClient client) {
        if (client != null && client.isConnected()) {            // client가 연결된 상태일 때
            try {
                client.disconnect();                            // 연결 해제
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
}
 
cs
 


2. 업로드

보통 Spring MVC 프로젝트에서는 파일을 받는 경우 Spring framework에서 제공하는 MultipartFile 형태로 처리한다. 
MultipartFile을 FTP서버에 저장하기 위해서는 MultipartFile에서 파일의 정보를 InputStream으로 받아야한다. 
MultipartFile에서 제공하는 getInputStream()메서드를 이용하도록 하자. 

이제 파일의 정보를 담고 있는 InputStream을 FTP client가 제공하는 메서드 중 하나인 storeFile로 저장할 수 있다.

  • storeFile(String remote, InputStream local) : 지정된 경로(remote)에 InputStream의 정보를 저장하고 있는 파일을 저장한다. 
1
client.storeFile(path, multipartFile.getInputStream());
cs
만약 파일을 업로드 했는데 파일이 손상되어있다면 위에서 설명했던 FileType을 설정해주자.

 


3. 응답 메세지 확인

FTP Client는 친절하게도 작업에 대해 응답 메세지를 제공해준다. 따라서 어딘가 문제가 발생하면 응답 메세지를 반환받아 문제를 파악할 수 있다.

  • getReplyCode() : 가장 마지막 FTP의 응답 코드를 Integer 형태로 반환한다. 

  • getReplyString() : 가장 마지막 FTP의 응답 텍스트를 String 형태로 반환한다.

이렇게 FTP 서버와의 연결, 업로드 방법을 알아보았다. 
FTP Client에 대하여 자세히 알아보려면 https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html를 참고하면 좋을 것 같다. 


 
share
twitter facebook kakao naver
댓글