2013년 8월 8일 목요일

Maven POM설정 파일 및 저장소, 생명주기

Maven이 제공하는 기능
Builds
Documentation
Reporting
Dependencies – 의존관계 관리, 프로젝트나 모듈간 의존성관리 가능
SCMs – 소스코드 관리
Releases
Distribution

POM 설정파일
프로젝트와 관련된 정보를 Project Object Model (이하 POM)이라는 이름으로 정의하고 있으며, POM의 이름을 따서 기본 설정 파일은 "pom.xml" 파일이다.
프로젝트 기본 정보
프로젝트 이름, URL, 개발자, 라이선스 등등
빌드 설정
기본 빌드 설정을 변경하기 위한 카테고리 (소스, 리소스 디렉토리 변경, 플러그인 설정 변경 및 플러그인 추가)
프로젝트 관계 설정
각 프로젝트간의 관계 관리 혹은 모듈간의 의존성 관리
빌드 환경
다양한 환경에 따라 달라지는 설정 정보를 관리 (프로파일 기능)
속성 정보 관리
pom/project 속성, settings 속성, 시스템 환경 변수 속성, 자바 시스템 속성 등을 정의 또는 사용할 수 있다.
메이븐은 기본적인 프로젝트 디렉토리 구조와 플러그인 정보를 포함하고 있는 POM설정파일을 제공하며 모든 POM 설정 파일은 해당 설정파일을 상속한다.

Maven 저장소
중앙 저장소
오픈 소스 라이브러리, 메이븐 플러그인, 메이븐 아키 타입을 관리하는 저장소
원격 저장소
중앙 저장소에 없는 라이브러리를 한 곳에 모아두기 위하여 별도의 메이븐 저장소를 설치 해 관리
사내 원격 저장소나 외부에 위치하는 외부(공개) 원격 저장소 등등
로컬 저장소
메이븐을 빌드할 때 다운로드하는 라이브러리, 플러그인을 관리하는 개발자 PC의 저장소
기본 로컬 저장소는 USER_HOME/.m2/repository

프로파일 기능
메이븐은 환경에 따라 달라지는 설정을 각각 다르게 관리할 수 있는 프로파일 기능을 제공한다.
프로파일은 <profiles>/<profile> 엘리먼트를 사용하여 설정할 수 있다.
<project> 루트 엘리먼트가 가질 수 있는 모든 엘리먼트를 설정할 수 있다.

메이븐 모듈
메이븐은 하나의 프로젝트에서 여러 모듈을 관리할 수 있는 기능을 지원한다.
일반적으로 서비스를 개발하게 되면 관리자 페이지와  고객의 서비스 제공을 위한
  Web Module이 분리가 되고, 두 개의 모듈이 핵심 비지니스 로직을 공유하게 된다.
  이런 경우 메이븐의 모듈 기능을 이용하면 유용하다.
메이븐의 모듈 개념을 이해하고 활용하려면 상속, 집합, 의존 관계 개념을 이해해야 한다.
프로젝트에서 공통으로 사용하는 설정은 공통 POM 파일을 만들어 관리하고
  하위 모듈에서 이 POM파일을 상속할 수 있다

생명주기
1. Life Cycle
페이즈 
 의존관계
 compile

 test
compile -> test 
 package
test -> package
 install

 deploy


2. Clean Life Cycle
  clean : 메이븐 빌드를 통하여 생성된 모든 산출물을 삭제 (target 디렉토리 삭제)

3. Site Life Cycle
페이즈 
 설명
 site
target/site 디렉토리에 문서 사이트 생성
 site-deploy
생성한 문서 사이트를 설정되어 있는 서버에 배포

 Maven 플러그인
메이븐에서 제공하는 모든 기능은 플러그인 기반으로 동작한다.
메이븐 라이프사이클에 포함되어 있는 페이즈 또한 플러그인을 통하여
  실직적인 작업이 실행된다.
<bild>/<plugins>/<plugin> 엘리먼트를 사용하여 원하는 플러그인을
  추가 및 설정 할 수 있다.
하나의 플러그인에서 여러 작업을 수행할 수 있고, 실행할 수 있는
  각각의 작업을 goal 이라고 정의한다.

페이즈와 플러그인 관계
페이즈의 작업은 메이븐에서 기본으로 포함하고 있는
  각 플러그인의 골을 이용해서 수행한다

기존의 빌드 툴과 Maven

기존의 빌드
1)Make
Makefile 안에서 룰을 이용해서 의존관계를 표현
변수로 매크로를 지원하고 접미사 관련 룰 등을 명시
2)Ant
자바로 구현됨, 자바 프로젝트 빌드에 적합
XML 파일(build.xml)을 사용하여 빌드 프로세스와 의존성 정의
개발자가 임의로 Target을 만들고 원하는 의존관계를 설정할 수 있다
3)Gradle
AntMaven과 비슷한 컨셉
XML대신 DSL을 통해 프로젝트 정의
Groovy 기반

기존의 빌드 툴이 제공하는 기능
Preprocessing
Compilation
Packaging
Testing
Distribution

Maven이란?
아파치의 오픈 소스 빌드 툴이다(프로젝트 관리 툴이기도 하다).
대규모 프로젝트에서 발생하는 빌드 관련 문제를 해결하기 위해 등장했다.
Yiddish(이디시어-유대인어)의 뜻으로는 지식의 축적자
  (축적된 지식으로 이해하는 사람)라고 한다.
빌드, 문서화, 리포팅, 라이브러리 관리, 배포 등의 지식을 축적하고 관리하는 툴이다.
메이븐은 설정보다 관례(CoC;Convention over Configuration)라는 컨셉이다.
지정된 규칙에 따라 코드를 위치시키면 컴파일, 패키징, 문서화 등의
  나머지 작업들을 자동으로 수행한다.

Maven의 목적
개발자가 짧은 기간에 개발의 전체 상태를 이해 할 수 있도록 한다
빌드 진행을 쉽게 만든다.
일정한 빌드 환경을 제공한다.
양질의 프로젝트 정보를 제공한다.
최적의 개발을 위한 가이드라인을 제공한다.
새로운 기능을 투명하게 적용시킬 수 있다

MavenAnt의 비교
Apache Ant
Apache Maven
기존의 make와 같은 툴의 단점을 보완한
XML 기반의 빌드 툴
하나이상의 정의된 xml 파일 스크립트에 의해 동작
xml 파일에 정의된 target을 수행하고
target은 task수행
Ant와 비슷하나 프로젝트 관리를 위한 프로젝트 관리 툴
모든 프로젝트를 특정 구조와 지원되는
task work-flow들의 일련으로 간주
Pom.xml에 프로젝트 구조와 동작 정의
프로젝트의 구조와 work-flow는 정해진
컨벤션에 맞춰 동작
Ant은 생명주기(lifecycle)을 가지지 않는다.
Goal들과 Goal 의존성을 정의 해 주어야만 한다.
각각의 Goal에 대해 직접 작업의 순서를
추가해 주어야 한다
명령을 실행했을 때 호출되는 생명주기를 가진다.
Phase 마다 일련의 순차적인 생명주기
단계를 실행하도록 한다.
생명주기를 통한 과정 때문에 수많은
기본 플러그인 goal을 실행한다
Ant은 절차적이다.
Ant에게 무엇을 하고 언제 해야 할지는
정확히 알려줘야만 한다.
Maven은 선언적이다.
pom.xml 파일을 만들고 디렉터리에 소스
파일을 넣으면 알아서 처리한다
스크립트 실행 없이는 빌드를 추론하기 어렵다.
복잡한 스크립트는 부담스러운 과제가
될 수도 있음
이미 완성된 프로젝트에 적용하기 어렵다.
자율성이 떨어진다는 의견도 있다
스크립트가 재사용 가능하지 않다
재사용 가능한 플러그인, 저장소

2013년 8월 7일 수요일

Java Set 자료구조

List처럼 Collection Interface를 구현한 것이지만
List와는 다르게 중복을 허용하지 않는다.
Distinct한 결과를 얻을 때 좋을 것 같다.
Map 형태는 key와 value 형태로 데이터를 입력 받는다는 차이가 있다.

--------------------------------------------------------------------------------------------------------------------
출처: http://darkmirr.egloos.com/1180412
import java.util.*;//hashset 에 값 넣는 법과 호출방법
import sun.text.CompactShortArray.Iterator;
public class CollectionTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub
HashSet set = new HashSet(); set.add("abc");
set.add(new Integer(10)); set.add(new Date());
visitAll(set); }
public static void visitAll(Collection c) {
java.util.Iterator iii = c.iterator();
while (iii.hasNext()) { System.out.println(iii.next()); } }
}
--------------------------------------------------------------------------------------------------------------------
출처: http://www.easywayserver.com/blog/java-set-example/
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class SetExample {

    public static void main(String[] args) {

        // Set example with implement TreeSet
        Set<String> s=new TreeSet<String>();

        s.add("b");
        s.add("a");
        s.add("d");
        s.add("c");

        Iterator it=s.iterator();

        while(it.hasNext())
        {
          String value=(String)it.next();

          System.out.println("Value :"+value);
        }
    }
}

참고
http://ash84.tistory.com/895
http://pic.dhe.ibm.com/infocenter/adiehelp/v5r1m1/index.jsp?topic=%2Fcom.sun.api.doc%2Fjava%2Futil%2FSet.html
http://www.tutorialspoint.com/java/java_set_interface.htm
http://algs4.cs.princeton.edu/35applications/SET.java.html

chmod 등 기초 명령어 - 링크

리눅스 기초 명령어가 잘 소개되어 있어서 링크를 남겨 놓는다.
chmod : http://coffeenix.net/data_repository/pdf/unixlinuxdic.pdf
              https://www.linux.co.kr/linux/rootman/page04.htm
              http://a07274.tistory.com/entry/chmod-%EC%84%A4%EC%A0%95-%EC%82%AC%EC%9A%A9%EB%B2%95
echo, tar : http://help.jungbo.net/help/subpages/sub05_01_01.html

젠킨스, 하둡 설정 - 링크

Jenkins 빌드 자동화 내용 : http://bcho.tistory.com/entry/Hudson%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B9%8C%EB%93%9C-%EB%B0%B0%ED%8F%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94

-----------------------------------------------------------------------------------------------------------------------

하둡 설정 내용 : http://blog.eduby.me/2012/03/fully-distributed-hadoop.html
                             http://developer.yahoo.com/hadoop/tutorial/module3.html
                             http://computer2citylock.blogspot.kr/2013/02/hadoop-on-ubuntu1210.html
                             http://tawool.tistory.com/281

  # hadoop tmp 디렉토리 미 지정시에 dfs, mapred 네임노드 관련 파일을
     /tmp/ 디렉토리 하위에 생성
  # 클러스터 구축시 데이터노드(리모트) 서버 에도 데이터를 저장할 위치를
     아래와 같은 방식으로 각 서버별로 지정

-----------------------------------------------------------------------------------------------------------------------

하둡 pid 오류 내용 : http://blog.beany.co.kr/archives/2165
                                   http://www.cs.brandeis.edu//~cs147a/lab/hadoop-troubleshooting/

아래의 내용은 참고할만 한것 같다. pid는 임시 폴더에 저장 되어서 fully distributed 환경에서 오류가 발생할 수 있을 듯.

$HADOOP_HOME/conf/hadoop-env.sh
export HADOOP_PID_DIR=/var/hadoop/pids

-----------------------------------------------------------------------------------------------------------------------
모의 분산이던 완전 분산이던 중요한것은
$HADOOP_HOME/conf 폴더안의 내용들을 통일해야 한다는것
완전 분산모드라면 masters와 slaves의 내용을 수정해야 한다.
그리고 /etc/hosts 에 master와 slave의 ip 주소들을 설정해놓아야 한다.
그리고 core-site.xml 파일에 master를 명시해야 한다.
모의 분산이면 여기에서 마스터를 로컬호스트로 설정한다.
hdfs-site.xml 파일에서 설정한 datanode와 namenode, tmp 폴더는
모두 "chmod -R 755 폴더" 명령을 통해서 755 옵션을 주어야 한다.

옵션을 제대로 주지 않으면 아래와 같은 에러가 난다.
13/08/08 10:52:02 WARN datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /hadoop_data/data, expected: rwxr-xr-x, while actual: rwxr----x

그리고 설치 후 중간에 환경설정들을 바꾸면 네임노드를 포멧하는것이 좋다.
아래와 같은 에러가 날 수 있다.
13/08/08 10:57:49 ERROR datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /hadoop_data/data: namenode namespaceID = 618126238; datanode namespaceID = 504005262

datanode, namenode의 경로를 설정한 폴더의 내용물을 모두 지우고 네임노드를 포멧
bin/hadoop namenode -format

hadoop.sh 파일의 설정은 크게 두가지만 신경쓰면 될듯하다.
1. 자바 폴더 설정 : export JAVA_HOME=/home/Development/java
2. 하둡 PID폴더 설정 : export HADOOP_PID_DIR=/var/hadoop/pids

mapred-site.xml 파일의 내용을 추가 했다면
잡 트랙커는 master의 주소로 설정했는지 확인하고
     </property>
    <property>
        <name>mapred.system.dir</name>
        <value>/home/kwonjae/hadoop_data/mapreduce/system</value>
    </property>

    <property>
        <name>mapred.local.dir</name>
        <value>/home/kwonjae/hadoop_data/mapreduce/local</value>
    </property>
설정한 폴더의 chmod 755 옵션도 확인해야겠다.

참조
                          http://webdir.tistory.com/162
                          http://cms.nkia.net:8089/?p=330
하둡 설정 내용: http://develop.sunshiny.co.kr/865
                            http://devyongsik.tistory.com/343
                            http://develop.sunshiny.co.kr/895

Spring Batch JDBC - deleting table

JDBC를 통해 mysql에 있는 table의 내용을 지우는 작업을 만들었다.

먼저 custom tasklet을 빈으로 선언
  <bean id="jdbcCleanUp"
  class="my.mysql.JdbcCleanUp">
  <property name="dataSource" ref="dataSource"/>
  </bean>
----------------------------------------------------------------------------------------------------------------------
배치 작업을 설정
<batch:job id="cleanUp">
<batch:step id="cleanning">
<batch:tasklet ref="jdbcCleanUp" />
</batch:step>
</batch:job>
----------------------------------------------------------------------------------------------------------------------
custom tasklet을 작성
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class JdbcCleanUp extends JdbcDaoSupport implements Tasklet{

@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
// TODO Auto-generated method stub
delete();
return null;
}
public void delete() {
String[] sql = {"delete from AD_CNT_TB","delete from UNIT_CNT_TB",
"delete from OS_CNT_TB","delete from LOCATION_CNT_TB",
"delete from GENDER_CNT_TB","delete from AGE_CNT_TB"};
   getJdbcTemplate().batchUpdate(sql);
}
}

참고:http://www.java2s.com/Code/Java/Spring/UseJdbcTemplateToExecuteDeleteStatementWithParameter.htm

Java jar 실행

많은 사이트들을 본 결과 메인 클래스를 명시한 메니페스트 파일이 필요한데,
이를 정확하게 알려주는 곳은 없었다.
그냥 이클립스에서 export에서 executable jar파일 만들기를 선택하는 것이
가장 쉽고 확실했다.

하지만 아래의 내용은 알아두면 좋을 것 같아서 인용했다.

jar파일 실행
java -jar xxx.jar args

jar파일 생성 옵션
jar {ctxu}[vfm0M] [jar-file] [manifest-file] [-C dir] files ...
옵션:
    -c  새 아카이브를 생성
    -t  아카이브에 대한 목차를 나열
    -x  아카이브에서 명명된 (또는 모든) 파일을 추출
    -u  기존의 아카이브를 업데이트
    -v  표준 출력에 대한 자세한 정보 출력을 생성
    -f  아카이브 파일 이름을 지정
    -m  지정된 증명 파일에서 증명 정보를 포함
    -0  저장만 수행하며 ZIP 압축을 사용하지 않음
    -M  입력 항목에 대한 증명 파일을 만들지 않음
    -i  지정된 jar 파일에 대한 색인 정보를 생성
    -C  지정된 디렉토리로 변경하고 다음 파일을 포함

'm' 및 'f' 옵션이 지정된 순서대로 파일 이름을 지정해야 한다.

참고: http://blog.naver.com/PostView.nhn?blogId=junohda&logNo=60195286546
http://blog.daum.net/bang2001/23
http://ra2kstar.tistory.com/125