블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 

'getting started'에 해당되는 글 3

  1. 2015.04.02 grpc 설치하기
  2. 2014.02.11 간단한 HazelCast 테스트
  3. 2013.03.19 Eclipse에서 Spring Maven 개발환경 설정하기
 

grpc 설치하기

프로그래밍 | 2015.04.02 02:11 | Posted by 조대협

Google RPC 설치하기

(조대협 http://bcho.tistory.com)


지난 GRPC 소개에 이어서 오늘은 JAVA에서 GRPC를 사용하기 위한 설치 방법을 설명한다.


  • https://github.com/grpc/grpc-common/tree/master/java
  • https://github.com/grpc/grpc-common
  • https://github.com/grpc/grpc-common/blob/master/java/javatutorial.md
  • https://github.com/grpc/grpc-java


글들을 참고하였으며, 컴파일 환경 설정등을 위해서 생각보다 시간이 많이 소요된다. (삽질,Visual Studio 설치 포함 한 2~3시간 걸린듯)


grpc hello world / java





grpc-java 설치하기

https://github.com/grpc/grpc-java#how-to-build 를 참고


준비 : java 8, maven 3.2.x,gradle 2.3 필요


1. 코드 받기

 C:\dev\libs> git clone https://github.com/grpc/grpc-java


2. 관련 라이브러리 설치


1) Netty 4.1 설치

grpc-java는 Netty 4.1에 기반함. 아래절차에 따라서 설치한다.

cd C:\dev\libs\grpc-java>

$ git submodule update --init

$ cd lib/netty

$ mvn install -pl codec-http2 -am -DskipTests=true


2) Protocolbuf 3.0.0-alhpa-2 설치 (windows)

안타깝게도 알파버전이라 윈도우즈용 인스톨 바이너리가 없다. 소스 받아서 직접 컴파일해야 한다.

윈도우 환경에서는 C/C++ 컴파일러가 필요하니까는 간단하게 Visual Studio 무료 버전을 깔자 https://www.visualstudio.com/en-us/products/free-developer-offers-vs.aspx

(무료 버전 제공)

다음은 c:\dev\lib\protobuf에 설치 하는 순서이다.


C:\dev\libs>git clone https://github.com/google/protobuf.git


다음으로, C:\dev\libs\protobuf\vsprojects 에 들어가면 visual studio 프로젝트 파일이 있음

VC로 Release 빌드하면 됨. (이때 반드시, Release 모드로 빌드할것, Debug 모드로 빌드하면 나중에 grpc-java 빌드할때 링크에러남). Test 코드 빌드하다가 에러가 나는데 무시하자. 테스트 코드가 안들어가 있다.


빌드 후, C:\dev\libs\protobuf\vsprojects 아래에 readme.txt를 보고 따라할것


C:\dev\libs\protobuf\vsprojects\Release 에 빌드 결과가 생김

안에 protoc.exe가 생김



3. grpc-java 설치


위에서 만든 protoc.exe를 path가 있는 디렉토리에 복사하거나.

본인의 경우에는 위의 디렉토리 자체를 다 PATH에 걸어버렸다. (연관 라이브러리들이 있어서리)

다음으로 grpc-java를 설치하자


앞에서 받은 grpc-java 디렉토리로 가서

$ gradlew install -Pprotobuf.include=C:\dev\libs\protobuf\src  -Pprotobuf.libs=C:\dev\libs\protobuf\vsprojects\Release


여기까지 했으면 grpc 설치가 완료되었다. 실제로 동작하는지 확인하려면, 예제 코드를 돌려보면 되는데, 실행 방법은 다음과 같다. 


서버 실행

gradlew :grpc-examples:helloWorldServer -Pprotobuf.include=C:\dev\libs\protobuf\src  -Pprotobuf.libs=C:\dev\libs\protobuf\vsprojects\Release



클라이언트 실행

gradlew :grpc-examples:helloWorldClient -Pprotobuf.include=C:\dev\libs\protobuf\src  -Pprotobuf.libs=C:\dev\libs\protobuf\vsprojects\Release


실행시 위와 같이 protocol buf lib 위치와 소스 위치를 지정해야 하는데, 매번 지정하기 귀찮다면 다음과 같이 환경 변수로 넣어놓아도 된다.

Since specifying those properties every build is bothersome, you can instead create %HOMEDRIVE%%HOMEPATH%.gradle\gradle.properties with contents like:

protobuf.include=C:\\path\\to\\protobuf-3.0.0-alpha-2\\src

protobuf.libs=C:\\path\\to\\protobuf-3.0.0-alpha-2\\vsprojects\\Release


EmbeddedServer 애플리케이션

애플리케이션이 로딩될때, HazelCast를 같은 JVM에서 수행 시킴

1. HazelCast를 다운로드 받은 후, 압축을 푼다. (www.hazelcast.org)

2. 서버 애플리케이션 코드 작성

package terry.hazelcast;

 

import com.hazelcast.core.*;

import com.hazelcast.config.*;

import java.util.Map;

import java.util.Queue;

 

public class GettingStarted {

 

    public static void main(String[] args) {

        Config cfg = new Config();

        HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);

        Map<Integer, String> mapCustomers = instance.getMap("customers");

        mapCustomers.put(1, "Joe");

        mapCustomers.put(2, "Ali");

        mapCustomers.put(3, "Avi");

 

        System.out.println("Customer with key 1: "+ mapCustomers.get(1));

        System.out.println("Map Size:" + mapCustomers.size());

 

        Queue<String> queueCustomers = instance.getQueue("customers");

        queueCustomers.offer("Tom");

        queueCustomers.offer("Mary");

        queueCustomers.offer("Jane");

        System.out.println("First customer: " + queueCustomers.poll());

        System.out.println("Second customer: "+ queueCustomers.peek());

        System.out.println("Queue size: " + queueCustomers.size());

    }

}

3. 서버 실행 

% java terry.hazelcast.GettingStarted


2월 11, 2014 12:33:22 오전 com.hazelcast.cluster.MulticastJoiner

INFO: [192.168.219.154]:5701 [dev] 



Members [1] {

Member [192.168.219.154]:5701 this

}


2월 11, 2014 12:33:22 오전 com.hazelcast.core.LifecycleService

INFO: [192.168.219.154]:5701 [dev] Address[192.168.219.154]:5701 is STARTED

2월 11, 2014 12:33:22 오전 com.hazelcast.partition.PartitionService

INFO: [192.168.219.154]:5701 [dev] Initializing cluster partition table first arrangement...

Customer with key 1: Joe

Map Size:3

First customer: Tom

Second customer: Mary

Queue size: 2

※ 만약에 같은 애플리케이션을 한번 더 수행 시키면, 새로운 HazelCast 인스턴스가 뜨면서 Cluster에 Join 되는 것을 확인할 수 있다.


Client/Server 형 애플리케이션

1. Client 코드 작성

package terry.hazelcast;

 

import com.hazelcast.client.config.ClientConfig;

import com.hazelcast.client.HazelcastClient;

import com.hazelcast.core.HazelcastInstance;

import com.hazelcast.core.IMap;

 

public class GettingStartedClient {

 

    public static void main(String[] args) {

        ClientConfig clientConfig = new ClientConfig();

        clientConfig.addAddress("127.0.0.1:5701");

        HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);

        IMap map = client.getMap("customers");

        System.out.println("Map Size:" + map.size());

    }

}

 2. 서버 실행

% {hazelcast_home}/bin/server.bat를 실행



3. 클라이언트 코드를 실행

% java terry.hazelcast.GettingStartedClient

2월 11, 2014 12:35:46 오전 com.hazelcast.core.LifecycleService

INFO: HazelcastClient[hz.client_0_dev] is STARTING

2월 11, 2014 12:35:47 오전 com.hazelcast.core.LifecycleService

INFO: HazelcastClient[hz.client_0_dev] is STARTED

2월 11, 2014 12:35:47 오전 com.hazelcast.client.spi.ClientClusterService

INFO: 


Members [1] {

Member [192.168.219.154]:5701

}


Map Size:0


참고. 위의 예제에 사용된 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

 

  <groupId>terry</groupId>

  <artifactId>hazelcast</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

 

  <name>hazelcast</name>

  <url>http://maven.apache.org</url>

 

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  </properties>

 

  <dependencies>

    <dependency>

            <groupId>com.hazelcast</groupId>

            <artifactId>hazelcast-all</artifactId>

            <version>3.1.3</version>

        </dependency>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

 

노트

코드를 보면 알겠지만, 사용 방법이 다른 IMDG에 비해서 매우 쉽다. Learning Curve가 매우 낮다.

WSO2,Mule,Vert.x,Camel,Atlassian (이것도 레퍼런스 올라왔던데, 예전에는 Coherence를 사용했는데, 아마 Oracle 인수후, 이쪽으로 온듯) 등 여러 솔루션에 사용되고 있으며, 자체 Clustering 기능이 구현이 아주 쉽기 때문에, 다른 솔루션에 클러스터 구성용으로 많이 사용된다. 그외에서 message queue 기능, HTTP Session replication, Hibernate level2 캐쉬, Spring과 integration이 쉽기 때문에 사용성 면에서는 매우 높은 점수를 줄 수 있으나, 아직까지 Infinispan과의 성능 비교 글들을 보면, 열세인데, 이부분은 조금 더 리서치가 필요할듯


  • 내용 원본 : http://www.hazelcast.org/getting-started/
  • 테스트 소스 코드 https://github.com/bwcho75/hazelcast (향후 다른 코드 추가 예정)



Spring Maven 개발 환경 설정

 

※주 : Maven Eclipse Juno 버전 이상이 설치된 것을 가정으로 함


Pre-quest

이클립스 설치 : Juno  버전 이상 사용

Maven 플러그인 설치 : Help > Eclipse Market Place에서 Maven Integration for Eclipse 설치



1. 이클립스 설정

일반 기업의 경우 방화벽이 있는 경우가 많기 때문에 반드시 Proxy 설정 확인하고 시작할것

 

   eclipse proxy 설정

: Juno 버전 이상 Windows > Preference > Network 메뉴에서 Active Provider Mannual로 변경 한후, HTTP HTPS proxy entriy에 서버를 등록

   Maven에서도 해줘야 함

: Juno 버전 이상 Windows > Preference > Maven 메뉴에서 setting.xml의 위치를 찾아서 다음과 같이 proxy 설정 부분을 추가 작성

<proxies>

    <proxy>

      <id>optional</id>

      <active>true</active>

      <protocol>http</protocol>

      <username>proxyuser</username>

      <password>proxypass</password>

      <host>프록시 서버 주소</host>

      <port>포트</port>

    </proxy>

  </proxies>

         <proxy>

                  <id>samsung</id>

                  <active>true</active>

                  <protocol>http</protocol>

                  <host>프록시 서버 주소</host>

                  <port>포트</port>

         </proxy>

         <proxy>

                  <id>samsung-https</id>

                  <active>true</active>

                  <protocol>https</protocol>

                  <host>프록시 서버 주소</host>

                  <port>포트</port>

         </proxy>

  </proxies>

 

 

2. 프로젝트 생성

 

이클립스에서 New > Other > Maven > Maven Project 선택

Filter에서 maven-archetype-quickstart 를 선택

Ÿ   group id 에는 프로젝트명 (일반적으로 패키지명으로 맵핑됨)

Ÿ   artifact id에는 디렉토리명

Ÿ   Package에는 패키지 명을 정의

 

또는 아래와 같이 Command Line으로 생성후, 나중에 이클립스에서 Import

mvn archetype:generate -DarchetpeArtifacId=maven-archetype-quickstart -DarchetypeVersion=1.1  -DinteractiveMode=false  -DgroupId=spring-tutorial -DartifactId=ch1_simple -Dversion=1.0-SNAPSHOT -Dpackage=bcho.spring.tutorial.ch1

 

3. pom.xml 편집

spring-beans, spring-core, spring-context depdency에 추가

그리고, JUnit4로 테스트를 진행 예정이기 때문에 spring-test와 junit 4.11을 추가

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>


  <groupId>spring-tutorial</groupId>

  <artifactId>helloworld</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>


  <name>helloworld</name>

  <url>http://maven.apache.org</url>


  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  </properties>


  <dependencies>

 

  <dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-beans</artifactId>

   <version>3.2.2.RELEASE</version>

  </dependency>

  <dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-context</artifactId>

  <version>3.2.2.RELEASE</version>

  </dependency>

  <dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-core</artifactId>

  <version>3.2.2.RELEASE</version>

  </dependency>

  <dependency>

  <groupId>junit</groupId>

  <artifactId>junit</artifactId>

  <version>4.11</version>

  </dependency>

  <dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-test</artifactId>

  <version>3.2.2.RELEASE</version>

  </dependency>

  </dependencies>

</project>


4. context.xml 작성

/src/main/resources/spring-context.xml 을 작성하고, bean을 정의

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">



<bean id="hello" class="spring_tutorial.helloworld.HelloWorld">

<property name="name" value="Byungwook"></property>

</bean>

</beans>

 

5. Bean Class 작성

main/java/HelloWorld.java 작성

package spring_tutorial.helloworld;


public class HelloWorld {

    String hello;

    public void setName(String name){

           this.hello = name;

    }

    public String getName(){

    return hello;

    }

    public void sayHelloWorld(){

           System.out.println("hello :"+hello);

    }

}

 

6. 수행 클래스 작성

package spring_tutorial.helloworld;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


/**

 * Hello world!

 *

 */

public class App 

{

    public static void main( String[] args )

    {

      ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");

           

           HelloWorld hw = (HelloWorld)context.getBean("hello");

           hw.sayHelloWorld();

    }

}


7. Run as 에서 Java Application으로 실행

8. 테스트 클래스 작성


package spring_tutorial.helloworld;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations="classpath:spring-context.xml")


public class AppTest 

{

  @Autowired HelloWorld hello;

  @Test public void helloTest(){

 assert( hello.getName().equals("Byungwook"));

  }

}

9. 테스트 실행
프로젝트에서 Run as > Maven test 를 선택
또는 프롬프트 상에서 mvn test를 수행

10. Goal에 대해서
Goal은 ant의 target과 같은 개념으로, mvn의 경우 pre-defined goal을 가지고 있다.
mvn compile : 컴파일 수행
mvn package : jar 파일로 패키징
mvn test : JUnit 테스트 수행
mvn install : local repository (PC내의 디렉토리)에 해당 jar 파일을 저장 
mvn deploy  : remote repository (Nexus)에 jar 파일 저장
mvn clean : 컴파일 내용 모두 삭제
mvn build : 위의 예제는 일반적은 spring-java 코드로 build goal을 제공하지 않는다. (Eclipse에서 run as하면 나와서 헷갈리게 만드는데) build goal을 지원하는 프로젝트를 만들거나 또는 pom.xml안에 인위적으로 build goal을 지정해줘야 한다.

install과 deploy에 의해서 repository에 저장된 jar파일들은 dependency 체크등에서 불려서 사용될 수 있다.




참고 사항

1. 가끔 Eclipse에서 Maven을 수행 시키면 아래와 같은 에러가 나는 경우가 있다.

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile (default-testCompile) on project helloworld: Compilation failure

[ERROR] Unable to locate the Javac Compiler in:

[ERROR] C:\Program Files\Java\jre7\..\lib\tools.jar


이는 Eclipse가 loading될때, JDK에 있는 java가 아니라 JRE에 있는 java를 가지고 수행되었을 경우 발생하는데, maven이 javac compiler를 찾을 수 없다는 메세지이다.

이를 해결하려면 eclipse.ini에 JDK의 경로를 아래와 같이 명시적으로 지정해줘야 한다.

-vm

C:\Program Files\Java\jdk1.7.0_07\bin\javaw.exe

2. 위의 설정을 했음에도 불구하고, eclipse에서 안될때가 있는데, 이 경우에는 Runs As에서 메이븐 설정에서 JRE 부분에 JDK 경로를 지정해주면 된다.



3. 디렉토리 구조 참고





http://www.mkyong.com/spring3/spring-3-hello-world-example/

http://androi.tistory.com/37