안녕하세요? 이번 포스팅에서는 지난 번 Node.js 런타임에서 Redis 사용하는 방법에 이어 Java Runtime인 Liberty Profile Runtime에서 Redis서비스를 사용하는 내용을 다루도록 하겠습니다. 지난 글에서 이어지는 내용이 있으므로 Bluemix에서 Redis 서비스를 이용해 보자 #1 – Node.js를 먼저 참고하시기 바랍니다.

Redis Cloud를 이용한 Redis 앱 생성

앞서 Redis Cloud를 이용하여 Node.js 애플리케이션을 생성했었다면, 이번에는 WebSphere Liberty Profile을 이용한 Java Redis Client를 이용해 보고자 합니다.

지난 Node.js용 애플리케이션과 마찬가지로 Bluemix GUI를 이용하면 생성한 Runtime을 사용하는 예제를 소스 코드로 얻을 수 있기 때문에 이를 이용해 보도록 하겠습니다.

Java Runtime App 생성

Bluemix Catalog의 Cloud Foundry 앱 항목을 선택하면 Bluemix에서 지원하는 다양한 Runtime을 볼 수 있습니다.

cfapp_nodejs

그 중 Liberty for Java를 선택하여 다음과 같이 Java Runtime을 이용하여 이름이 중복되지 않게 적절히 입력 후 앱을 생성 합니다.


Redis Cloud 서비스 바인드

정상적으로 앱이 생성되었다면 이제는 Redis Cloud 서비스를 연결합니다. 기존에 생성해 놓았던 Redis Cloud 서비스를 이용하는 것으로 다음과 같이 애플리케이션에서 연결 항목을 선택하고



기존 항목 연결 버튼을 누르면, 현재 작업 공간에 생성되어 있는 서비스들 중 연결 가능한 서비스들을 볼 수 있습니다.



서비스 연결이 완료 되었다면 앱을 다시 스테이지 해야 합니다.



정상적으로 Redis Cloud 서비스가 연결 되었다면 애플리케이션에 대한 예제 코드를 다운로드 하도록 합니다.

Liberty 용 예제 코드 다운로드 및 Local 실행 환경 구성

Bluemix에서는 앞서 생성한 Node.js 앱과 마찬가지로 Liberty Profile에 대한 예제 소스 코드를 제공합니다. 대시보드로 진입하여 소스 코드 다운로드 후 local 개발 환경에서 Redis를 위한 환경을 구성 후 이를 다시 Bluemix로 배포하는 방식으로 진행합니다.

애플리케이션 대시보드의 왼편에는 선택한 애플리케이션에 대한 다양한 메뉴를 제공합니다. 그 중에서 시작하기 메뉴를 선택하면 해당 앱에 대한 예제 코드를 다운로드 받을 수 있는 링크를 제공합니다.

혹시 다운로드 링크를 찾지 못하는 경우 다음과 같이 CF CLI를 이용하여 애플리케이션의 GUID를 확인 후 아래 링크를 웹 브라우저로 열면 예제 코드가 다운로드 됩니다.

https://console.ng.bluemix.net/rest/apps/{GUID}/starter-download

참고로 Region(지역)이 미국 남부가 아닌 영국이나 호주인 경우 아래와 같은 URL을 이용합니다.

[영국] https://console.eu-gb.bluemix.net/rest/apps/{GUID}/starter-download
[호주] https://console.au-syd.bluemix.net/rest/apps/{GUID}/starter-download

소스코드를 다운로드 했다면, 원격이 아닌 Local 개발 환경에서 실행 할 수 있도록 환경을 구성합니다.

기본적으로 설치되어야 할 항목은 다음과 같습니다.

JDK의 경우는 Maven 실행에 필요한 버젼을 설치합니다. (보통은 JDK 1.7), Eclipse는 Java 소스 코드 편집용으로서 다른 Java Source Code 편집기로 대체 가능합니다.

위의 항목이 잘 설치되었다는 가정 아래 다운로드 받은 예제 코드를 압축해제 합니다.

다운로드 받은 소스 파일 중 manifest.yml 파일이 있는데, 이 파일에는 애플리케이션의 기본 정보와 앞서 생성했던 Redis 서비스가 정의 되어 있는 것을 확인해 볼 수 있습니다.

CF CLI를 이용하여 애플리케이션을 생성하거나 업데이트 할 수 있는데 이 파일이 가장 기본적인 정보를 담고 있습니다.

이제 실행에 필요한 모듈 설치를 위해 명령창을 열어 애플리케이션의 pom.xml 파일이 있는 곳으로 이동 후 mvn clean install 명령을 실행합니다.

앞서 말했던 maven이 정상적으로 설치되어 있다면 기존 build한 정보를 삭제 후 필요한 모듈 및 설치를 진행합니다. 별다른 오류가 없었다면 target 폴더에 pom.xml에 정의된 JavaHelloWorldApp.war 파일이 생성됩니다.

이제 앱에 연결된 Redis 서비스 신임 정보를 확인 하기 위해 VCAP_SERVICES 정보를 확인 할 차례입니다. Cloud Foundry 앱은 앱에 연결된 서비스에 대한 정보를 VCAP_SERVICES라는 환경 변수에 저장하고 있습니다. 이 정보는 CF CLI의 cf env {appname} 명령으로 확인 하거나 Bluemix 대시보드의 Runtime 메뉴의 환경변수 탭을 통해 확인 할 수 있습니다.

이제 이 값을 VCAP_SERVICES라는 이름의 환경 변수로 저장해야 합니다. 다만, 환경 변수 저장 명령 실행 시 그 값에 개행 문자가 있는 경우 전체 입력이 안되므로 Bluemix GUI에서 복사했던 VCAP_SERVICES 데이터에서 개행문자를 삭제하여 처리해야 합니다.

참고로 Node.js 예제에서는 이런 불편함을 단순하게 처리하는 vcap-local.js 를 이용했는데, vcap-local.json이라는 파일에 VCAP_SERVICES의 내용을 저장하고 아래와 같이 개발환경에 맞춰 설정하면 환경 변수가 설정되니 Node.js runtime을 설치했다면 아래 명령을 이용할 수 있으므로 보다 간편하게 VCAP_SERVICES 환경 변수를 설정 할 수 있습니다.

  • Linux/MacOS

export VCAP_SERVICES=$(node vcap-local.js)

  • Windows

FOR /F "delims=" %i IN ('node vcap-local.js') DO set VCAP_SERVICES=%i

VCAP_SERVICES 환경 변수 설정이 완료되었다면, 이제 mvn liberty:run-server를 실행하여 local에서 Cloud Foundry 애플리케이션이 실행되는지 확인 합니다.


Redis Client 모듈 설치 및 Redis Client Manager 클래스 작성

Java용 Redis Client는 다양한 client를 이용할 수 있습니다만, 사람들이 많이 사용하는 모듈중 하나인 lettuce를 사용하도록 하겠습니다. 이 모듈의 설치를 위해 pom.xml 파일의 dependencies 정보에 lettuce 정보를 추가합니다.

그리고, 기본 예제에서는 JSON 형식으로 되어있는 VCAP_SERVICES를 처리하는 코드가 없습니다. JSON 정보를 파싱하고 처리하는 모듈로 Google GSON을 이용해야 하므로 아래와 같이 pom.xml에 아래와 같이 GSON 모듈을 추가합니다.

pom.xml에 모듈 정보를 다 입력했다면 mvn install 명령을 호출하여 모듈을 설치합니다.

추가 모듈의 설치가 다 되었다면 이제 src/java/main/wasdev/sample/redis 폴더 아래에 Java 클래스로 RedisClientMgr.java 파일을 생성하도록 합니다.

RedisClientMgr 클래서는 VCAPS_SERVICES 정보를 읽어 RedisCloud의 credential 정보를 추출하고 이를 이용하여 lettuce 코드를 이용한 Redis connection을 제공합니다.

Java Class 작성 시 일반적인 Text Editor를 사용해도 상관 없긴하지만 되도록이면 Java Code Syntax Highlight 기능이과 함께 Class Validation 기능이 있는 Java Project 전용 도구를 이용하는 것을 추천합니다.

  • Eclipse IDE에서 wasdev.sample.redis 패키지 생성

  • RedisClientMgr 클래스를 생성

RedisClientMgr 클래스는 다음과 같은 메소드로 구성됩니다.

  • RedisClient를 static 형식으로 하나 생성 할 수 있는 initClient()


  • initClient()를 통해 호출되며 JSON 형식의 VCAP_SERVICES 정보를 처리 후 RedisClient를 생성하는 createClient()


  • 마지막으로 생성된 createClient를 이용하여 연결 정보를 전달하는 getConnection()


  • RedisClientMgr.java 파일에 대한 구현은 GitHub에도 공유되어 있으니 참고 하시기 바랍니다.

    Redis Client 호출 예제 작성

    이제 만들어 놓은 RedisClientMgr를 이용하여 HTTP Servlet으로 Redis HSET, HGET 명령을 수행하는 예제를 작성해 보겠습니다.

    먼저 HSET을 위한 HSetServlet을 다음과 같이 생성 합니다.

    doGet 메소드에 HSET 명령 처리를 위한 두 개의 parameter를 얻고 HSET 명령에 대응되는 함수를 다음과 같이 구현합니다.

    그리고 HSET과 마찬가지로 HGET을 위한 HGetServlet을 생성 합니다.

    이제 mvn installmvn liberty:run-server를 이용하여 작성된 코드를 빌드 후 애플리케이션을 시작 합니다.

    그리고, 다음 명령을 이용하여 HGET/HSET을 테스트 합니다.

    • HSET 테스트

    curl http://localhost:9080/JavaHelloWorldApp/HSetServlet?field=hello&value=world
    

    처음 생성되는 경우 created라는 응답이, 동일한 field가 존재하는 경우 updated라는 메시지가 출력됩니다.

    • HGET 테스트

    curl http://localhost:9080/JavaHelloWorldApp/HGetServlet?field=hello
    

    호출 성공 시 마지막에 입력된 value값이 출력됩니다.

    참고로 HSET, HGET 명령에 대한 정보는 아래 Redis 홈페이지에서 확인 할 수 있습니다.

    원격에서 확인

    이제 Local에서 테스트 했던 이 정보를 Bluemixcf push 명령을 이용하여 배포합니다.

    배포가 성공했다면 이번엔 배포가된 애플리케이션 URL을 이용하여 테스트를 해 봅니다.

    • HSET 테스트

    curl http://hello-redis-nodejs.mybluemix.net/HSetServlet?field=hello&value=world
    

    • HGET 테스트

    curl http://hello-redis-nodejs.mybluemix.net/HGetServlet?field=hello
    

    본 포스팅에서 사용했던 코드는 다음 GitHub에 업데이트 되어 있으니 참고 하시기 바랍니다.

    참고