달력

92021  이전 다음

  •  
  •  
  •  
  • 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
  • 29
  • 30
  •  
  •  

허드슨, 지속적인 통합 도구

프로젝트를 진행할 때 업무 단위별로 팀을 나눠서 개발을 하고 난 뒤 오픈 한 달 전부터 코드를 통합하는 작업을 따로 했던 시기가 있었습니다. 이때 팀 간의 인터페이스가 맞지 않아서 이를 수정해서 맞추는 작업에 굉장히 많은 노력과 시간이 들었습니다.
전체 프로젝트 팀의 소스를 매일 매일 합쳐서 큰 문제가 생기기 전에 매일매일 소스를 빌드하는 방법이 가능해졌습니다. CVS, SVN과 같은 버전관리 시스템을 적용하고, 이 장에서 설명할 허드슨과 같은 지속적인 통합(Continuous Integration) 도구를 사용하면 손쉽게 프로젝트를 관리할 수 있습니다.

허드슨은 http://hudson-ci.org 사이트에서 정보를 얻을 수 있습니다. 오픈소스로 태어났지만 썬을 인수한 오라클과의 운영 이슈로 허드슨의 원 개발자가 자바닷넷(http://java.net)을 떠나 깃허브(https://github.com/jenkins)로 자리를 옮겨서 동일한 제품을 만들었습니다. 젠킨스(Jenkins)이며 http://jenkins-ci.org 사이트를 통해서 공개되고 있습니다. 두 제품의 사용법은 동일합니다.

표준프레임워크 개발환경 서버를 설치하면 톰캣이 설치됩니다. 톰캣의 webapps/ 폴더에 hudson.war 파일이 위치합니다. 톰캣이 실행되면 자동으로 압축이 풀리면서 hudson 사이트가 준비됩니다.

<그림> hudson.war 파일 위치


윈도우7에서는 서비스에 등록된 톰캣을 일반 cmd창에서 실행할 수 없습니다. 권한이 없기 때문이죠. cmd창을 관리자 모드로 실행하고, net start tomcat6 명령으로 실행할 수 있습니다. 만약 실행중이라면 "요청한 서비스가 이미 시작되었습니다."라는 메시지를 보게 될 것입니다.

<그림> 관리자 모드 톰캣 서비스 시작



브라우저를 통해서 http://localhost:7070 페이지로 접속하면 자동을 /hudson 컨텍스트로 이동합니다. 허드슨이 준비가 완료된 화면입니다. 왼쪽 메뉴에서 새 작업을 클릭합니다.

<그림> 허드슨 페이지 접속


새 작업 화면에서는 프로젝트명과 스타일을 정합니다. ok.egov 라고 프로젝트명을 입력합니다. 작업 스타일은 메이븐을 사용하기 때문에, 두 번째 항목인 Build a maven2/3 project 를 선택합니다. ok 버튼을 클릭하면 메이븐 기반의 프로젝트를 다루는 작업이 만들어집니다.

Posted by 케누 kenu허광남

댓글을 달아 주세요



[INFO] [war:war {execution: default-war}]
[INFO] Packaging webapp
[HUDSON] Archiving C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\pom.xml to C:\eGovFrameSvr\hudson\jobs\ok.egov\modules\ok$egov\builds\2013-07-02_07-12-51\archive\ok\egov\1.0.0\pom.xml
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
---- Debugging information ----
message             : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
class               : org.apache.maven.plugin.war.util.WebappStructure
required-type       : org.apache.maven.plugin.war.util.WebappStructure
path                : /webapp-structure
line number         : 1
-------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Trace
com.thoughtworks.xstream.converters.ConversionException: Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
---- Debugging information ----
message             : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
class               : org.apache.maven.plugin.war.util.WebappStructure
required-type       : org.apache.maven.plugin.war.util.WebappStructure
path                : /webapp-structure
line number         : 1
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:63)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:117)
	...
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.newInstance(PureJavaReflectionProvider.java:59)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:257)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:124)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
	... 43 more
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Jul 02 07:12:57 KST 2013
[INFO] Final Memory: 20M/49M
[INFO] ------------------------------------------------------------------------
channel stopped
Finished: FAILURE


이 에러 메시지는 maven war plugin 이 Java7을 지원하지 못하기 때문이라고 합니다. jdk1.6으로 내리거나 아래 플러그인을 pom.xml에 추가해야 합니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
</plugin>

from: http://stackoverflow.com/questions/7539970/cannot-construct-org-apache-maven-plugin-war-util-webappstructure-as-it-does-not




Posted by 케누 kenu허광남

댓글을 달아 주세요

전자정부 표준프레임워크를 프로젝트에서 사용했는지 안 했는지 검증하는 방법입니다.


Q표준프레임워크를 적용가이드보면 '표준프레임워크 적용여부를 확인하는 간단한 방법 

'이 있습니다. 

1. 저희가 개발한 프로젝트에서 3가지 항목만 준수하여 적용되면 '표준프레임워크가 적용'되었다고 보면 되는건가요 ? 

2. 표준프레임워크 적용여부를 검증해주는 기관 또는 부서가 있는지요 ? 

3. 개발사 측에서 표준준수확인할 수 있는 가이드가 있는지 궁금합니다. 


A

보신 가이드는 개발자가 아닌 발주자가 참조하는 가이드 부분에 포함되어 있는 내용입니다. 
즉, 표준프레임워크에 대해 잘 모르시는 분이 대략적으로 표준프레임워크가 적용되어 있는지 확인하기 위한 용도입니다. 

보다 자세하게 기준을 말씀드리면 다음과 같습니다. 
- Annotation 기반의 Spring MVC 적용 
- Layered architecture 준수 (@Controller, @Service, @Repository) 
- Data Access Layer의 경우 iBatis 적용 등 입니다. 

보다 자세한 내용은 다음 링크의 문서를 확인하시면 됩니다. 
http://www.egovframe.org/wiki/lib/exe/fetch.php?media=egovframework:rte2:호환성가이드라인.ppt 

또한 표준 프레임워크 센터에서는 표준프레임워크 적용점검 서비스를 제공하고 있습니다. 

감사합니다. 


from: http://open.egovframe.kr/projects/qna/qna/6393



호환성가이드라인.ppt


Posted by 케누 kenu허광남

댓글을 달아 주세요

eGovFrameSvr 서버 2.0.0에는 jdk1.5가 포함되어 있고, hudson의 세팅은 여기에 맞춰져 있습니다. 그래서 jdk1.6이상으로 맞춰진 프로젝트는 컴파일 되지 않는 이슈가 있습니다.


[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 10 source files to C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\target\classes
[HUDSON] Archiving C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\pom.xml to C:\eGovFrameSvr\hudson\jobs\ok.egov\modules\ok$egov\builds\2013-07-01_15-22-31\archive\ok\egov\1.0.0\pom.xml
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
Failure executing javac, but could not parse the error:
javac: invalid target release: 1.6
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files
  -cp <path>                 Specify where to find user class files
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -d <directory>             Specify where to place generated class files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -version                   Version information
  -help                      Print a synopsis of standard options
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system



[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 31 seconds
[INFO] Finished at: Mon Jul 01 15:24:06 KST 2013
[INFO] Final Memory: 17M/31M
[INFO] ------------------------------------------------------------------------
Waiting for Hudson to finish collecting data
channel stopped
Finished: FAILURE


이를 해결하려면 허드슨 관리에서 JDK의 버전을 1.6 이상으로 맞춰 줘야 합니다. 메인 페이지에서 Hudson 관리 > Configure System > JDK 섹션으로 이동합니다.




수정 후에는 이상없이 빌드될 것입니다.



Posted by 케누 kenu허광남

댓글을 달아 주세요

가상머신에서 ~/.m2/repository 를 찾지 못하는 경우입니다. 




C:\Users\kenu>mvn clean

[ERROR] Could not create local repository at \\vmware-host\Shared Folders\.m2\repository -> [Help 1]

[ERROR]

[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.

[ERROR] Re-run Maven using the -X switch to enable full debug logging.

[ERROR]

[ERROR] For more information about the errors and possible solutions, please read the following articles:

[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LocalRepositoryNotAccessibleException


Git Bash를 통해서 mvn 의 경로를 찾았습니다. 제 경우 mvn이 세 가지 이상 설치되었기 때문이죠. Path 환경변수를 확인해도 될 것입니다.

which mvn


해당 maven의 conf폴더에 있는 settings.xml 파일을 다음과 같이 수정했습니다.


<!-- localRepository

   | The path to the local repository maven will use to store artifacts.

   |

   | Default: ~/.m2/repository

  -->

  <localRepository>~/.m2/repository</localRepository>


이후 잘 동작합니다.

Posted by 케누 kenu허광남

댓글을 달아 주세요

http://youtu.be/Bs68Vpjtebo

스프링 코드 네비게이션 동영상 강의입니다.




관련된 페이지는 아래 슬라이드 20, 21, 22 페이지입니다.



Posted by 케누 kenu허광남

댓글을 달아 주세요

JAVA_HOME 환경변수는 자바 개발의 시작입니다. 윈도우7에서 환경변수를 설정하는 방법을 알아봅니다.


탐색기에서 컴퓨터를 선택하고 컨텍스트 메뉴의 속성을 엽니다. 좌측에서 고급 시스템 설정을 클릭합니다.



고급 탭에서 하단의 환경 변수(N)... 버튼을 클릭합니다.



하단의 시스템 변수(S) 항목에서 JAVA_HOME을 선택하고 편집 버튼을 클릭합니다. 만약 처음이라면 새로 만들기(W)... 버튼을 클릭합니다.


변수 이름에 JAVA_HOME 을 입력하고, 변수 값에 설치된 경로를 붙여넣습니다. 

그리고 확인 버튼으로 열린 창들을 닫습니다.


cmd 창을 닫았다가 다시 엽니다. echo %JAVA_HOME% 라고 입력하면 설정된 환경변수 값을 확인할 수 있습니다.


한 가지 환경변수가 더 설정이 되어야 합니다. 바로 %Path% 입니다.

%JAVA_HOME%\bin; 

위 경로를 시스템 환경 변수 Path에 추가합니다. 

참고: http://okjsp.tistory.com/1165643255


Posted by 케누 kenu허광남

댓글을 달아 주세요

jdk1.7이 현재 배포되는 버전입니다. 이전 버전인 jdk1.6을 다운로드 받으려면 http://java.sun.com 에서 Java SE로 이동합니다. 


Previous Releases 를 선택합니다.



Java SE 6를 선택합니다. 이전의 자바도 다운로드 받을 수 있게 링크가 제공됩니다. 하지만, 오라클의 정책에 따라서 이전 버전들은 로그인 해야 다운로드 받을 수 있습니다.




Java SE Development Kit 6u45 링크를 선택합니다. 1.6의 45번째 업데이트 버전입니다.



동의 항목을 체크하고 하단에서 OS에 맞는 jdk를 다운로드 하면 됩니다.



로그인을 해야 다운로드 받을 수 있습니다.



다운로드를 다 받으면 폴더를 열어서 파일을 실행합니다.



설치를 마치면 C:\Program Files\Java\jdk1.6.0_45 폴더에 설치됩니다. 이 경로는 JAVA_HOME 환경변수 값이 됩니다.



환경변수 JAVA_HOME을 아래 링크를 참고해서 적용하세요.

http://okjsp.tistory.com/tag/java_home


Posted by 케누 kenu허광남

댓글을 달아 주세요

메일로 온 질문에 답변을 공유합니다.


====

Q:

좋은 강의 감사드립니다.

강의 내용을 정리하면서 몇가지 질문이 생겼습니다.


1. Junit 을 사용할 테스트는 무조건 return 구문과 출력 구문을 만들어야 하나요?

return 값이 void 인 경우는 어떻게 하나요?


2. 예전 책을 보면 tomcat을 컨테이너라고 하고

웹서버와 구분을 합니다. 웹서버 아파치와 구분을 하는데

정확히 웹서버와 was, 컨테이너의 차이를 모르겠습니다.


동적인 페이지를 처리하기위해 was가 필요하다고 하니

was가 웹서버의 역할까지 포함하고 있는 것이라고 생각했는데

was와 웹서버를 같이 사용하는 경우도 있고...개념이 헷갈립니다.


3. Spring에서 service와 controller의 차이가 어떤 것인지 알고 싶습니다.

실제로 서비스에서 하는 행위를 컨트롤러 단에서 해도 상관이 없다고 생각됩니다.


4. Spring과 스트럭쳐를 같이 사용할 이유가 있는지 알고 싶습니다.

처음 공부할 때 두가지를 같이 병행하는데 역시 spring만으로 구현이 가능한 것 같습니다.


마지막으로 가능하다면 강의에 사용하셨던 구글 문서 주소를 다시 알려주셨으면 합니다.

이번에 윈도우 8.1을 써본다고 하다가 그만 즐겨찾기를 지워버리는 실수를 해서....

단순히 업데이트로 생각했다가 많은 자료가 사라져 버렸습니다.

구글 크롬에 북마크는 정리가 끝난 사이트만 관리하다보니 이런 불상사가 생겼네요.


더운 날이 계속되는 여름입니다.

건강관리에 유의하시기 바랍니다.

다시 한번 좋은 강좌와 okjsp에 많은 도움에 감사드립니다.


A:

안녕하세요.

답변 드리겠습니다.


1. void 인 함수의 역할이 무엇인지, 상태값을 변화시킨다면 그리고 그것을 검증해야 한다면, 

테스트를 위해, 상태값을 읽어오는 함수를 통해서 테스트할 수 있을 것입니다.


2. 웹서버는 html, css, js, image들을 서비스하는 아파치 웹서버 (http://httpd.apache.org), 

IIS 등이 있습니다.  WAS는 Web Application Server의 약자이고, JSP/Servlet을 실행할 수 있는

서블릿 컨테이너와 EJB가 실행되는 EJB 컨테이너로 구성되어 있습니다.

초기에는 WAS의 정적인 파일 처리 능력이 낮기 때문에 웹서버와 연결해서 사용했는데, 

(mod_jk, ajp 같은 커넥터류) 요즘은 WAS 자체에서 http 서버의 역할을 감당할 만한 성능이 나와서

단독으로 웹서버의 역할까지 커버하는 경우가 많습니다.


3. 강의 때도 말씀드렸는데, request, response 같은 객체와 분리된 비즈로직이 Service에서 실행됩니다.

저 두 파라미터가 Service에 없다는 것은 Service를 WAS와 분리해서 단독으로 실행할 수 있게 됩니다.

Controller의 역할은 Model과 View를 연결해 준다는 본연의 역할이 있지요.

http://csl.ensm-douai.fr/noury/20 MVC song인데, 동영상과 가사를 함께 생각해보시면 도움이 되실 것입니다.


4. 스트럿츠를 스프링과 연계시키는 이유는 제 생각으로는 당시 스트럿츠로 만들어진 시스템이 많았고,

스트럿츠 개발자들이 많았기 때문이 아닌가 생각됩니다.

지금은 말씀하신대로 스프링MVC로 모두 커버 가능합니다.


감사합니다.


구글문서 주소는 http://bit.ly/eclipse201306 입니다.


Posted by 케누 kenu허광남

댓글을 달아 주세요

메이븐의 scope는 compile, runtime, test, provided, system 이 있습니다. 이 중에서 custom jar를 관리하기 위해서 system scope를 지정해서 사용했었는데, war파일 패키징에서 누락되게 됩니다. WEB-INF/lib 폴더에 복사되지 않는다는 뜻입니다. 이 때문에 다음과 같이 코드를 작성했다면, in-project 저장소를 구성해서 변경하는 것이 좋습니다.


<!-- custom -->

<dependency>

    <groupId>Acme.JPG</groupId>

    <artifactId>AcmeGif</artifactId>

    <version>1.0.0</version>

    <scope>system</scope> 

    <systemPath>${basedir}/libs/AcmeGif-1.0.0.jar</systemPath> 

</dependency>


<dependency>

    <groupId>com.cubrid</groupId>

    <artifactId>cubrid-jdbc</artifactId>

    <version>8.3.1.0152</version>

    <scope>system</scope> 

    <systemPath>${basedir}/libs/cubrid-jdbc-8.3.1.0152.jar</systemPath> 

</dependency>


위 세팅을 다음과 같이 변경합니다.

<repositories>

    <repository>

        <id>in-project</id>

        <name>In Project Repo</name>

        <url>file://${project.basedir}/libs</url>

    </repository>

</repositories>


<!-- custom -->

<dependency>

    <groupId>Acme.JPG</groupId>

    <artifactId>AcmeGif</artifactId>

    <version>1.0.0</version>

</dependency>


<dependency>

    <groupId>com.cubrid</groupId>

    <artifactId>cubrid-jdbc</artifactId>

    <version>8.3.1.0152</version>

</dependency>



libs 폴더 구성도 다음과 같이 바뀝니다.


in project jars


참고: http://stackoverflow.com/questions/5597099/maven-add-jars-through-systempath-system-but-not-added-to-war-or-anywhere-else

Posted by 케누 kenu허광남

댓글을 달아 주세요