잊지 않겠습니다.

4. 개발환경의 구성

Java 2013. 9. 6. 13:52

* 사내 강의용으로 사용한 자료를 Blog에 공유합니다. Spring을 이용한 Web 개발에 대한 전반적인 내용에 대해서 다루고 있습니다.



이번 장에서는 개발 환경을 구성해보도록 하겠습니다.

Edit

java sdk 설치

java sdk를 다운받아 설치합니다. windows에서는 oracle home page 및 google 검색을 통해 손쉽게 설치가 가능합니다. 하지만, linux에서는 조금 다른 문제가 있는데요. linux는 기본적으로 open jdk가 설치되어 있습니다. oracle에서 제공한 것이 아닌, jdk 표준 규약에 따른 open source로 구성된 jdk가 이미 설치가 되어 있습니다. 그런데 이 open jdk가 성능이 oracle 것에 비하여 떨어집니다.. 다음과 같은 절차를 통해서 open jdk를 삭제하고 oracle java를 설치하는 것이 좋습니다.

sudo apt-get purge openjdk-\* icedtea-\* icedtea6-\*
deb http://ppa.launchpad.net/webupd8team/java
apt-get install oracle-jdk7-installer
apt-get install oracle-java7-installer 
sudo ln -s /usr/lib/jni/libswt-* -t ~/.swt/lib/linux/x86/
sudo ln -s /usr/lib/jni/libswt-* -t ~/.swt/lib/linux/x86_64/

그리고, JAVA_HOME을 등록합니다. linux의 경우에는

sudo vi /etc/profile 

을 실행해서, JAVA_HOME을 처리해야지 됩니다.
 JAVA_HOME="/usr/lib/jvm/java-7-sun" 

을 설정해주는 것으로 java 설치가 모두 마쳐집니다. 
개발의 편의성을 위해서 path를 설정해주는것이 좋습니다. 
command 창에서 java -version을 실행시켜 java version을 확인합니다.


maven의 설치

먼저 maven에 대한 간단한 소개부터 하도록 하겠습니다.

Maven이란 Apache Software Foundation에서 개발되고 있는 소프트웨어 프로젝트 관리툴입니다.
Maven은 Project Object Model (POM) 이라는 것에 기초를 두어 프로젝트의 빌드, 테스트, 도큐멘테이션, 성과물의 배치등, 프로젝트의 라이프사이클 전체를 관리합니다. 프로젝트의 빌드툴인 Ant와 달리, Maven은 프로젝트 관리툴로서 프로젝트에 관련한 여러가지 정보를 POM에 집약해, POM의 정보에 기초를 두어 프로젝트 전체를 관리합니다.

Maven의 주 기능은 다음과 같습니다.

  1. 프로젝트 라이브러리 관리
  2. 프로젝트 정보의 전달 (사이트의 작성, 배치나 유니트테스트의 레포트등)
  3. 프로젝트 작성부터 컴파일, 테스트, 패키지, 배치등의 프로젝트 프로젝트 라이프사이클에 포함되는 각 태스크의 지원이 가능합니다..

또, Maven은 소프트웨어 프로젝트의 관리 툴임과 동시에 이해툴로서 있습니다.
Maven의 제1목적은 개발자가 단기간에 프로젝트를 이해할 수 있도록 도움을 주는 것입니다. 그를 위해 Maven 에서는

  1. 빌드프로세스를 간단히 한다
  2. 통일한 빌드시스템을 제공한다.
  3. 양질의 프로젝트 정보를 제공한다.
  4. 개발의 가이드 라인을 지원한다.
  5. 신기술에 대해서는 투과적인 이행을 고려하여 넣는다.

과 같은 일을 하고 있습니다. 이런것들에 의해 Maven을 이용한 프로젝트는 어떠한 것이라도 빌드방법이 동일하다거나 디렉토리 구성이 거의 같아서 전체를 파악하기 쉽다등의 장점이 있습니다.
Maven의 구성은 작은 코어와 대량의 플러그인으로 되어 있습니다. 그리고 플러그인이나 라이브러는 필요에 따라서 자동적으로 다운로드가 행해집니다. 이 구조에 의해서 Maven이나 플러그인이 버전업할 때 신기술에 대해 투과적 이행이 가능합니다.
Maven은 당초 Jakarta Turbine의 프로젝트를 위해 작성되었습니다. 복수의 서브프로젝트로 구성된 Jakarta Turbine의 빌드 프로세스를 단순화 하기위해 작성되어졌던 것이 개별의 프로젝트로 독립한 것입니다.


그럼 maven의 설치를 해보도록 하겠습니다. maven은 http://maven.apache.com 에서 배포가 되고 있으며, 최신 버젼인 3.0.4를 다운받아 원하는 위치에 압축을 풀면 기본 설치는 완료됩니다. 사용을 편하게 하기 위해서, MAVEN_HOME을 다음과 같이 등록을 합니다.





또한 maven을 자주 사용하기 때문에 MAVEN_HOME\bin 을 path에 등록하면 maven 설치는 완료됩니다. 
명령어 창에 다음 명령어를 실행시켜, maven의 설치가 완료됨을 확인하도록 합니다.





maven은 추가 library를 관리하기 위해서 local repository를 이용하게 되는데, local repository는 기본적으로 사용자 directory에 .m 폴더를 만들어서 사용하게 됩니다. 기본 설정이 windows에서는 사용자 폴더 안에 위치하게 되어 관리가 힘들게 됩니다. windows 환경에서는 변경이 필요합니다. 
MAVEN_HOME\conf\settings.xml 파일을 에서 repository 항목을 자신이 편한 위치로 변경하면 됩니다.

이제 기본적인 maven 설정은 모두 완료되었습니다.


eclipse & eclipse plug in의 설치

eclipse 의 설치는 매우 간단하게 처리가 가능합니다. 그냥 다운 받아서 workspace를 지정후, 실행하면 됩니다. 
기본적으로 모든 project는 spring과 maven을 이용해서 구성이 되기 때문에, maven과 spring plug in은 설치하는 것이 도움이 됩니다. 
maven과 spring plug in을 설치하도록 합니다. 
help > Eclipse marketplace 에 들어가서 spring으로 검색을 합니다.






STS를 찾아 설치를 완료합니다.

maven 역시 같이 검색을 해서 다음 plug-in을 설치합니다.



maven plugin은 기본적으로 maven 3.0.4를 포함하고 있습니다. 먼저 설치한 maven의 설정을 따라가기 위해서 maven의 설정을 수정해줄 필요가 있습니다. 
windows > preferences 에 들어가서 maven 항목을 확인합니다. installation 에서 설치된 maven 위치로 설정하면 eclipse의 설정은 모두 마쳐집니다.





mysql 설치

mysql은 open source database로, 정부 표준 프레임워크에서 인정된 DB입니다. 개발용 DB로 사용할 수 있을정도로 가볍고, 빠른 속도를 자랑합니다.
그리고, 이번 강의는 모두 mysql 기준으로 행해지기 때문에, mysql을 설치해주시길 바랍니다.



유용한 eclipse plug in

개인적으로 유용하다고 생각되는 eclipse plug in들입니다. 입맛대로 골라서 사용해주시면 됩니다.

  1. Easy Shell : 필수 입니다. 이게 없으면 maven을 사용하기가 매우 힘듭니다.
  2. Color and theme : 색상 변경을 쉽게 해주는 plug in입니다.
  3. dbBear : db client ui입니다.
  4. amaterasUML
  5. moreUnit

Hello World의 실행

먼저, eclipse 에서 새로운 프로젝트를 하나 생성합니다. 
기존의 eclipse에서 새로운 프로젝트를 만드는 법을 사용하지 않고, maven을 이용한 application으로 작성합니다.





maven-archtype-quickstart를 선택하고, project를 작성합니다. 작성된 project의 파일구조는 다음과 같습니다. (resource folder는 존재하지 않을수 있습니다.)





각 Folder가 의미하는 것은 다음과 같습니다. 이와 같은 Folder 구조에 매우 익숙해질 필요가 있습니다. 이는 maven을 이용한 Project의 기본 Folder 구조입니다.

srcsource code가 위치합니다.
src/main개발 code가 위치합니다.
src/test테스트 code가 위치합니다.
src/main/javajava code가 위치합니다. ClassLoader가 접근하는 root위치입니다.
src/main/resourcejava code이외의 파일들을 관리할 때 사용됩니다.
src/test/javaUnit Test code가 위치합니다.
src/test/resourceUnit Test code에서 사용되는 파일들을 관리할 때 사용됩니다.
targetcompile된 파일들이 위치하고, test의 결과가 문서화되는 폴더입니다.
target/classessrc/main에 있는 파일들이 compile된 class 파일들이 위치합니다. 그리고, resource안에 있는 파일들이 copy됩니다.
target/test-classessrc/test에 있는 파일들이 compile된 class파일들이 위치합니다.
target/generated-sourcesAspectJ에 의해서 새롭게 생성된 main code들이 위치합니다.
target/generated-test-sourcesAspectJ에 의해서 새롭게 생성된 test code들이 위치합니다.
target/surefiretest에 대한 xml문서 등을 만드는데 사용되는 surefire jar가 임시로 위치합니다.
target/surefire-reportstest에 대한 결과를 txt파일과 xml파일로 제공합니다.

이 폴더 구조는 maven의 명령어를 실행시킬 때마다 동적으로 생성 또는 삭제가 되지만 위의 구조는 기본구조이기 때문에 변하지 않습니다. 위 구조를 반드시 숙지하시길 바랍니다.

Easy Shell을 이용해서, Console 창을 하나 실행합니다.

mvn compile 

을 실행 시키면, hello world project가 compile이 되는 것을 볼 수 있습니다.





pom.xml 파일을 한번 열어보도록 하겠습니다. maven은 POM에 기초하여 프로젝트의 빌드, 테스트, 도큐멘테이션, 성과물의 배치등, 프로젝트의 라이프사이클 전체를 관리를 한다고 했습니다. 그럼 maven에서 과연 어떤 정보들을 관리하고 있는지 한번 알아보도록 하겠습니다.

mvn site

를 실행시켜보시길 바랍니다.

무언가 maven에서 열심히 작업을 하고 있습니다. 그리고 Easy Shell을 이용해서 target/site 안의 index.html 파일을 브라우져로 열어보시길 바랍니다. 
index.html의 좌측을 보시면 pom.xml에 담길수 있는 모든 정보들이 보이는 것을 알 수 있습니다.

pom.xml에 담길수 있는 정보들은 다음과 같습니다.

DocumentDescription
About이 Project에 대한 간략한 서술을 적습니다.
Project Team팀 맴버에 대한 정보를 담습니다. email과 같은 연락 수단역시 이곳에 담겨집니다.
Dependency Information만약에 이 project를 다른 maven project에서 연결해서 사용할 때, pom.xml에 설정할 정볼르 담습니다.
Project Plugins이 Project를 compile 할때, 사용된 maven plug in에 대한 정보를 담습니다.
Continuous Integration이 Project가 관리되는 CI의 URL을 적습니다.
Issue Tracking이 Project가 관리되는 Issue Tracker의 주소를 적습니다.
Source Repository이 Project가 관리되는 svn의 정보를 적습니다.
Project License이 Project의 license를 기록합니다.
Plugin Management이 project가 Build될 때, 사용된 maven plug in에 대한 버젼 정보등 상세 정보를 기록 합니다.
Distribution Management이 Project의 배포 서버를 적습니다.
Project SummaryProject의 버젼 정보 및 GroupId, ArticleId 등을 기록합니다.
Mailing ListsProject에 대한 Mailing list를 적습니다.
DependenciesProject가 참조하는 library들에 대한 정보가 기록됩니다.

엄청나게 많은 정보가 pom.xml에 기록됨을 알 수 있습니다. 어찌보면 project의 상세 명세서와 동일하다고 할 수 있습니다. 여기서 가장 유용하게 쓰이는 것은 Dependencies에 대한 정보입니다.

http://mvnrepository.com/ 에 방문해보시길 바랍니다. 이 사이트는 maven을 통해서 배포가 되는 라이브러리들이 위치한 사이트입니다. 우리가 maven에 특정 library를 등록하고 저장을 하면, maven은 자동으로 파일을 다운받아서 우리가 만든 프로젝트에 include 시킵니다.

지금 프로젝트에서는 junit 3.8.1이 사용되고 있지만, 이를 junit 4.11로 변경해보도록 하겠습니다. pom.xml에서 junit 3.8.1 부분을 찾아, version을 4.11로 바꿔주시고, pom.xml 파일을 저장해주세요. 저장을 하기 전에는 junit 3.8.1이 maven dependency에 들어있었지만, 저장 후, 바로 junit 4.11로 바뀌는 것을 알 수 있습니다.



maven을 이용하기 전에 어떤 jar를 다운받아서 project에 포함시키는 여러 작업들이 이제는 아무런 필요가 없습니다. 이건 모두 maven이 대신 해주게 되니까요. 그리고, maven에서 repository path를 설정해줬던 path에 한번 가서 파일을 봐보시길 바랍니다. 그곳에 파일들이 모두 위치하고 있는 것을 알 수 있습니다. 이것이 maven을 이용한 dependency 관리입니다.






자, 이젠 maven을 이용한 project 관리를 한번 봐보시도록 하겠습니다. 지금 보면 project의 java version이 1.5로 되어 있는 것을 알 수 있습니다. 이것을 pom.xml 파일을 변경하는 것으로 1.7로 변경하도록 합시다. pom.xml 파일에 다음 내용을 기록합니다.

그리고 project의 우클릭후, maven > update project를 선택해줍시다. 그럼, project가 JDK 1.5에서 1.7로 변경되어 있는 것을 알 수 있습니다.

간단한 코드를 짜보도록 하겠습니다. 
실제 개발 코드는 모두 src/main에 위치해야지 됩니다. 안에 HelloWorld 객체를 만들고, 두개의 method를 추가해줍니다.

 1public class HelloWorld {
 2    public String sayHello(String name) {
 3        return "Hello " + name;
 4    }
 5    public String sayHi(String name) {
 7        return "Hi " + name;
 8    }
 9}

그리고 테스트 코드를 작성합니다. 테스트 코드에 대해서는 다음 시간에 깊게 들어갈 예정이니 지금은 그냥 만들어주시기만 하면 됩니다. 테스트 코드는 모두 src/test에 위치해야지 됩니다. 그리고, 반드시 객체의 이름은 Test로 끝나야지 됩니다. 규칙을 만들어주기 편하게 하기 위해서 more unit의 기능을 이용하도록 합시다.

1public class HelloWorldTest {
2    @Test3    public void test() {
4        System.out.println("test running");
5    }
6}

그리고 console창에서 다음 명령어를 실행해보세요.

mvn test

maven이 test를 행하는 것을 알 수 있습니다. maven은 기본적으로 compile, test, package, install 이라는 phase를 갖습니다. 이 phase는 서로간에 종속적입니다.
compile > test > package > install 이라는 과정을 반드시 거치게 되지요. package를 할 때는 반드시 compile과 test를 거친 이후에 package phase가 실행이 되는 구조입니다. 따라서, test code를 잘 다듬지 못하면 배포 자체를 못하게 될 때도 있습니다.



Summary

maven을 이용한 test project를 만들어봤습니다. maven의 folder구조는 잘 숙지를 하고 계셔야지 됩니다. maven의 많은 plug in들은 이 folder구조가 유지되는 것을 전제로 움직입니다.


Posted by Y2K
,