ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vert.x 가 좋다! (제 2회: 개발 환경 구축)
    JAVA 2013. 12. 5. 22:30
    반응형

    아래 글은 일본의 acro-engineer.hatenablog.com 사이트에 올라온 글을 번역한 것입니다.

    사내 세미나 준비를 하면서 매우 많은 도움을 받은 사이트입니다. Vert.x 에 대해 이해하기 쉽게 작성되어 있어 관심있는 분들께 도움이 되길 바라는 마음에 번역해서 올립니다. 

    ※ 번역은 구글이 했습니다. 전 단지 문맥상 이상한 것만 수정했을 뿐입니다.

    id:KenichiroMurata 입니다.

    여러분 Vert.x 를 사용하고 있습니까?

    Vert.x 가 좋다! (제 1회: 입문) 에 이어 2회째가 되는 이번엔 개발 환경 구축에 대하여 작성합니다.

    목차는 다음과 같습니다. 

    1. environment
    2. install
    3. setting
    4. gradle project template
    5. auto redeoploy
    6. remote debugging



    1. environment

    Vert.x를 설치하고 개발하기 전에 필요한 환경을 맞춥니다. 내 환경은 OS X Mountain Lion이므로, Windows 를 사용하는 분은 환경에 맞게 바꾸십시오.

    JDK 1.7

    Vert.x는 JDK 1.7.0 이상이 필요합니다. JDK 1.7는 "Java SE Downloads"에서 다운로드하여 설치하십시오.

    내 환경은 아래와 같습니다.

    ken @ ~ $ java-version

    java version "1.7.0_25"

    Java (TM) SE Runtime Environment (build 1.7.0_25-b15)

    Java HotSpot (TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

    Eclipse

    개발에는 Eclipse Kepler (4.3) IDE for Java EE Developers를 사용합니다. Java EE Developers를 사용하는 것은, HTML / CSS / JavaScript (JSON)을 개발 사용하므로, 관련 도구가 처음부터 들어가 있어 편하기 때문입니다.

    "Eclipse Downloads"에서 다운로드하여 설치하십시오.



    2. install

    다음은 Vert.x 설치합니다. 설치 방법은 홈페이지 에 설명되어 있습니다. "다운로드 페이지"에서 사이트에 가서 vert.x-2.0.0-final.tar.gz를 다운로드하십시오. 적당한 디렉토리에 압축을 해제합니다.

    path 설정

    Vert.x 아카이브를 추출한 후 vertx 명령을 사용할 수 있도록 path를 설정합니다. 나의 경우 홈 바로 아래에 압축을 해제했기 때문에, 다음과 같이. bashrc에 path를 설정했습니다.

    ken @ ~ $ cat. bashrc 

    PS1 = "\ u @ \ W \ $"

    PATH = "$ PATH":/ Users/ken/vert.x-2.0.0-final/bin


    ken @ ~ $ source. bashrc 

    path 가 설정되면 vertx 명령을 실행하세요. usage가 표시되면 완료입니다.

    ken @ ~ $ vertx

    Hello World!

    전회에도 소개 했습니다만, Hello World 프로그램을 작성하고 동작 확인을 해 봅시다. 

    아래 내용을 HelloWorldVerticle. java 라는 파일 이름으로 저장하세요.

     import org.vertx.java.core.Handler;

     import org.vertx.java.core.http.HttpServerRequest;

     import org.vertx.java.platform.Verticle;


    public  class HelloWorldVerticle extends Verticle {


      public  void start() {

        container.logger().info( "Verticle start" );

        vertx.createHttpServer().requestHandler( new Handler <HttpServerRequest> () {

           public  void handle (HttpServerRequest req) {

            req.response().headers().set ( "Content-Type" , "text / plain" );

            req.response().end ( "Hello World!" );

          }

        }).listen ( 8080 );

      }

    }

    파일을 만든 후 다음과 같이 명령을 실행하고 브라우저에서 localhost : 8080에 접속하세요.

    ken @ work $ vertx run HelloWorldVerticle.java 

    Verticle start. 

    : class 대신. java 파일을 지정해도 작동하다니 Vert.x 재미있군요.



    3. setting

    개발을 위해 Vert.x의 로그 파일의 설정을 확인합니다. 기본 설정은 OS의 tmp 디렉토리에 vertx.log로 되어 있습니다. 하지만, 나의 환경에서는 권한등의 문제로 인해 출력되지 않습니다. 그래서 vert.x 디렉토리에 log 디렉토리를 만들고 거기에 vertx.log가 출력되도록 설정 변경합니다.

    설정 파일은 "vert.x-2.0.0-final/conf/logging.properties"입니다. 이 파일의 다음 부분을 변경합니다.

    # Put the log in the system temporary directory

    # java.util.logging.FileHandler.pattern=%t/vertx.log

    java.util.logging.FileHandler.pattern=/Users/ken/vert.x-2.0.0-final/log/vertx.log

    이 설정을 한 후에 다시 HelloWorldVerticle을 실행합니다. 위에서 지정한 vertx.log에 로그가 출력될 것입니다.

    ken @ ~ $ cat vert.x-2.0.0-final/log/vertx.log

    [vert.x-eventloop-thread-2] 03:06:37,789 INFO [null-HelloWorldVerticle.java-704507910] Verticle start.

    처음부터 스레드 이름같은 것이 나오는건 고맙네요.



    4. gradle project template

    Vert.x는 Verticle이나 하나 이상의 Verticle을 포함한 Module 형식으로 개발합니다. 간단한 프로토 타입에서 직접 Verticle을 만드는 형식도 좋습니다만, 제대로 된 응용 프로그램이나 재사용 가능한 모듈을 개발하는 경우 Verticle이 하나라고 해도 Module로 개발하는 것이 좋습니다.

    Vert.x는 이 Module을 개발하기 위해, Maven 의 archetype 을 사용한 project template 개발과 Gradle의 project template을 사용한 개발의 두 가지 방법을 이용할 수 있습니다. 여기에선 Gradle의 project template을 사용한 개발 방법에 대해 설명합니다. Developing Vert.x Modules with Gradle 을 추천합니다.

    덧붙여서, G​​radle는 Groovy로 빌드 도구이지만, 이 project template에 내포되어 있기 때문에 별도 설치가 필요 없습니다. 이것도 편리하네요.

    git clone하여 Eclipse 로 가져 오기

    먼저 vertx-gradle-template 에서 git clone 합니다. 이 gradle project template는 Java, Groovy, JavaScript, Ruby, Python 의 모든 샘플 소스와 테스트 코드가 포함되어있어 공부하기 좋습니다. 하지만 그만큼 test 실행에 시간이 걸립니다. 그래서 일단 Java 에서 필요한 만큼만 사용하고자하는 사람(접니다) 전용으로 Java 용 gradle project template인 vert.x-module-template-for-java 를 만들었습니다. 이쪽이 마음에 드는 분은 꼭 이용해주세요.

    ken @ work $ git clone https://github.com/vert-x/vertx-gradle-template.git my-vertx-module

    ken @ work $ cd my-vertx-module/

    ken @ my-vertx-module $ git remote rm origin

    git clone 했으면 바로 테스트를 해봅니다.

    ken @ my-vertx-module $ ./gradlew test

    그런 다음 Eclipse 에서 프로젝트로 가져올 수 있도록 eclipse 작업을 수행합니다.

    ken @ my-vertx-module $ ./gradlew eclipse

    이제 Eclipse 프로젝트로 설치가 완료되므로 Eclipse 에서 가져올 수 있습니다.

    mod.json

    Module을 개발 할 때 mod.json라는 설정 파일을 작성해야 합니다. gradle project template는 "src/main/resources/mod.json"에 있습니다. 이 mod.json는 다음과 같이 main으로 Module의 엔트리 포인트가되는 Verticle을 정의해야합니다.

     "main" : "com.mycompany.myproject.PingVerticle" ,

    또한이 mod.json에는 main 이외에도 Module을 저장소에 공개 할 때 필요한 description, licenses, author 등을 정의합니다. 자세한 내용은 파일을 확인하십시오 (개발 만의 경우에는 main 것만으로 OK입니다.)

    HelloWolrdVerticle을 Module로 이동

    방금 만든 HelloWorldVerticle.java 를 Module로 옮겨 봅시다. HelloWorldVerticle.java 를 "src/main/java" 로 옮긴후 mod.json을 다음과 같이 변경합니다.

      // "main": "com.mycompany.myproject.PingVerticle", 

      "main" : "HelloWorldVerticle" ,

    여기까지되면 runModEclipse 작업을 이용하여 동작시켜 봅시다.

    ken @ my-vertx-module $ ./gradlew runModEclipse

    브라우저에서 localhost : 8080에 접속하여 동작을 확인할 수 있습니다.

    그러나이 방법은 두 가지 문제가 있습니다.

    1. 로그 출력이되지 않는다.
    2. gradle 의한 기동에 시간이 걸릴

    첫 번째 로그기 출력되지 않는 문제는 gradle이 vertx 로그 설정을 덮어 버리기 때문에 vertx 로깅을 사용할 수 없습니다. 또한 두 번째 시작하는 데 시간이 걸린다는 것은 해보면 압니다만, gradle의 종속 작업이 모두 움직이는 것입니다. 내 환경에서 약 10 초 걸립니다. 따라서 반복하기에는 좀 어려운 상황입니다.

    그래서 TIP을 말하자면, 다음과 같이 할 것을 추천합니다.

    vertx runmod에서 Module을 실행한다.

    ./gradlew runModEclipse 대신 vertx runmod 명령을 사용하여 Module을 실행하면 로그도 출력되고 실행에 시간이 걸리지도 않습니다. 다음과 같이 모듈 이름과 class path를 지정하여 실행합니다.

    ken @ my-vertx-module $ vertx runmod com.mycompany~my-module~0.0.1-cp bin

    cp 옵션에서 지정한 bin 디렉토리는 Eclipse 프로젝트의 output 디렉토리입니다.

    그러나 vertx runmod에서 Module을 실행하려면 현재 디렉토리 바로 아래의 mods 디렉토리에 Module을 설치 (배치) 해 둘 필요가 있습니다. 즉, 이 실행 방법을 취할 경우 매번 만든 Module을 mods 아래에 배치해야 합니다. 실제로는 mods 다음에 모듈 이름의 디렉토리와 그 아래에 mod.json 만 존재하면, 다음은-cp에서 지정한 bin 디렉토리에있는 class 파일을 이용하여 동작시킬 수 있습니다.

    mod.json 한 번 정의하면 거의 변경하지 않기 때문에 먼저 이 작업을 수행 할 경우, 다음은 vertx runmod 로 사용할 수 있습니다.

    그렇다고해서 수동으로 이를 처리하는 것은 시간낭비이기 때문에 나는 gradle 작업에 다음과 같은 copyModJson하는 작업을 만들고 실행하도록 합니다.

    task copyModJson (type : Copy, dependsOn : 'copyMod' , description : 'Copy the mod.json into the local mods directory for runmod auto-redeploy' ) {

      file ( "mods/$moduleName" ).mkdirs ()

      from "build/mods/$moduleName/mod.json" 

      into "mods/$moduleName"

    }

    이 작업을 "gradle/vertx.gradle"에 추가합니다. vert.x-module-template-for-java 에 이 작업을 추가 한 vertx.gradle가 포함되어 있기 때문에 이쪽을 사용하거나 소스를 수정하십시오.

    위의 작업을 사용할 수있게 했으면, 다음과 같이 실행합니다.

    ken @ my-vertx-module $ ./gradlew copyModJson

    실행 후 방금 소개 한대로, vertx runmod 명령 Module을 실행하십시오.

    ken @ my-vertx-module $ vertx runmod com.mycompany~my-module~0.0.1-cp bin

    덧붙여서, 모듈 이름은 domain~modulename~version 형식으로 정해져 있습니다. 이러한 정의는 "gradle.properties"에 다음과 같이 정의되어 있기 때문이며, 필요에 따라 변경하십시오.

    # Eg your domain name

    modowner = com.mycompany


    # Your module name

    modname = my-module


    # Your module version

    version = 0.0.1



    5. auto redeoploy

    Vert.x의 Module은 auto-redeploy하는 기능이 있습니다. 이것은 소스와 class 파일이 변경되면 vertx를 다시 시작하지 않고 auto-redeploy 해주는 기능입니다. 이것도 매우 편리합니다. 기본적으로 설정이 OFF로되어 있기 때문에, mod.json에 다음과 같이 정의하여 사용합시다.

      // "main": "com.mycompany.myproject.PingVerticle", 

      "main" : "HelloWorldVerticle" ,

       "auto-redeploy" : true ,

    이제 준비가 되셨나요? 실제로 실험해 봅시다. 우선 앞서와 마찬가지로 vertx runmod 명령으로 Module을 실행합니다.

    ken @ my-vertx-module $ vertx runmod com.mycompany~my-module~0.0.1-cp bin

    Verticle start. 

    브라우저로 접속하면 "Hello World!"가 출력됩니다. 다음은 Eclipse 에서 HelloWorldVerticle. java 를 다음과 같이 변경하고 저장합니다.

        vertx.createHttpServer().requestHandler ( new Handler <HttpServerRequest> () {

           public  void Handle (HttpServerRequest req) {

            req.response().headers().set ( "Content-Type" , "text / plain" );

             // req.response().end ( "Hello World!"); 

            req.response().end ( "Hello World!" );

          }

        }).listen ( 8080 );

    저장하면 Eclipse 가 자동으로 컴파일하므로 bin 디렉토리의 class 파일이 업데이트됩니다. 

    그렇다면 vertx 로그에 다음과 같이 출력되고 변경을 감지 한 vertx가 auto-deploy 한 것을 알 수 있습니다.

    ken @ my-vertx-module $ vertx runmod com.mycompany~my-module~0.0.1-cp bin

    Verticle start. 

    Module com.mycompany~my-module~0.0.1 has changed, reloading it. 

    Verticle start. 

    브라우저로 다시 접속하면 "Hello World!"가 돌아옵니다. 으 ~ 음, 편리하네요.



    6. remote debugging

    Module을 실제로 디버깅 하려면 일반 java 프로그램처럼 remote debugging 이 필요할 수 있습니다. 설정 방법은 간단합니다. "vert.x-2.0.0-final/bin/vertx"의 시작 부분에 JVM_OPTS을 정의하는 부분을, 다음과 같이 정의합니다.

    # JVM_OPTS = "-XX : + CMSClassUnloadingEnabled-XX:-UseGCOverheadLimit"

    # JVM_OPTS = ""

    JVM_OPTS = "-Xdebug-Xrunjdwp:transport = dt_socket, address = 8000, server = y, suspend = n"

    이제 vertx runmod 명령을 실행한 후 Eclipse 에서 remote debugging 메뉴에서 8000 포트에 연결하면, 나머지는 중단점 을 설정 하든지, 무엇 나름대로 좋아 아무쪼록! 라는 느낌입니다.

    길어졌습니다 만, Vert.x에 따르면 Module 개발을 위한 개발 환경 구축에 대해 설명했습니다. 꼭 한 번 시험해주세요. 

    나도 아직 시행 착오하고있는 상태이므로, 이런 식 찾고 있어요! 라는 정보가 있으시면 보내 주시면 고맙겠습니다.

    반응형

    TAG

    댓글

Designed by Tistory.