1. 개요

프로젝트에서 특정 기간 동안 매 시간마다 파일을 다른 서버로 업로드 시켜야하는 문제가 생겼다.

기존 데이터 흐름

1. 중계 서버에서 원본 서버에 데이터를 요청한다 (request)
2. 원본 서버에서 중계 서버로 결과값이 보내진다 (response)
3. 원본 서버에서 받아온 결과값을 필요한 데이터만 존재하는 파일로 재가공한다 (copy)
4. 재가공된 파일을 목적지 서버에 제공한다 (링크, url, 파일 등)

 

 

🛠️번거로움도 있고,

목적지 서버에서 중계 서버에 요청할 때마다 중계 서버에서 다시 원본 서버로 요청/응답 커넥션이 이뤄지는 부분이 껄끄러운 느낌이 있었다.

➕사실 기존 방식을 토대로 구현하고자 했으나, 에일?리언 코?드..

이해하기 어렵고 예전 라이브러리 (java 8보다 낮은 버전)를 사용하다보니

"java 8로 개발할 수 있는데 굳이?" 라는 생각이 들어서 조금 고쳐봤다

 

Java file copy 활용

1. 원본 서버에서 필요한 데이터를 불러와 row data file을 생성한다
2. row data file을 copy 하여 new file을 생성한다
3. 중계 서버에 new file을 제공한다 (sftp)
4. 목적지 서버에서 중계 서버에 정보를 요청한다 (request)
5. 중계 서버는 이미 받아둔 new file을 활용하여 결과값을 리턴한다 (response)

1번과 2번에서 주로 쓴 java file 활용방법을 메모해두고자 한다. (별거없음 ㄹㅇ)


2. Files.copy

(출처 : https://hianna.tistory.com/604 #2번 항목)

Copying and moving files. Copy a file to a target file.
- 해당 메소드는 복사를 수행하는 옵션을 가진 매개변수(파라미터)를 사용하여 타겟이 되는 파일에 원본 파일을 복사합니다. 
- 원본과 대상이 동일한 파일인 경우를 제외하고는 대상 파일이 이미 있거나 심볼릭 링크인 경우 복사가 실패합니다. 단, 이 경우 메소드는 파일을 복사하지 않고 완료됩니다.

source : 복사할 파일의 경로 (=원본파일의 위치)
target : 대상 파일의 경로(소스 경로에 대해 다른 공급자와 연결될 수 있음)
options : 복사 방법을 수행하는 옵션

1) REPLACE_EXISTING
- 이미 파일이 있으면 덮어쓴다

2) COPY_ATTRIBUTES

- 특성을 새 파일에 복사한다

3) ATOMIC_MOVE

- 원자적 파일 시스템 작업을 통해 파일을 옮긴다(?)

 

 

 

 

소스코드 예시

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class Main{
	public static void main(String[] args) throws Exception {
    	
        // temp file & data file
        String tempFile = VO.SAVED_FILE_PATH + "/tempFile.json";
        String dataFile = VO.SAVED_FILE_PATH + "/dataFile.json";

        // create tempFile.json file
        BufferedWriter writer = new BufferedWriter(
                					new OutputStreamWriter(
                    					Files.newOupputStream(Paths.get(tempFile))
                    					, StandardCharsets.UTF_8));
                                        
        // tempFile에서 설정한 경로에 UTF-8 encoding 옵션으로 파일 생성                             
        writer.write(jsonArray.toString());
        writer.flush();
        writer.close();

        // copy files
        // 1. origin file, target file
        File tempFiles = new File(tempFile);
        File newFiles = new File(dataFile);

        // 2. copy
        // toPath() : copy 메소드가 요구하는 경로값을 제공하기 위함
        Files.copy(tempFiles.toPath(), newFiles.toPath(), StandardCopyOption.REPLACE_EXISTING);

    }

}

3. 복습

내가 생각한 중계 서버는, 중계 서버 자체로 가지고 있는 데이터를 통해 목적지 서버가 요청하는 데이터를 제공함으로써 원본 서버에 가해지는 접속량을 감소시키는 대에 있다고 생각했다.

개선된 방식은 아래와 같은 특징이 있다고 본다.

1) 원본 서버가 직접 요청을 받지 않는다.

2) 원본 서버에 문제가 생겨도 당분간 중계 서버에 남아있는 문제가 발생되기 전의 데이터로 시간을 벌 수 있다.

 

특히 2번의 경우, 불의의 사고로 원본 서버에서 데이터를 보내줄 수 없다해도 당분간은 중계 서버에서 대응이 가능하다는 점이다.

(이거 완전 DNS 네임서버에서 구조...)

'언어 > Java' 카테고리의 다른 글

Java is...  (0) 2023.06.02

+ Recent posts