데이터 베이스 테이블 복사 기능 만들기

DBeaver와 같은 DB TOOL을 사용하지 않고 다른 위치의 DB 간의 테이블 복제하는 프로그램이 필요하여 간단하게 만들었다.

프로그램은 아주 단순 한다. 원본 테이블의 Select Query와 타켓 테이블의 Insert Query를 기준으로 마이그레이션을 진행한다.

소스 보기

준비 사항

  • Gradle
  • JDK 1.8

사용법

lahuman.Migration 파일의 10번째 라인과 11번째 라인의 DB 접속 정보를 입력 한다.

//Line 10~11
Connection originalDB = DriverManager.getConnection("URL", "ID", "PW"); //원본 DBMS
Connection targetDB = DriverManager.getConnection("URL", "ID", "PW"); //복제예정 DBMS

lahuman.Migration 파일의 13번째 라인의 SQL을 작성한다. 이때 작성하는 SELECT SQL과 INSERT SQL의 Column 순서는 맞아야 한다.

//LINE 13
copyTableUsingSQL(originalDB, targetDB, "select A, B, C from T1", "insert into T2(A,B,C)values(?,?,?)");

단순하게 만들어서 그런지 쉽게 사용할 수 있다.



Posted by lahuman

JMH

JAVA와 JVM이 대상인 언어로 작성된 나노/마이크로/밀리/매크로 벤치 마크 분석 구축, 실행을 위한 자바 라이브러리입니다.

기본고려사항

JMH 벤치 마크를 실행하기 위한 권장 방법은 어플리케이션에서 jar 파일의 기본 의존성을 설정하는 메이븐 사용입니다.
이 방법은 벤츠마크가 정확하게 초기화 되고 믿을 수 있는 결과를 받을 수 있도게 접근하도록 한다.
이것은 이미 존재 하는 프로젝트나, IDE 에서 조차 벤치마크가 가능하다, 설치는 더 복잡 하고 신뢰할 수 없는 결과를 준다.
모든 경우에, JMH는 키를 이용해서 annotation이나 bytecode-processors(바이트코드 프로세서) 합성 벤치마크 코드를 생성 한다.
기본 동작은 메이븐 원형을 사용하여 이것을 활성화 합니다.
우리는 새로운 사용자가 설정을 올바른 환경에서 사용하도록 강하게 추천합니다.

MD FILE : 

JMH.md



Posted by lahuman

Lombok 이란?

간단하게 BEAN(POJO) 를 도와주는 라이브러리 입니다. 

annotation을 이용하여 getter, setter 등을 생성한다거나, toSring 객체를 지원 한는 등의 기능을 제공 합니다.



사용법은 IDE를 사용할 경우와 javac 를 이용한 compile을 할 경우로 나누어 집니다.


저는 Intellij 기준으로 설명을 하겠습니다.


Intellij 에서 사용하기 위해서는 Lombok plugin을 설치 해야 합니다.

설치 방법은, 다음과 같습니다.


  • Using IDE built-in plugin system on Windows:
    • File > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
  • Using IDE built-in plugin system on MacOs:
    • Preferences > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
  • Manually:
    • Download the latest release and install it manually using Preferences > Plugins > Install plugin from disk...

원본 : https://github.com/mplushnikov/lombok-intellij-plugin


설치 이후에는 IDE를 재기동 해야 합니다.


이후 Lombok 을 사용하기 위한 compiler 설정을 변경 합니다.


  • install plugin
  • change compiler setting:
    • ... > Compiler > Java Compiler > Use Compiler: Eclipse
    • ... > Compiler > Annotation Processors > Enable annotation processing: checked (default configuration)
    • ... > Compiler > Additional build process VM options: -javaagent:lombok.jar

원본 : https://github.com/mplushnikov/lombok-intellij-plugin


이 설정을 하지 않을 경우 간혈적으로 오류가 발생하거나, 기동시 getter setter method를 찾을 수 없다고 표출 될 수 있습니다.


마지막으로 Lombok 에서 제공하는 기능에 대한 정리 입니다.


val : final 키워드 대신 사용하는 변수 선언 class

@NonNull : 해당 값이 Null 일경우 NullPointerException을 발생한다.

@Cleanup : 자동 리소스 관리 : close() 메소드를 귀찮음 없게 안전하게 호출

@Getter / @Setter : getter, setter를 생성하지 않도록 지원

@ToString : 모든 필드를 출력하는 toString() 메소드 생성

@EqualsAndHashCode : hascode 와 equals 메소드를 생성

@NoArgsConstructor, @RequriedArgsConstructor and @AllArgsConstructor : 인자 없는 생성자 생성, 필수 인자만 있는 생성자 생성, 모든 인자를 가진 생성자 생성

@Data : 다음을 처리 합니다 - @ToString, @EqualsAndHashCode, @Getter(모든 필드), @Setter(모든 필드-final로 성언되지 않은), @RequiredArgsConstructor!

@Value : 불변 클래스를 쉽게 생성

@Builder : Builder API 처럼 사용 할수 있도록 지원

@SneakyThrows : Exception 발생시 체크된 Throable로 감싸서 전달

@Synchronized : 메소드에서 동기화 Lock을 설정

@Getter(lazy=true) : 동기화를 이용하여 최초 1회만 getter가 호출

@Log : 종류별 로그를 사용할 수 있도록 한다. (@Log, @Slf4j, @CommonLog 등)

Configuration system : lombok을 사용하기 위해서 최초 설정

Experimental features : 준비중인 추가 기능



Lomobk library download LINK

Lombok site : https://projectlombok.org/features/index.html

Lombok tutorial : http://jnb.ociweb.com/jnb/jnbJan2010.html


Posted by lahuman

2012년 개인 Library로 만든 것으로, 간단하게 Excel을 만들때 사용한다.



String[] keys = {"CATEGORY_NM", "USER", "USER_ID", "CONTENTS", "START_DT", "END_DT"};
String[] titles = {"서비스-카테고리", "요청자", "담당자", "내역", "시작일", "종료일"};
ExcelUtil.makeExcel(response, "파일명.xls", "문서내 제목 or 검색 조건", titles, keys, List<datamap<string, string>> data);


인자로 response를 받아 처리하기 때문에 웹 전용 Library 이다.

사용법은 위와 같으며 source code는 git 에 올려 두었음.


github : https://github.com/lahuman/easyexcelmaker

Posted by lahuman

2014년 7월 개인 프로젝트로 보고서 작성을 위해 간편하게 문자열 치환으로 보고서를 만드는 library를 생각하고 80% 정도(POI를 이용하여서 크게 어렵지 않았다.) 만들었을때, http://www.docx4java.org/trac/docx4j 사이트를 보게 되었다. 내가 만들려고 하던 것이 이미 구현 되어 있었기 때문에 과감하게 만들던 library는 접고 개인 프로젝트에 docx4j를 사용하였다. 사용법을 간단하게 정리 한다.


docxj4에서는 많은 기능을 제공한다. 그 중 이번 개인 프로젝트에서 사용한 문자열 치환하는 샘플 소스 이다.


public class VariableReplace {
	
	public static void main(String[] args) throws Exception {
		
		// Exclude context init from timing
		org.docx4j.wml.ObjectFactory foo = Context.getWmlObjectFactory();

		// Input docx has variables in it: ${colour}, ${icecream}
		String inputfilepath = System.getProperty("user.dir") + "/sample-docs/word/unmarshallFromTemplateExample176.docx";

		boolean save = false;
		String outputfilepath = System.getProperty("user.dir")
				+ "/OUT_VariableReplace.docx";

		WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
				.load(new java.io.File(inputfilepath));
		MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

		HashMap<string, string> mappings = new HashMap<string, string>();
		mappings.put("colour", "green");
		mappings.put("icecream", "chocolate");
		
		long start = System.currentTimeMillis();

		// Approach 1 (from 3.0.0; faster if you haven't yet caused unmarshalling to occur):
		
			documentPart.variableReplace(mappings);
		
/*		// Approach 2 (original)
		
			// unmarshallFromTemplate requires string input
			String xml = XmlUtils.marshaltoString(documentPart.getJaxbElement(), true);
			// Do it...
			Object obj = XmlUtils.unmarshallFromTemplate(xml, mappings);
			// Inject result into docx
			documentPart.setJaxbElement((Document) obj);
*/
			
		long end = System.currentTimeMillis();
		long total = end - start;
		System.out.println("Time: " + total);

		// Save it
		if (save) {
			SaveToZipFile saver = new SaveToZipFile(wordMLPackage);
			saver.save(outputfilepath);
		} else {
			System.out.println(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true,
					true));
		}
	}

}

상위 소스를 보면 참 쉽줘~ 라는 말이 나올수 밖에 없다.

상위 소스는 docx4j 에서 받을 수 있다.


간단하게 설명을 하면, docx 문서에서 치환할 위치에 ${KEY}로 문서 내용을 적고 java 에서 HashMap 으로 KEY 와 VALUE를 준비해서  documentPart.variableReplace(mappings); 만 호출 해주면 끗!




추가로 https://code.google.com/p/xdocreport/ 이것도 있다 

아는분 조언에 따르면 xdocreport가 사용이 편하다고 한다.


Posted by lahuman