본문 바로가기
프로그래밍/Java-토이프로젝트

데이터 출력(DB -> json,xml등) 프로그램-1【전체구조】

by 코이킹 2021. 5. 22.
반응형

1. 문제 인식

제가 개발자로 일하면서 구현한 프로그램 중의 대부분은 회사 내부 API 또는 타사 API와의 데이터 통신이 필요했습니다.
모든 API가 같은 방식의 데이터를 사용한다면 좋겠지만 오래된 API는 xml로 데이터를 주고받거나, 신규 API는 json으로 주고받는 등 다양한 방식의 데이터를 주고받는 게 일반적입니다. 

실무에서 어떤 데이터를 출력의 요건에도 대응할 수 있도록 이 토이프로젝트에서 데이터 출력에 대해 정리해보려 합니다.  

 

※ 이번 토이프로젝트에서 말하는 데이터 통신은?
다양한 방식의 데이터(JSON, XML, csv 등)를
HTTP 통신을 사용해서 원하는 곳 (특정 API, DB 서버, 사용자의 화면)으로, 
원하는 방식의 데이터로 보내주며, 지정한 API등으로 부터 다양한 방식의 데이터를 받아와서 원하는 방식으로 가공, 저장할 수 있는 것이라고 생각합니다. 
 - ※ 어디까지나 토이 프로젝트 안에서의 저의 주관적인 생각입니다.

 

2. 서비스 개요 サービス概要

 - DB에 저장되어 있는 데이터를 지정한 형식의 파일로 출력해주는 프로그램. 
  -> DBに格納されているデータを指定したデータ形式のファイルに出力するプログラム。

 

3. 요구 조건 要求条件

 - DB로부터 데이터를 가져와서 지정한 형식의 데이터로 변환하여 파일로 출력.
  -> DBからデータを取込み、指定した形式のデータに変換してファイルに出力。

 - 지정할 수 있는 데이터 형식은 json, xml, tsv, csv가 있다.
  -> 指定できるデータ形式はjson, xml, tsv, csvがある。

 

4. 상세 사양 詳細仕様

 1) 출력할 데이터 

  - MySQL에서 간단한 상품정보 테이블을 작성했습니다.

CREATE TABLE `item` (
  `ITEM_ID` int(11) NOT NULL,
  `ITEM_NAME` varchar(100) NOT NULL,
  `ITEM_DESCRIPTION` text NOT NULL,
  `MAKER_CODE` varchar(50) NOT NULL,
  `PRICE` int(11) NOT NULL,
  `SALE_STATUS` int(11) NOT NULL,
  `IMAGES` text 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2) 처리 내용

  (1) 구동 변수(-$1)로 데이터 형식을 지정하여 프로그램을 실행.   -> 起動引数(-$1)にデータ形式を指定してプログラムを実行。

    구동 변수로 입력 가능한 값은 영어 소문자로 json, xml, tsv, csv 중 1개만이 입력 가능.
    구동 변수로 입력한 값이 상기 4개 중의 하나가 아니거나 입력값이 없다면 프로그램은 실행되지 않음. 
   -> 起動引数に入力できる値は英語の小文字でjson, xml, tsv, csvのうちどちらか1個だけ入力可能。
       起動引数に入力した値が上記4つのうち1つではない場合、又は入力値がない場合はプログラムは実行しない。
  

  (2) 필수 파라미터 읽어오기  -> 必須パラメータ読込。

    $1에 설정된 값에 해당하는 파라미터를 설정 파일로부터 읽어오기
    ※ 아래와 같은 값을 설정파일로 부터 읽어온다. 
     파일 형식, 파일 출력 경로, 파일명, 파일의 인코딩 형식, 한 번에 출력할 데이터 건수, 데이터 구분자 등..  
    -> $1に設定した値に該当するパラメータを設定ファイルから読込み。
    ※ 下記のような値を設定ファイルから読込。
     ファイル形式,ファイル出力パス,ファイル名,エンコーディングタイプ,1回出力するデータ件数,データ区分文字など..

 

  (3) 출력할 데이터의 전체 레코드 수를 확인하기 -> 出力するデータの全体レコード数を確認する。

  (4) DB로부터 데이터를 가져와 지정한 형식으로 변환하여 파일로 출력하기 ->  DBからデータを取込み、指定した形式のデータに変換してファイルに出力する。

 

5. 순서도 フローチャート

 

6. 소스코드

https://github.com/leeyoungseung/java-tools/blob/master/src/main/java/tools/ItemDataOutputTool.java

- 아래의 코드가 메인 메서드가 위치한 코드.

package tools;

public class ItemDataOutputTool {

	
	private ItemDataOutputTool() {}
	
	public static ItemDataOutputTool getInstance() {
		return ItemDataOutputToolHolder.INSTANCE;
	}
	
	private static class ItemDataOutputToolHolder {
		private static final ItemDataOutputTool INSTANCE = new ItemDataOutputTool();
	}
	
	
	public static void main(String[] args) {
		ItemDataOutputTool idl = ItemDataOutputTool.getInstance();
		
		// 데이터 출력 프로그램 시작
		try {
			System.exit(idl.outputDataToolExecute(args[0]) ? 0 : 50);
		
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(101);
		} catch (NullPointerException e) {
			e.printStackTrace();
			System.exit(102);
		}
	}
	
	/**
	 * 추출데이터를 파일로 출력하는 처리의 메인
	 * 
	 * @param outputType : 출력할 파일의 형식(확장자)
	 * @return
	 * @throws IOException
	 */
	public boolean outputDataToolExecute(String outputType) throws IOException, NullPointerException{
		// (1) 출력 타입별로 다른 인스턴스를 생성한다.
		//ItemDataOutputFactory factory = new ItemDataOutputFactory();
		ItemDataOutput job = ItemDataOutputFactory.getInstance(outputType);
		
		if (job == null) {
			throw new NullPointerException();
		}
		
		// (2) 추출해야하는 데이터의 전체 건수를 확인한다.
		// (3) 'A: 데이터의 전체 건수 / B: 1회 데이터 최대 건수' 의 값만큼 아래(4~6)처리를 반복한다.
		// (4) 1회 데이터 출력 최대건수를 데이터를 DB로부터 가져온다.
		// (5) 데이터를 가공한다.
		// (6) 가공한 데이터를 지정한 경로에 출력한다.
		return job.outputDataProcess();
	}
}

 

- outputDataToolExecute()에서 출력할 파일 형식에 따라 다른 객체를 생성해서 대응한다. 

- 다른 데이터 형식의 출력이 필요한 경우에는 ItemDataOutput를 상속하는 클래스를 추가하여 쉽게 기능 확장 가능.

- ItemDataOutput를 상속하는 클래스를 만든후에는 아래의 팩토리에서 객체를 생성하도록 코드를 추가한다.

package tools.dataoutput;

public class ItemDataOutputFactory {

	public static ItemDataOutput getInstance(String type) {
		ItemDataOutput ItemDataOutput = null;
		
		switch (type) {
		case "json":
			ItemDataOutput = new ItemDataOutputJson();
			break;
		case "xml":
			ItemDataOutput = new ItemDataOutputXml();
			break;
		case "csv":
			ItemDataOutput = new ItemDataOutputCsv();
			break;	
		case "tsv":
			ItemDataOutput = new ItemDataOutputTsv();
			break;	
		default:
			break;
		}
		
		return ItemDataOutput;
	}
}

 

 

반응형

댓글