캠핑과 개발


Maven으로 프로젝트를 진행하면서 며칠동안 삽질을 한 결과 그나마 조금 이해가 가기 시작하며 영어의 절심함 또한 뼈저리게 느낀다..
하지만 이만한 고생으로 Maven의 편리함이 조금씩 이해가 가기 시작한다.
xml 설정만으로도 이렇게 좋을 수가 있다니 세상 참 넒다..

메이븐을 통해서 빌드를 하는 과정에서 톰캣과 연동하고 프로젝트에 맞게 빌드하는 과정에서 알게된 빌드 라이프 사이클에 대해서 간단히 정리를 한다..

기본적으로 이클립스로 Run As를 누르면 기본적으로 제공되는 Maven 빌드 라이프 사이클을 볼수가 있다.



상단에 m2라고 적힌 부분이 메이븐 플러그인을 설치하면 볼 수 있는 메뉴들이다.

다 써보진 않았지만 간단한 설명을 하자면 다음과 같다.

assembly:assembly : 배포물(jar) 에 해당 라이브러리도 같이 넣을때 사용
build : 빌드를 실행한다.
build... : 새로운 사용자 빌드를 만든다.
generate-sources : 컴파일 과정에 포함될 소스를 생성한다. 예를 들어,  DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다.
clean : target에 지정된 모든 소스를 삭제한다.
install : 로컬 리포지토리에 패키지를 복사한다.
package : 컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다.
               (jar - jar:jar, war - war:war, pom - site:attach-descriptor, ejb - ejb:ejb)
source:jar : 소스를 jar 파일로 패키징 한다.
test : 테스트를 실행한다.
compile : 소스 코드를 컴파일해서 클래스 출력 디렉터리에 클래스를 생성한다 (compiler:compile)
deploy : 생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다. (deploy:deploy)

build...를 이용한 사용자 빌드 추가

사용자가 새로운 임의 빌드를 만들수도 있다 build... 메뉴를 사용하면 되는데 새로운 플러그인인이 추가 될때마다 새로운 goal을 제공하기 때문에 적절하게 만들어서 사용을 하면 된다.


사용법은 위에 창이 뜨면 Name, Goals를 등록해주고 Apply를 적용하여 실행하면 된다.

Name : 사용자가 생성한 build 이름
Goals : 추가할 빌드 명령

예는 아래와 같다.


이름을 빌드1이라고 주고 명령은 다음과 같이 줬다.

compile war:inplace tomcat:stop tomcat:start

이는 예제를 설명하기 위해서 다음과 같은 명령을 준것으로 4가지의 명령을 실행하고 있다.
이렇게 명령을 주기 위해서는 공백을 주고 다른 명령을 주면 된다.
일반적으로 명령어 창에서 주려면 아래와 같이 mvn을 주고 명령을 주지만 이클립스에선 그냥 명령만 주면 된다. 
mvn compile war:war
mvn package


메모..

compile war:war : 컴파일 후 war 파일을 생성한다. target 폴더에  projectName-0.0.1-SNAPSHOT 폴더와 projectName-0.0.1-SNAPSHOT.war가 생긴다. projectName-0.0.1-SNAPSHOT 폴더 안에는 바로 배포할수 있도록 리소스가 들어 있다. 

 compile war:exploded : 컴파일 후 projectName-0.0.1-SNAPSHOT 폴더가 생성이 되었다. 이 폴더안에 모든 배포할수 있게 리소스가 들어 있다.

compile war:inplace : compile war:exploded 와 동일한 기능을 하지만 추가로 src/main/webapp/WEB-INF/clssses, src/main/webapp/WEB-INF/lib 폴더에 컴파일된 class, jar 파일이 포함이 되었다. 








'DEVELOPMENT' 카테고리의 다른 글

Git  (0) 2013.12.30
dxf file format  (0) 2012.08.16
XSLT 빠른 가이드  (0) 2012.01.13
Oracle, MSSQL, MySql 요약 설명서  (0) 2010.05.18
ServerVariables 콜렉션  (0) 2009.03.10

매번 찾기는 귀찮고 소스 뒤지기도 귀찮은 것들을 정리함.

#자바소스 설정

1
2
3
<build>
    <sourceDirectory>src/main/java</sourceDirectory>
</build>
cs


#자바소스 여러 개  설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <id>add-source-dir</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>another/src/main/java</source>
                    <source>others/src</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>
cs




#저장소 추가

1
2
3
4
5
6
7
<repositories>
    <repository>
        <id>저장소 ID</id>
        <url>저장소 URL</url>
    </repository>
</repositories> 
cs


개인적으로만 저장소를 쓴다면 .m2\settings.xml에서
profiles > profile > repositories 밑에 repository 설정을 넣으면 됨.

#컴파일러 소스 및 타겟 버전 설정, UTF-8 인코딩 지정 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build> 
cs

#클래스패스 설정과 -jar 옵션으로 시작할 때 사용할 메인 클래스 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Main-Class>org.krakenapps.main.Kraken</Main-Class>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
cs

#의존하는 라이브러리를 포함하여 하나의 JAR 파일로 패키징
POM에 아래 설정해놓고 콘솔에서 mvn assembly:assembly 명령
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <Main-Class>org.krakenapps.main.Kraken</Main-Class>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
<!--//-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>    
          <!--<warSourceExcludes>common/**</warSourceExcludes> warSourceExcludes는 warSourceDirectory를 기준 특정 폴더 제외-->
       </configuration>
</plugin> 
cs
    

#기본 디렉토리 변경
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- 변경전 --> 
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="questionbox">
        <wb-resource deploy-path="/" source-path="/src/main/webapp" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java" />
        <property name="context-root" value="questionbox" />
        <property name="java-output-path" />
    </wb-module>
</project-modules>
<!-- 변경후 -->
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="questionbox">
        <wb-resource deploy-path="/" source-path="webapp" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src" />
        <property name="context-root" value="questionbox" />
        <property name="java-output-path" />
    </wb-module>
</project-modules>
cs

# 메이븐 /src/main/java에 java 외에 파일도 target/classes로 이동

#레포팅 관련
<reporting>
<plugins>
<!-- FindBugs 리포트 생성 플러그인 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<forceEncoding>UTF-8</forceEncoding>
<findbugsXmlOutput>true</findbugsXmlOutput>
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
<xmlOutput>true</xmlOutput>
<xmlOutputDirectory>${basedir}/target/site</xmlOutputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>javancss-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<forceEncoding>UTF-8</forceEncoding>
<lineThreshold>30</lineThreshold>
<xmlOutputDirectory>${basedir}/target/site</xmlOutputDirectory>
<failOnViolation>true</failOnViolation>
<ccnLimit>10</ccnLimit>
<ncssLimit>100</ncssLimit>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jdepend-maven-plugin</artifactId>
<version>2.0-beta-2</version>
</plugin>
<!-- PMD 리포트 생성 플러그인 -->
<plugin>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<rulesets>
<ruleset>/rulesets/basic.xml</ruleset>
<ruleset>/rulesets/unusedcode.xml</ruleset>
</rulesets>
<sourceEncoding>UTF-8</sourceEncoding>
<targetJdk>1.5</targetJdk>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</reporting>

#maven-jar-plugin 으로 배포시 특정파일 제외하기
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<excludes>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>


#source도 depoly하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.2</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
cs


# 의존관계이 있는 jar파일을 특정 폴더로 복사

메이븐에서는 war이 아닌 jar 패키징일 경우 의존하는 라이브러리는 함께 패키징 되지 않는다.

이럴 경우 maven-dependency-plugin을 사용하여 의존 관계에 있는 jar 파일을 복사해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
 
 
cs


#MANIFEST.MF 파일을 만들때 사용

MANIFEST.MF 파일을 만들고 싶을 때 사용하는 플러그으로 jar 실행 파일을 만들고 싶다면 간단하게 maven-jar-plugin으로

만들수가 있다. 현재 경로에서의 lib 폴더의 jar파일들을 classpath로 추가 시키며, test.Main 클래스는 test 패키지의 Main 클래스 이다.

실행은 java -jar jar명.jar 을 할 수 있다 

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>test.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
cs


#특정 경로를 리소스를 지정된 경로로 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/target/classes/resources</outputDirectory>
                <resources>
                    <resource>
                        <directory>${project.basedir}/resources</directory>
                        <filtering>false</filtering>
                        <includes>
                            <include>map/**</include>
                            <include>properties/**</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>
cs


이번에 프로젝트를 하면서 동일한 성격의 테이블이 여러개라 하나의 쿼리를 두고 테이블 명과 몇가지 다른 컬럼에 대해서는 동적으로 생성해서 가져오게 했다..
하지만 몇번 재대로 실행이 되는가 싶더니 테스트 진행 과정에서 컬럼을 가져오지 못하는 현상이 발생했다. 

일단은 혹시나 모를 문제가 있지 않을까 해서 쿼리를 분리하고 동적으로 생성되어야 되는 부분은 쿼리를 따로 작성해서 select 하도록 하였다.

후에 이 문제에 대해서 살펴봤더니 원인은 ibatis가 매핑 정보를 캐싱하기 때문이라고 한다.

이문제를 해결하려면 다음과 같이 사용할수가 있다.

<select id="select" remapResults="true" parameterClass="dataMap" resultClass="dataMap">
 SELECT  
     bbs_seq
    ,title
    ,contents
    ,register_date
   <isEqual property="table" compareValue="photo_gallery">
       ,image_name
       ,image_path
       ,image_size
  </isEqual>      
FROM $table$
<include refid="globalWhere" />
</select>

다음 코드는 일반적으로 같은 내용을 담고 있지만 photo_gallery 테이블인 경우는 image_name, image_path, image_size 컬럼을 동적으로 생성해서 가져오는 쿼리이다.
일반적으로는 파일 테이블을 따로 두겠지만 예제를 설명하기 위해서 위와 같이 하였다..

위에 테이블에서 remapResults="true" 부분이 없을 경우 위에서 설명한 에러가 발생할수가 있다 하지만 이부분을 넣어 주면서 쿼리를 가져올때 매번 새로 생성한 쿼리를 가져오기 때문에 다음부터는 동적으로 컬럼을 가져오면서 발생한 에러를 해결 할 수가 있다. 


개인 서버를 사용하거나 소기업의 경우 메일 서버때문에 고민한적이 있을것이다. 대체로 메일 서버는 가격도 비싸고 설정방법도 어려워서 어떤걸 설정해야 할지 고민이 많은데 Mercury Mail Server를 사용하면 설치법도 간단하고 무료로 사용할 있고 해서 개인적으로도 사용을 하고 있다. 아직까지 전체적인 사용법은 잘 알지 못하나 설치하고 사용자 추가를 하는 부분에 대해서 설명을 하고자 합니다.

파일을 다운로드 받거나 사용법을 좀더 자세하게 알고 싶으면 해당 사이트를 방문하면 많은(?) 지식을 얻을수가 있습니다.

다운로드 : http://www.pmail.com/downloads_s3_t.htm
참고사이트 : http://wiki.pmail.com/index.php?title=Mercury:Contents
참고사이트 : http://community.pmail.com/

설치한 OS는 Windows 7입니다.

설치 파일을 다운로드 받으면 파일을 실행합니다.



Setup를 눌러서 다음 화면으로 넘어가고



New installation을 살짝 눌러줍니다.
너무 세게 누르지는 마세요.. ㅡ,.ㅡ;;




NetWare를 사용하느냐 묻는 화면입니다. 일반적으로 NetWare를 사용하지 않기 때문에
No, NetWare Support 를 눌러서 다음으로 넘어갑니다.



설치할 폴더를 지정합니다.
저는 그냥 이대로 갑니다. 고고싱...OK, accept this directory



Pegasus Mail를 사용할건지를 물어보는 화면입니다.
사용하지 않고 다음으로 넘어갑니다. Pegasus Mail이 아웃록이 나오기 전까지는 정말 많이 썼다고 하네요..



이번 화면은 메일 저장할 폴더를 선택하라고 하는것입니다.
이번에도 전 그냥 넘어갑니다. 후비고~~

OK, accept this directory



위에처럼 선택해주시고 다음으로 넘어 갑시다..
각 버튼들은 다들 특별한 기능을 제공하겠지만 하지막 딱히 봐도 대단한것은 아니고 일단 모르니 이렇게만 선택합니다.

IMAP4rev 1 server는 선택 하지 않아도 됩니다.
전 그냥 먼가 대단한것이려니 해서 눌러 본것일 뿐입니다. 

OK, continue installation 지그시 눌러줍니다.



IMAP4rev 1 server을 누루지 않으면 이 화면은 나오지 않겠죠...
누르지 말걸 그랬나 봅니다. ㅠㅠ

버튼을 눌러서 계속 진행합니다. 엉엉...




SMTP client module에 관한 화면입니다.
당연히 client를 설치해야겠죠..
Install MercuryE 를 과감하게 눌렀습니다.



기본 설정을 저장합니다.
도메인 명과 관리자로 사용할 메일을 적어주는 화면입니다.
전 도메인을 dev.anaconda.pe.kr로 지정하고 관리자 메일은 master로 지정을 합니다.
실제적으로 master@mail.anaconda.pe.kr가 되겠죠..

OK, continue installation를 눌러서 다음으로 넘어가도록 하죠. 



Normal을 눌러줍니다. 헉헉...



매번 똑같은 화면에 내용만 살짝 바뀌니 저까지 헷갈리네요..
이 부분은 queue를 지정하는 화면입니다.
메일 수신전까지 발송된 메일은 여기에 저장이 됩니다.
전 그냥 그대로 가보도록 합니다.

OK, continue installation를 눌러서 다음으로 넘어가도록 하죠. 



Install Mecrury/32를 눌러줍니다.
이제 곧 도착하나 봅니다.


설치가 순식간에 진행이 되어서 캡쳐를 못했습니다. 방심했습니다.




Create service를 눌러서 서비스명를 생성해줍니다.



Create service 를 클릭하니 위에 같은 화면이 뜹니다.
전 그냥 기본적으로 되어 있는 명으로 하고 OK를 누르게 됩니다. 그러니 창이 닫히네요..
그리고 Continue를 눌렀습니다. 같이 눌러보시죠 후후후후...



이제 다 온듯한데 Done를 누르면 다음으로 넘어가겠군요..



아아.. 이제 다 왔습니다.
다 됐다고 하네요..
Exit를 눌러서 설치를 완료합니다.



설치된 프로그램을 실행시키니 다음과 같은 화면이 주루루룩 뜹니다..
이제 설치가 되고 서비스가 실행이 되었습니다.



Configuration 메뉴를 눌러서 MercuryE SMTP Client를 눌러서 설정 화면으로 이동합니다.



Name server를 등록해 주면 되는데 여기에는 DNS 주소를 등록해주면 됩니다.
사용하고 있는 DNS가 있을경우 그것을 적어 주면 되고 모르실 경우 

204.252.145.2,168.126.63.1,164.124.102.2
를 적어 주면 됩니다. 3개인데 ,로 구분이 됩니다. save를 눌러 창을 닫습니다.

이제 설정이 완료 되었습니다.




메뉴에서 Manage local users...을 눌러서 사용자를 추가하러 갑니다.



Add 버튼을 눌러줍니다.




사용자 계정을 입력하고 OK를 눌러줍니다.
여기선 메일이 test@mail.anaconda.pe.kr가 되겠군요..


이제 설정이 완료 되었습니다.

pop, smtp는 mail.anaconda.pe.kr로 하여서 테스트를 해볼 일만 남았네요.
저만 그렇고 각각 주소가 다 다르겠죠 설치하면서 입력한 도메인을 넣으시면 되겠습니다.

메뉴가 다 영어고 복잡하네요 다음에는 기본적인 설정방법을 찾아서 글을 정리해야 겠습니다.



허드슨을 사용하기 위해서 기본적인 셋팅 방법과 빌드를 셋팅하는 방법을 설명한다.
설치법은 간단하기 때문에 따로 설명하지 않도록 하며 설치가 되지 않았다면 아래 경로를 사용하여 다운 받아서 Tomcat에 설치하면 된다.

다운로드 : https://hudson.dev.java.net/servlets/ProjectDocumentList?folderID=2761

1. 허드슨 기본 설정 
허드슨 기본 설정법이라 함은 Ant, Maven등의 기본 빌드 스크립트를 지정하는 방법과 JDK의 기본 설정을 하는 법을 알아본다. 

일단 처음에 허드슨 메인 화면으로 가면 다음과 같은 이미지를 볼수가 있다.
다음 메뉴에서 Hudson 관리 메뉴를 클릭한다.


해당 메뉴를 클릭하면 다음과 같은 화면을 볼 수가 있다.
아래 메뉴에서 Configure System 메뉴를 클릭한다.



메뉴가 선택이 되면 나타나는 메뉴 화면 중에 아래 부분을 해당 경로에 맞게 적용해준다.

설정이 완료 되었다면 save를 눌러서 저장을 한다.

위에서 설정한 부분이 각각 Maven, JDK, Ant를 설정한 부분이다.
해당 라이브러리가 설치되지 않았다면 각 다운을 받아서 설치하길 바란다.

그리고 초기에는 hudson이 로그인 사용없이 모두 허용으로 되어 있다. 이 부분을 로그인 사용자만 사용할수 있게 하려면 다음 부분을 체크 해주게 되면 다음부터는 로그인을 해야만 설정을 변경을 할 수가 있다.




2. 빌드 셋팅하기 

기본 설정이 완료 되었으니 이제 새작업을 등록해보도록 하자.
hudson 메인 메뉴에서 새 작업 메뉴 버튼을 눌러서 등록 화면으로 이동하자.



메뉴를 선택하게 되면 새로운 작업에 대한 프로젝트 생성 화면이 나올것이다.
화면에서 작업명(job name)을 등록하고 Build a free-style software project를 선택하고 OK를 눌러 다음 화면으로 이동한다.




다음 페이지로 이동이 되었다면 Source Code Management 부분에서 소스 관리  시스템을 선택하도록 한다. Subversion 을선택하도록 하자.
하지만 그 위에 있는 메뉴의 대한 설명은 다음과 같다.

  • 프로젝트 이름(Project name): 난 이미 HeliosJMXTrunk 라고 프로젝트 이름을 지었지만, 여기에서 바꿀 수 있다.
  • 설명(Description): 빌드 업무에 대해 기술할 수 있는 자유 형식 폼 필드
  • 오래된 빌드 버리기(Discard old builds): 허드슨은 이 체크박스를 선택하지 않는다면, 이전 기록을 보관할 것이다.
  • 이 빌드작업은 파라미터화 됨(This build is parameterized): 만일 이 옵션을 선택하면, 허드슨은 빌드 프로세스에 전달 가능한, 이름-값 쌍으로 이루어진 임의의 파라미터 세트 제공을 허락 할 것이다. 설정 파라미터들은 러닝 빌드 환경에서 환경 변수로 지정될 것이다.
  • 프로젝트 기반 보안 활성화(Enable project-based security): 허드슨은 유저들이 허드슨 웹 페이지를 접근할 때 인증작업을 하기 위한 전체 보안 스키마를 지원한다. 또한 이 보안 스키마는 어떤 유저들이 어떤 빌드 업무를 건드리는 것이 가능한지에 대한 제어를 제공할 수 있다. 나는 이 허드슨 인스턴스에서 보안은 설정하지 않았다.
  • 빌드 불가(Disable build): 이 항목이 체크되면, 옵션이 비 활성화 될때까지 이 빌드 업무는 실행되지 않을 것이다.
  • 고급 옵션(Advanced options): 나는 이 옵션 중에 사용하는 것은 없다. 하지만 이 체크 박스를 선택하면, 다음과 같은 옵션들이 인터페이스에 나타나게 된다.
    • 정숙 기간(Quiet Period): 빌드 수행이 예정되었을 때 실제 수행 이전에 발생하는 정숙 기간(=휴지기간)을 설정할 수 있다. (즉, Delay time과 동일의미, 0 이면 build now! 의 의미)
    • 커스텀 워크스페이스를 사용(Use custom workspace): 기본적으로, 허드슨은 ${jboss-home}/.hudson/jobs/[project name] 에 빌드 업무용 워크스페이스를 만든다. 이 옵션은 당신 다른 장소를 지정하는 것을 가능케 해준다.



  • Subversion
    을 선택하면 위와 같은 화면이 나타나게 되는데 이 부분에 각 사용자에 맞는 정보를 입력하도록 한다.

    Repository URL : svn://도메인/trunk/myproject_name
    Local module directory (optional) :
    Use update : 체크

    이렇게 되면 svn://도메인/trunk/myproject_name에서 프로젝트를 내려 받게 된다.

    Use update
    이 부분은 체크를 한 이유는 체크가 되지 않았을때는 매번 저장소에서 모든 소스를 내려 받게 된다 이렇게 되면 소스를 받는 시간도 길어질뿐 아니라 빌도하는데도 시간이 한참 걸리게 되므로 이부분을 체크를 하여 변경된 파일만 update를 받도록 하기 위함이다.

    Repository Browser
    이 부분은 기존 버전과 새롭게 변경된 파일이 있을 경우 비교해가면서  어떤 부분이 변경 되었는지 소스의 히스토리를 볼수가 있다. 이 옵션을 체크를 해 놓으면 빌드 완료후 job의 Change에서 코드 변경된 내용을 확인 할수있다.

    여기까지 저장소 설정은 끝났다. 이제는 빌드에 관한 설정을 해야 되는데 이 부분은 Build TriggersBuild에서 설정을 한다. 옵션에 대한 설명은 아래와 같다.

    1) Build after other projects are built
    이 옵션에는 다른 Job(Project)의 이름을 인자로 넣는다.
    이렇게 하면 지정된 프로젝트의 빌드가 정상적으로 끝나면 자동으로 이 프로젝트가 Invoke된다. 만약에 빌드만 하는 Job과 테스트만 하는 Job이 있고 테스트는 자주 사용하고 빌드후에 반드시 테스트를 해야할 때, 테스트 Job에서 이 옵션으로 선행작업을 빌드로 해놓으면 빌드를 수행할 때 마다 빌드가 성공하면 테스트를 수행하게 된다. 테스트만 수행하면 빌드와 상관없이 테스트만 수행된다.
    이 옵션은 프로젝트 실행의 전후 관계(Chainning)을 하는데 매우 유용하게 사용할 수 있다.

    2) Poll SCM
    이 옵션을 사용하면 여기에 지정한 주기별로 소스 관리 시스템을 폴링(체크)하여 변경이 있을 경우에만 빌드를 수행한다.

    3) Build periodically
    마지막으로 Build periodically는 정해진 시간 주기별로 소스가 변경과 상관없이 무조건 주기적으로 빌드를 수행하며 Poll SCM과 마찬가지로 crontab과 같은 형식으로 스케쥴을 등록한다.

    아래 그림과 같이 Poll SCM 메뉴를 체크를 한다.



    Schedule에 대한 옵션은 unix의 crontab 명령과 같은 형식인다.
    분 시간 날짜 월 요일

    예)

    사용 예는 다음과 같다.
    # 매일 12시에 실행
    00 12 * * *
    # 매주 일요일 1시에 실행
    00 01 * * 7
    # 매일 12시와 5시에 실행
    00 05 * * *
    00 12 * * *
    # 매 5분마다 실행
    */5 * * * *

    이제 Build 메뉴에서 Invoke Ant를 선택한다.



  • Ant 버전(Ant version): 빌드를 수행 시에 사용하려고 미리 정의해 놓은 Ant 인스턴스
  • 타겟들(Targets): 지정한 Ant 스크립트 중에서 수행되어야 하는 타겟들의 목록. 스크립트의 디폴트 테스크가 실행될 경우에는, 빈 칸으로 남겨 놓을 수 있다.
  • 빌드파일(Build file): 유효 워크스페이스를 기준으로 놓고 봤을 때, 수행되어야 하는 Ant 스크립트의 상대적인 위치.
  • 프로퍼티들(Properties): Ant 스크립트로 전달될 추가 시스템 프로퍼티 정의값. 나는 서브버전 인증정보를 스크립트로 전달하기 위해 이들 프로퍼티들을 사용했다. 왜냐하면 내 작업 절차에는 몇 가진 변경사항들을 저장소로 반영하는 단계가 포함되어 있기 때문이다. 추가적으로, 나는 내 단위 테스트들 위한 설정 파라미터들에 해당하는 몇몇 파라미터들을 정의했다.
  • 자바 옵션들: 자바 명령행 옵션들을 여기에서 전달할 수 있다. 여기에서 나는 Ant의 -debug 옵션을 할당했다. 왜냐하면 나는 Ant 스크립트에 있는 디버깅 문제에 대해 작업하고 있었기 때문에, 해당 옵션을 사용해서 Ant가 추가적인 분석정보들을 로그에 생성하게 하였다. 다른 흔한 옵션은 기동되는 JVM의 초기 힙 사이즈(-Xms)와 최대 힙사이즈(-Xmx)를 특정하는 지시문들이다. 이 옵션은 빌드 스크립트를 수행하기 위해 허드슨에 의해 실행되는 모든 새로운 JVM 인스턴스가 따르게 된다.



  • 이제 기본적은 설정은 끝났다 다음 부분은 다음 추가적인 옵션이니 없어도 무방하다.
    아직 안해봤으니 설명을 할수가 없으니 다음에 사용하면서 올리도록 하겠다.



  • 아티팩트 아카이브 하기(Archive the artifacts): 이 옵션을 선택해서 파일이나 디렉터리 마스크(mask = include와 exclude를 지정할 수 있는 Ant 스타일의 마스크)를 지정할때, 마스크와 일치하는 아티팩트들은 빌드가 완료되면, 허드슨 아티팩트 저장소에 추가되고 빌드 업무와 빌드 시퀀스 넘버를 사용해서 키값(key)으로 만들어지게 될 것이다. 옵션에 따라, 허드슨 서버의 디스크 공간을 절약하기 위해서 성공적으로 빌드된 이전의 모든 아티팩트들을 버릴 수 있다.
  • 사용 추적을 위해 파일들의 사용 흔적을 기록 (Record fingerprints of files to track usage): 이 옵션을 선택하면, 비슷한 형태의 Ant 스타일 마스크(mask)를 사용해서, 허드슨으로 하여금 생성된 아티팩트들의 사용흔적(fingerprints)을 유지하도록 지시할 수 있다. 그렇게 해서, 시스템 내의 다른 어느 곳에서 이들 아티팩트들이 사용되는지를 당신이 좀 더 쉽게 추적할 수 있게 해준다.
  • Javadoc 만들어내기(Publish javadoc): 만일 당신의 빌드 스크립트가 javadoc 컨텐트를 생성해낸다면, 이 옵션은 허드슨으로 하여금 해당 컨텐트를 만들어 낸 다음 곧바로 업무 홈 페이지에 게시할 것을 지시할 것이다. 빌드가 성공한 모든 경우에 있어 javadoc 컨텐트는 계속 유지될 것이다. 그러나 기본적으로 마지막에 해당하는 것만 유지된다.
  • JUnit 테스트 결과 보고서 만들어내기(Publish JUnit test result report): 만일 당신의 빌드 스크립트가 JUnit 테스트를 수행한다면, 이 옵션은 허드슨으로 하여금 XML테스트 결과 문서를 처리해서 각각의 성공적인 빌드의 진행 보고서를 생성해 내고, 지속적으로 결과들을 모으도록 지시한다. 모인 결과가 바로 업무 홈 페이지에 있는 보고서에 해당하며, 오랜 시간에 걸쳐 수행된 빌드 업무용 단위 테스트의 기록이 될 수 있는 트랜드(historical trends)로 보여주는 보고서이다.
  • 다운스트림 테스트 결과 모으기(Aggregate downstream test results): 어떤 경우에는, 한 업무의 단위 테스트 스위트의 수행 시간이 실제 빌드 시간 보다 엄청 더 길다. 이런 경우에는, 빌드와 테스트를 각각 다른 업무로 분리하는 것을 선택할 수 있다. 그래서 상대적으로 빌드가 빠르게 종료될 수 있도록 말이다. 하지만, 구현되어 있는 하나 이상의 테스트 업무들은 빌드가 성공적으로 완료되면 그 즉시 수행되게 된다. 만일 당신이 이 옵션을 선택하면, 허드슨은 모든 빌드 후속 업무들의 테스트 결과들을 모으고, 소급 적용하는 식으로 해당 내용들을 주요 빌드 업무에 대한 테스트 결과로 보고할 것이다.
  • 다른 프로젝트 빌드하기(Build other projects): 앞선 항목들과 관련되어서, 이 옵션은 하나의 논리적인 빌드와 테스트 프로세스를 연속적으로 수행되어야 하는 두 개 이상의 물리적인 업무로 구현하기 위해 사용된다. 이 옵션을 선택되면, 필드가 보여지게 될텐데, 이 필드에는 현재 업무 이후에 수행되길 원하는 업무 이름들을 콤마(,)로 분리해서 기입하면 된다. 이 작업은 비록 현재 현재 업무 수행이 빌드가 불안정하다고 판단할 지라도 선택한 내용에 따라 수행된다.
  • 이메일 공지(E-mail notification): 이 옵션을 선택하면, 하나 혹은 그 이상의 공백으로 분리된 이메일 주소를 입력할 수 있고, 해당 이메일로 허드슨의 업무 수행 완료 공지가 보내지게 된다. 빌드 실패, 불안정 빌드 등의 이벤트들은 이메일 발송을 일으키게 된다. 여기에 있는 추가적인 옵션은 허드슨이 판단하기에 빌드를 깨뜨린 코드를 SCM에 체크인 한 작업자에게 "특별한" 이메일을 보내도록 만드는 것이다.


  • 출처 및 참고 사이트 
    http://wiki.hudson-ci.org/display/HUDSON/Home
    http://bcho.tistory.com/entry/Hudson을-이용한-빌드-배포-테스트-자동화
    http://doortts.tistory.com/entry/번역-허드슨을-이용한-지속적인-통합Continuous-integration-with-Hudson-2

     


    다수의 도메인 연결 방법

    이전에 글인 경우는 하나의 도메인과 하나의 톰캣과의 연동법을 설명한 것이다. 하지만 위와 같은 경우가 아닌 하나의 아파치에 여러대의 tomcat을 사용하는 경우가 있을것이고 여러개의 도메인을 연결해서 사용해야 하는 경우도 있다. 아래 부분은 그 부분에 대해서 설명을 한다.
    위에 내용과 연결되지 않으니 아파치 톰캣이 설치 되어 있다면 위에 부분은 건너 뛰고 아래 부분 부터 적응을 하면 된다.

    일단 설치가 되지 않았다면 해당 URL에서 다운을 받으면 된다.

    apahce 2.2 : http://httpd.apache.org/download.cgi
    tomcat 6.x : http://tomcat.apache.org/download-60.cgi
    mod_jk 1.2.28 : http://tomcat.apache.org/download-connectors.cgi

    mod_jk-1.2.28-httpd-2.2.3.so 모듈을 modules 디렉터리로 복사를 했다면 httpd.conf 파일을 열고 다음 부분을 추가해준다. 제일 마지막 라인에 추가해주면 된다.

    일단 해당 apahce 설치 폴더는 D:\SERVER\Apache2.2 에 설치를 했다.

    httpd.conf
    #
    # Use name-based virtual hosting.
    #
    # 해당 아이피
    NameVirtualHost 210.112.167.232 
    # jk_module 추가
    LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so
    # workers.properties 파일 추가
    JkWorkersFile "D:\SERVER\Apache2.2\conf\workers.properties"
    # virtualhost 설정 추가
    include "conf/vhosts/*.conf"

    위와 같이 수정을 해 줬다면 workers.properties 파일을 생성해준 다음 아래 부분을 복사해서 붙여 넣는다.

    workers.properties
    # the list of workers
    # 톰캣 경로
    #workers.tomcat_home=D:\WAS\tomcat-6.0.20 //
    # jdk 경로
    #workers.java_home=C:\Java\jdk1.6.0_16

    ps=\
    worker.list=dev,dev2

    #test.domain.pe.kr
    worker.dev.host=test.domain.pe.kr
    worker.dev.port=8009
    worker.dev.lbfactor=1
    worker.dev.type=ajp13

    #test2.domain.pe.kr
    worker.dev2.host=test2.domain.pe.kr
    worker.dev2.port=8010
    worker.dev2.lbfactor=1
    worker.dev2.type=ajp13

    # loadbalancer 설정
    #worker.loadbalancer.type=lb
    #worker.loadbalancer.balanced_workers=dev, dev2
    #worker.inprocess.type=jni
    #worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
    #worker.inprocess.cmd_line=start
    #worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
    #worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stde

    위에 내용에서 라인 앞줄에 #이 되어 있는 부분은 여기에서는 필요 하지 않으니 신경을 쓸 필요가 없다.이 과정까지 완료 되었다면 이제 도메인에 대한 설정을 해주면 된다. 

    httpd.conf 파일에 include "conf/vhosts/*.conf" 라인을 입력 했었다.
    conf/vhosts 폴더에 .conf 확장자로 된 모든 파일을 읽어 들이라고 정의를 했으니 해당 파일을 생성해 보자

    지금은 vhosts  폴더가 없기 때문에 conf 하위에 vhosts 폴더를 하나 생성해 준다.
    그리고  vhosts  아래에 해당 도메인명.conf  파일을 생성해 준후 아래 내용을 복사해서 붙여 넣는다. 해당 부분은 각자 사용자에 따라서 다르기 때문에 경로나 아이피는 적당하게 수정해준다.

    test.domain.pe.kr.conf
    <VirtualHost 210.112.167.232:80>
        ServerName test.domain.pe.kr   
    DocumentRoot D:\webapps\test.domain.pe.kr
        
        ErrorLog logs/dev-error.log
        CustomLog logs/dev.log common
    <Directory "D:\webapps\test.domain.pe.kr">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.2/mod/core.html#options
        # for more information.
        #
        Options Indexes FollowSymLinks
        #
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
        #
        AllowOverride None
        #
        # Controls who can get stuff from this server.
        #
    #    Order allow,deny
    #    Allow from all
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Allow from all
    </Directory>
    # 아파치로 접근 하는 거중 확장자가 ok 만  톰캣으로 하고
    # 나머지는 아파치 즉  workers.properties 의 이름 worker.list=sample 로 보낸다.
        JkMount /*.jsp  dev
        JkMount /*.do  dev
        JkMount /servlet/*  dev
    </VirtualHost>


     위에 파일을 생성을 했다면 test2.domain.pe.kr에 대한 파일도 위와 같은 방법으로 하나 생성해준다.

    여기까지 작업이 되었다면 아파치에 대한 설정은 끝났다. 이제 톰캣만 설정하면 되는데 톰캣이 설치 되었다면 해당 도메인에 지정된 톰캣 폴더/conf/에서 server.xml 파일을 수정해준다.

    지금 현재의 필자의 경로는
    D:\WAS\tomcat-6.0.20_test\conf,
    D:\WAS\tomcat-6.0.20_test2\conf
    로 되어 있다. 각각 해당 폴더를 열고 server.xml 파일을 열어서 다음 부분을 수정해준다. 

    D:\WAS\tomcat-6.0.20_test\conf\server.xml

    해당 부분은 수정할것이 없다. 기본적으로 톰캣은 8080 포트를 쓰지만 여러개의 톰캣을 사용하려면 이부분이 수정이 되어야 된다.

    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />

    그리고 다음 라인도 찾아 보자. 하지만 이 부분도 여기서는 수정해줄 필요가 없다.
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    </Host>

    이부분도 찾아보자  이 부분은 기본적으로 톰캣 폴더가 ROOT로 되어 있다.
    하지만 아파치의 경로는 현재 D:\webapps\test.domain.pe.kr으로 되어 있다.
    이럴 경우 정적 리소스의 경우는 D:\webapps\test.domain.pe.kr에 저장이 되고
    jsp, class의 경우는 D:\WAS\tomcat-6.0.20_test\webapps\ROOT에 저장을 해줘야 한다. 이렇게 분리하는것도 다른건 아니지만 그게 귀찮다면 아래 부분을 추가해준다.

    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="D:\webapps\test.domain.pe.kr" path="" reloadable="false"/>
    </Host>

    이렇게 되면 같은 폴더를 사용하게 된다.

    이제는 D:\WAS\tomcat-6.0.20_test2\conf\server.xml를 수정하도록 하자
    위에 파일과 다를것이 없으므로 변경 부분만 강조를 하도록 하겠다.

    D:\WAS\tomcat-6.0.20_test2\conf\server.xml
    <Connector port="8081" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />

    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="D:\webapps\test2.domain.pe.kr" path="" reloadable="false"/>
    </Host>

    위와 같이 적용이 되었다면 완료가 되었다..

    적용된 도메인은 2개가 된다.

    아파치
    http://test.domain.pe.kr
    http://test2.domain.pe.kr

    톰캣
    http://test.domain.pe.kr:8080
    http://test2.domain.pe.kr:8081

    참고)
    도메인이 없는 경우 테스트를 할려면 host 파일에 설정을 해줘야 한다.


    Ajax를 사용하다 보면 서버로부터 객체를 가져와 브라우저에 보여 줘야 하는 경우가 있다.
    예전에는 이를 xml 형태로 많이 했지만 최근에는 json 형식으로 가져와서 보여주는 경우가 많은데 이는 json형식이 핸들링 하기도 더 쉽고 여러가지로 작업하기가 편하기 때문이다.
    하지만 이런 xml도 마찬가지겠지만 json 형식도 알맞은 형태로 가공을 해서 보내주려면 여러모로 불편한 사항이 많이 있다 하나의 유틸성 메소드를 많들어서 사용해도 되지만 편하게 사용할수 있도록 많은 라이브러리도 제공을 해준다 그중에 하나가 JSONObject를 이용하는 방법인데 사용법이 간단하다.
        
    import org.json.simple.JSONObject;
    /**
     * @author diem
     *
     */
    public class JSONObjectTest {
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		JSONObject obj = new JSONObject();
    		obj.put("param1", "1");
    		obj.put("param2", "2");
    		obj.put("param3", "3");		
    		System.out.println(obj.toString());
    		
    		JSONObject subObj = new JSONObject();
    		subObj.put("subParam1", "sub1");
    		subObj.put("subParam2", "sub2");
    		subObj.put("subParam3", "sub3");
    		subObj.put("subParam4", "sub4");
    		System.out.println(subObj.toString());
    		
    		obj.put("param4", subObj);
    		System.out.println(obj.toString());		
    	}
    }
    


    MySQL Administrator 을 사용하여 데이터베이스를 생성하는 법을 알아본다.
    만약 프로그램이 설치 되니 않았다면 해당 사이트에서 다운받아서 설치해야 한다.

    http://dev.mysql.com/downloads/

    먼저 프로그램을 실행 시키고 새로운 스키마를 생성을 한다.

    1. 스키마 생성



    스키마가 생성이 되었다면 새로운 스키마에 접근할수 있는 사용자를 추가한다.

    2. 사용자 추가



    2-1 사용자 계정 입력

    Apply changes를 눌러 적용 시켜준다.

    사용자가 추가 되었다면 추가된 사용자에 대한 권한을 준다.

    Available Privileges에 있는 목록을 Assigned Privileges로 추가해준다.

    3. 권한 부여




    Apply changes를 눌러 적용 시켜준다.

    여기까지가 완료 되었다면 Tools > MySQL Query Browser를 실행한다.



    MySQL Query Browser 창이 뜨면 접속 권한을 설정해줘야 한다.
    우측에 있는 스키마 창에서 mysql 탭을 더블 클릭한다.
    선택이 되었다면 상단 창에 해당 선택된 스키마가 표시된다 제대로 선택이 되었는지 확인 후에
    사용자에 대한 스키마 권한을 줘야 한다.

    다음 쿼리를 실행해 준다.
      
    grant all privileges on 디비명.* to 사용자이이디@localhost identified by '암호';
    flush privileges;
    select host, user, password from user order by user, host;
    




    모두 완료 되었다면 클리이언트 프로그램으로 접속이 되는지 확인 해 본다.

    'DEVELOPMENT > Database' 카테고리의 다른 글

    [mysql] 날짜 관련 함수  (0) 2010.03.18
    [mysql] 문자열 함수[펌]  (0) 2010.03.16
    [Mysql] SQLyog GUI Tool  (0) 2009.10.28
    리눅스에서 Mysql 5.1 컴파일하는 방법  (0) 2009.10.24
    [mysql] 상위 5개 랜덤하게 가져오기  (0) 2009.10.06


    이미지 태그의 속성인 ALT 속성의 내용중에 많은 양이 있을 경우 줄바꿈을 해야 되는 경우가 있다 그럴때 &#13; 를 사용하면 된다..

    <IMG SRC="image.gif" alt="보통 이미지 입니다. &#13; 보통 이미지 입니다." />

    'DEVELOPMENT > HTML & CSS' 카테고리의 다른 글

    [canvas] 2D를 이용한 객체 회전  (0) 2016.06.01
    [canvas] 키보드를 이용한 객체 이동  (0) 2016.06.01
    CSS framework  (0) 2014.01.17
    DOCTYPE.  (0) 2009.10.28
    CSS 작성 기초 - 선택자 사용하기  (0) 2009.10.28