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

데이터 출력(DB -> json,xml등) 프로그램-2【JSON출력】

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

지난 포스트에 이어서 이 포스트에서는 JSON 데이터를 출력하는 기능에 대해 정리하겠습니다. 

 

1. 실행결과

 

 

2. 구현방법

 이 토이 프로젝트에서 JSON 데이터를 출력할 때는 Jackson라이브러리를 사용했습니다.
JSON을 다루는 Java라이브러리 중에서 실무에서 다루어 본 것은 Jackson, GSON이 있는데, 
JSON을 파싱 할 때 대용량 데이터를 다루게 될 경우 Jackson이 GSON에 비해서 빠르기 때문입니다. 

라이브러리 별 파싱 속도는 아래 링크된 블로그의 글에서 잘 정리된 것 같으니 참고하시면 좋을 것 같습니다.
http://www.yunsobi.com/blog/entry/java-json-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%B3%84-parser-%EC%86%8D%EB%8F%84-%EB%B9%84%EA%B5%90

 

java json 라이브러리 별 parser 속도 비교. :: 서비의 다락방

우선, 테스트 진행한 json 라이브러리 후보군은 JSON.simple ( Yidong Fang ) GSON ( Google ) Jackson ( FasterXML ) JSONP  ( Oracle ) 과 같음. 상기 라이브러리를 이용한 비교적 큰 사이즈의 json 문서 파싱 속도 벤치

www.yunsobi.com

이 토이 프로젝트에서는 파싱에 관련된 기능은 없지만 
구상하고 있는 토이프로젝트 중 대용량의 JSON파싱 기능이 필요한 경우가 있으므로 겸사겸사 Jackson을 사용하게 되었습니다. 


※ 아래 코드는 Java객체를 JSON 데이터로 변환하거나, JSON 데이터를 파싱 하는 유틸 클래스입니다. 

 

package tools.utils;
/**
 * JSON 데이터를 지정한 클래스(데이터를 담기위한 클래스) 형식으로 파싱, 
 * 또는  지정한 클래스에 담긴 데이터를 JSON형식으로 변환해주는 유틸클래스.
 * 대용량 JSON데이터를 처리하는데 있어 유리한 jackson-databind를 사용했다.
 * 이 코드를 사용하기 위해선 build.gradle에 아래의 의존성을 추가해주어야한다.
 * // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
 * compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2'
 * 
 * @author lee-y
 *
 */
public class JsonUtil {

	public ObjectMapper mapper = new ObjectMapper();
	
	private JsonUtil() {};
	
	public static JsonUtil getInstance() {
		return JsonUtilHolder.INSTANCE;
	}
	
	private static class JsonUtilHolder {
		private static final JsonUtil INSTANCE = new JsonUtil();
	}
	
	/**
	 * Json 데이터를 파싱하기 위한 메소드.
	 * 
	 * @param json     : 파싱할 Json데이터
	 * @param template : 파싱한 데이터를 담기위한 클래스
	 * @return
	 */
	public Object makeObjFromJson(String json, Class<?> template) {
		if (json == null) return null;
		
		Object res = null;
		
		try {
		    res = mapper.readValue(json, template);
		} catch (JsonProcessingException e) { e.printStackTrace(); }
		
		return res;
	}
	
	/**
	 * 지정한 데이터 클래스에 담긴 데이터를 Json형식의 문자열 데이터로 변환해주는 기능.
	 * 
	 * @param obj : : Json으로 변환하기 위한 데이터 클래스
	 * @return : Json 문자열을 리턴한다.
	 */
	public String makeJsonFromObj(Object obj) {
		if (obj == null) return null;
		
		String res = null;
		
		try {
			res =  mapper.writeValueAsString(obj);
		} catch (JsonProcessingException e) { e.printStackTrace(); }
		
		return res;
	}
	
	
	/**
	 * 지정한 데이터 클래스에 담긴 데이터를 Json형식의 byte[]데이터로 변환해주는 기능.
	 * 
	 * @param obj : : Json으로 변환하기 위한 데이터 클래스
	 * @return : byte[]를 리턴한다.
	 */
	public byte [] makeJsonByteFromObj(Object obj) {
		if (obj == null) return null;
		
		byte [] res = null;
		
		try {
			res =  mapper.writeValueAsBytes(obj);
		} catch (JsonProcessingException e) { e.printStackTrace(); }
		
		return res;
	}
	
	/**
	 * 지정한 데이터 클래스에 담긴 데이터를 Json형식의 File로 변환해주는 기능.
	 * 
	 * @param obj : : Json으로 변환하기 위한 데이터 클래스
	 */
	public void makeJsonByteFromObj(Object obj, String filePath) {
		if (obj == null || filePath == null || filePath.equals("")) return ;
		
		File f = null;
		
		try {
			f = new File(filePath);
			mapper.writeValue(f, obj);
			
		} catch (IOException ie) { ie.printStackTrace(); }
		
	}
	
}


※ 위의 유틸 클래스의 메서드를 ItemDataOutputJson.java에서 사용하여 Item객체를 Json데이터로 변환하여 파일로 출력합니다.

 

package tools.dataoutput;
public class ItemDataOutputJson extends ItemDataOutput {
	
	private JsonUtil jsonUtil = JsonUtil.getInstance();
	
	public ItemDataOutputJson() {
		super();
		
		Properties prop = new Properties();
		InputStream is = null;
		try {
			is = ItemDataOutput.class.getClassLoader().getResourceAsStream("config.dataoutput.properties");
			prop.load(is);
			super.OUTPUT_DIR = prop.getProperty("output.dir.dataoutput.json");
			super.OUTPUT_FILE_NAME = prop.getProperty("output.filename.dataoutput.json");
			super.EXTENTION = ".json";
			super.ENCODING_TYPE = prop.getProperty("encodingtype.dataoutput.json");
			
		} catch (Exception e) {
			System.out.println("Properties load fail!!");
		}
	}
	
	
	@Override
	public void outputDataToFile(List<Item> list, int processNum) {
		String outputFilePath = makeFileName(processNum);
		
		try (BufferedWriter bw = Files.newBufferedWriter(
				Paths.get(outputFilePath), 
				Charset.forName(ENCODING_TYPE),
				StandardOpenOption.CREATE_NEW)) {
			
			StringBuffer sb = new StringBuffer();
			int size = list.size();
			
			sb.append("[");
			for (int i=0; i < size; i++) {
				Item item = list.get(i);
				sb.append(jsonUtil.makeJsonFromObj(item));
				sb.append( (i == size-1) ? "" : ",");
			}
			sb.append("]");
			
			bw.write(sb.toString());
		
		} catch (IOException e) {
			e.printStackTrace();
		} catch (NullPointerException e) {
			e.printStackTrace();
		}
		
	}
	


}

 

반응형

댓글