메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Java development 2.0: Gretty를 사용한 초경량 Java 웹 서비스

매우 신속한 애플리케이션 개발을 위해 Gretty에서는 웹 스택이 삭제되었다.

Andrew Glover, 대표, Stelligent Incorporated
Andrew Glover 사진
Andrew Glover는 Stelligent Incorporated의 사장이다. 회사들이 코드 품질을 일찍 그리고 자주 모니터할 수 있게 하는 효과적인 개발자 테스팅 전략과 지속적 통합 기법으로 소프트웨어 품질 문제를 해결하는 것을 돕고 있다. Andy의 저서 목록은 그의 블로그를 보라.

요약:  Gretty는 웹 서비스를 빌드하기 위해 만들어진 새로운 방식의 초경량 프레임워크입니다. 매우 빠른 Java™ NIO API상에 빌드된 Gretty는 Groovy를 Grape의 Maven 스타일 종속성 관리와 웹 엔드포인트를 위한 언어(특정 도메인에 적합한)로 활용합니다. 이 기사에서는 Gretty를 사용하여 Java 웹 서비스 애플리케이션을 빌드하고 배치하는 작업을 시작합니다.

이 연재 자세히 보기

기사 게재일:  2011 년 11 월 09 일
난이도: 중급 원문:  보기 PDF:  A4 and Letter (45KB | 9 pages)Get Adobe® Reader®
페이지뷰:  2128 회
의견:  


마지막 몇 건의 Java development 2.0 기사에서 필자는 간단한 클라우드 투 모바일 애플리케이션을 빌드했다. 이 애플리케이션은 Magnus라고 하며, 모바일 디바이스의 위치 정보를 대기하는 HTTP 엔드포인트로 역할을 한다. 이 애플리케이션은 HTTP PUT 요청을 수신함으로써 기능하며 각 요청에는 주어진 시점에서 계정의 위치를 나타내는 JSON 문서가 포함되어 있다. 지금까지 필자는 웹 프레임워크 Play를 사용하여 Magnus를 개발하고 확장했다(참고자료 참조).

이 시리즈의 정보

처음 Java 기술이 발표된 이후로 Java를 개발하는 과정은 급속도로 변화되었다. 오픈 소스 프레임워크와 신뢰할 수 있는 임대용 전개 인프라 덕택에 Java 애플리케이션을 신속하고 저렴하게 어셈블하고 테스트하고 유지할 수 있게 되었다. 이 시리즈에서 Andrew Glover는 이러한 새로운 Java 개발 패러다임을 가능하게 하는 다양한 기술과 도구를 탐구한다.

Play는 MVC 스택을 제공한다는 점에서 Grails와 매우 유사하다. Play를 사용하면 뷰(JSP, GSP, 템플리트 등)를 활용하고 어떤 방식으로 모델을 조작하는 제어기(서블릿)를 손쉽게 정의할 수 있다. 모델은 Hibernate, JPA 또는 기타 멋진 ORM과 같은 기술로 강화된 POJO(Plain Old Java Objects)를 사용하여 구현한다.

MVC가 오래된 표준이기는 해도 Grails 및 Play와 같은 프레임워크가 생겨나면서 많은 것이 변경되었다. 간단한 웹 요청-응답 상호 작용(말하자면, Struts를 사용하여)을 지속하는 데 한 번 들어가는 노력을 간단히 생각해 보면, MVC 웹 애플리케이션을 신속하게 빌드하게 될 수 있을 정도로 많은 발전이 이루어졌다는 점에 감사하게 될 것이다. 그렇지만 모든 웹 애플리케이션이 작동될 MVC 인프라를 필요로 하는 것은 아니다. 현재, 일부 웹 애플리케이션은 MVC "스택"을 전혀 필요로 하지 않는다.

브라우저를 닫고 이러한 이단적인 말에 반박하기 전에 Magnus를 기억해 보자. 순전히 데모용으로 고안된 필자의 이 클라우드 투 모바일 애플리케이션은 기존의 뷰 컴포넌트를 포함하고 있지 않으며 주로 기존의 성공적인 서비스로부터 그 자체를 모델링한다. Twitter나 Foursquare와 마찬가지로 Magnus는 지구상에 있는 이종의 디바이스로부터 메시지를 수신한다. 일반적으로 Magnus는 웹 서비스이지만, 모든 웹 서비스가 작업을 수행하기 위해 MVC 스택 프레임워크를 필요로 하는 것은 아니다. 어떤 경우에는 웹 스택이 없는 초경량 웹 프레임워크만 있으면 된다.

이번 달에는 이러한 초경량 프레임워크 중에서 하나, 즉 새롭게 하는 데 필요한 자체 홈페이지도 없고 아마도 이런 홈페이지가 필요하지도 않을 만큼 신속한 개발 프레임워크를 살펴보게 될 것이다. Gretty의 계통과 계열(각각 Netty 및 Groovy 포함)은 Gretty가 이미 Java 2.0 웹 개발 패밀리에 속할 정도로 훌륭하다. Gretty는 많은 개발자들이 필요성이 있다는 것을 아직 모르고 있는 필요성을 만족시킨다. (이것이 진정한 Web 2.0 스타일이다, 그렇지 않나?) . 그리고 Gretty는 기꺼이 색다른 길로 가고자 하는 경우에도 프로덕션 환경에서 사용할 수 있을 정도로 안정적이다.

신속한 Java 개발의 역사

Servlets API가 처음 도입되었을 때를 기억할 수 있을 만한 나이에 있는 사람이라면 새로운 "경량" 프레임워크를 회의적으로 바라보는 이유가 있지만, 결국에는 많은 코드와 JAR 파일이 없어도 단지 간단한 서블릿을 이용하여 웹 서비스를 빌드할 수 있다. Restlet나 Jersey와 같은 웹 서비스 프레임워크는 약간 다른 방식으로 개발 속도를 개선하며 클래스 확장, 어노테이션 및 표준 JSR을 빌드하여 RESTful 웹 서비스를 작성한다. 어떤 경우에는 이러한 두 가지 프레임워크가 여전히 좋은 옵션이 된다.

그러나 일부 새로운 경량(이전의 경량과 대조적으로) 프레임워크에서는 매우 간단하게 정의할 수 있는 간단한 HTTP 엔드포인트(라우트라고 하기도 함)나 웹 서비스를 작성하고 있다고 한다. 서블릿을 끼워 넣는 것보다 훨씬 더 간단하다.

이러한 프레임워크는 다른 플랫폼, 특히 Sinatra for Ruby 및 Express for Node.js에서 먼저 부각되었다. 그러나 흥미로운 프로젝트가 Java 플랫폼에서도 출현하기 시작했다. 이러한 프로젝트 중 하나는 Gretty이며 물론 Gretty는 Groovy와 JVM용으로 자체 제작된 것이다.


필자는 Gretty 편이다.

필자의 생각에 Gretty에는 시도해 볼만한 것들이 최소한 두 가지가 있다. 첫 번째는 Groovy의 Grape(곧 자세하게 설명할 것임)를 사용하여 종속성 관리를 용이하게 하는 것이다. 두 번째는 엔드포인트를 정의하는 데 필요한 간단한 DSL 형식 구문이다. Gretty를 사용하면 실제 비즈니스 논리를 처리하는, 작동하는 웹 라우팅 프레임워크를 매우 신속하게(단지 코드 몇 행으로) 정의하고 배치할 수 있다. 하나의 예로서 목록 1에서 필자가 일반적인 "Hello World" 예제를 준비하는 것을 지켜보자.


리스트 1. Gretty로 작성된 "Hello, World" 예제

import org.mbte.gretty.httpserver.* 

@GrabResolver(name='gretty', 
  root='http://groovypp.artifactoryonline.com/groovypp/libs-releases-local')
@Grab('org.mbte.groovypp:gretty:0.4.279') 

GrettyServer server = [] 
server.groovy = [ 
    localAddress: new InetSocketAddress("localhost", 8080), 
    defaultHandler: { 
        response.redirect "/" 
    }, 
    "/:name": {
        get {
            response.text = "Hello ${request.parameters['name']}"
        } 
    } 
] 
server.start()

목록 1에서 필자는 포트 8080에서 대기하는 서버를 작성한 후, 매개변수 name을 포함하고 있는 간단한 루트 엔드포인트를 설정했다. 일부 다른 엔드포인트에 대한 모든 요청은 defaultHandler를 통해 다시 /로 라우트된다. 기본적으로 핸들러는 /의 위치를 사용하여 요청하는 클라이언트에게 HTTP 301 "Moved Permanently" 코드를 전송한다. 모든 요청은 전달되는 매개변수 값과 문자열 "Hello"가 포함되어 있는 응답을(content-type이 text/plain으로 설정된) 수신한다. 다시 말해서 /Andy에 대한 결과는 "Hello Andy"가 된다.

Gretty 및 NIO

Gretty는 Java의 NIO 라이브러리를 주로 사용하는 클라이언트-서버 프레임워크인 Netty를 사용하여 빌드되었다. I/O 라이브러리 패키지인 NIO(New I/O)는 Java 1.4가 발표되었을 때 도입된 방식이다. NIO에서는 주로 비블록킹 IO 조작에 주목하고 있으며 확장 가능한 서버 구성이 허용된다. 이점은 Netty 및 Gretty와 같은 프레임워크에 유용하다.

그렇다면 목록 1에서 중요한 점은 무엇일까? 무엇보다도 목록 1에는 애플리케이션에 필요한 모든 것이 나열되어 있다. 여기에는 구성 파일이 없다. 필자는 Groovy 1.8 이외에는 무엇인가를 직접 다운로드하거나 설치할 필요도 없었다. 이 예제를 실행하려면 단순히 groovy server.groovy를 입력하면 된다.

그러면 응답이 간단한 텍스트보다 약간 더 복합해야 하는 경우에는 어떻게 될까? Gretty에는 이런 경우를 위한 많은 옵션이 있으며 이 중 두 가지는 매우 간단하다. 첫째, 필자가 목록 2에서 한 것과 같이 응답 유형을 HTML로 설정한다.


리스트 2. Gretty의 HTML 응답

"/:name": {
 get {
  response.html = "Hello ${request.parameters['name']}"
 } 
} 

이 경우에는 응답의 content-type이 text/html로 설정된다. 또한, Gretty를 이용하면 정적 및 동적 템플리트를 활용할 수 있다. 다시 말해서, 필자는 간단한 목록 3과 같이 JSP/GSP 형식의 구문을 사용하여 템플리트를 정의할 수 있었다.


리스트 3. Gretty의 HTML 템플리트

<html>
 <head>
  <title>Hello!</title>
 </head>
 <body>
  <p>${message}</p>
 </body>
</html>

그런 다음에는 응답의 본체에서 템플리트를 참조할 수 있다.


리스트 4. Gretty의 Groovy++ 템플리트

"/:name" {
  get {
   response.html = template("index.gpptl", 
     [message: "Hello ${request.parameters['name']}"])
  }
}


Gretty와 Grape를 사용한 종속성 관리

Gretty를 사용하여 매우 신속하게 개발할 수 있게 된 것은 2진 종속 항목이나 JAR 파일을 자동으로 다운로드하는 데 사용되는 Grape(참고자료 참조) 덕택이다. 모든 파일은 Maven 스타일의 이행 종속 항목과 함께 로드된다. 필자가 목록 1에서 해야 했던 모든 것은 @Grab('org.mbte.groovypp:gretty:0.4.279') 어노테이션을 입력하는 것이었으며, 필자는 Gretty와 연관된 JAR 파일을 Gretty의 종속 항목과 함께 가져왔다. @GrabResolver(name='gretty', root='http://groovypp.artifactoryonline.com/groovypp/libs-releases-local') 어노테이션은 Grape가 필요한 파일을 찾을 수 있는 위치를 나타낸다.

Gretty는 단지 Groovy가 아니다.

Gretty는 Groovy 언어로 제한되지 않는다. JVM에서 실행되는 모든 애플리케이션과 마찬가지로 Java 언어나 심지어 Scala로 Gretty 애플리케이션을 작성할 수 있다.

Grape는 단순해 보이지만, 그렇다고 해서 Grape가 프로덕션 환경에 맞지 않는 것은 아니다. 사실상 Grape에 있는 필수 종속 항목 자동 다운로드 기능은 Maven의 자동 다운로드 기능과 다르지 않다. 단지 Grape의 자동 다운로드 기능이 처음 애플리케이션이 실행될 때 런타임 시에 수행되는 반면에 Maven은 빌드 시간에 필수 종속 항목을 다운로드한다는 점이 다를 뿐이다. Grape가 로컬에서 필수 종속 항목을 찾을 수 있는 경우에는 다운로드가 필요하지 않다. 필수 JAR는 자동으로 애플리케이션의 클래스 경로에 배치된다. 결과적으로 Grape로 구성된 애플리케이션을 처음 실행할 때만 성능이 저하될 뿐이다. 물론, 지정된 종속 항목의 필수 버전을 변경할 때마다 약간 성능이 저하되게 된다.


Gretty는 Magnus를 만족시킨다.

다행히도 지금까지 Gretty가 단순하며 Gretty를 이용하면 쉽고 빠르게 애플리케이션을 개발할 수 있다는 사실을 확인했다. 또한, Gretty나 Gretty와 같은 프레임워크는 Magnus와 같은 애플리케이션(데이터를 대기하는 HTTP 엔드포인트)에 매우 적합하다. 그러면, Play나 Grails와 같은 상당히 경량인 프레임워크를 Gretty로 작성된 훨씬 더 경량인 애플리케이션으로 완전히 대체하면 어떻게 되는지 확인해 보도록 하자.

이 새로운 Magnus를 위해 필자는 Morphia와 MongoHQ를 사용할 것이며 이러한 두 가지 도구는 필자가 작성한 Amazon Elastic Beanstalk 소개 기사를 참조하기 바란다. 새로운 구성으로 Groovy의 Grape 유틸리티를 활용하기 위해 필자는 다음과 같이 목록 5에 있는 어노테이션을 필자의 서버에 추가할 것이다.


리스트 5. Morphia 및 그 종속 항목 추가

@GrabResolver(name='morphia', root='http://morphia.googlecode.com/svn/mavenrepo/')
@Grab(group='com.google.code.morphia', artifactId='morphia', module="morphia", 
  version='0.99')

필자의 Morphia 클래스는 초기의 Magnus 애플리케이션에 있었던 것과 동일하며 필자에게는 AccountLocation이 있다. 이 엔드포인트에서 필자는 주어진 계정의 위치를 업데이트할 것이다. Morphia 클라이언트가 JSON 문서를 Gretty의 엔드포인트로 전송하므로 필자는 이미 Gretty에 내장된, JSON 처리 프레임워크인 Jackson도 사용할 것이다. Grape가 이행 종속 항목을 처리하므로 이제 필자는 수신 JSON 문서를 구문 분석하여 간단한 Java Map으로 변환하는 데 필요한 모든 것에 액세스할 수 있다.


리스트 6. Gretty로 위치 업데이트

def server = new GrettyServer().localAddress(new InetSocketAddress("localhost", 8080)).
 "/location/:account" {
  put {
    def jacksonMapper = new ObjectMapper()
    def json = jacksonMapper.readValue(request.contentText, Map.class)
    def formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm")
    def dt = formatter.parse(json['timestamp'])
    def res = [:]
    try{
      new Location(request.parameters['account'], dt, json['latitude'].doubleValue() , 
          json['longitude'].doubleValue() ).save()
	  res['status'] = 'success'
    }catch(exp){
      res['status'] = "error ${exp.message}"
    }
    response.json = jacksonMapper.writeValueAsString(res)
  }
}
server.start ()

목록 6에서 알 수 있는 바와 같이 수신 JSON 문서의 Map(json) 이 작성되어 목록 7에 있는 필자의 Location 클래스를 통해 MongoDB에 적절하게 삽입된다.


리스트 7. 위치 문서 작성— Gretty로 돌아옴

import com.google.code.morphia.annotations.Entity

@Entity(value = "locations", noClassnameStored = true)
class Location extends AbstractModel {
 String accountId
 double latitude
 double longitude
 Date timestamp

 public Location(String accountId, Date timestamp, double lat, double lon) {
  this.accountId = accountId
  this.timestamp = timestamp
  this.latitude = lat
  this.longitude = lon
 }
}

게다가 필자의 Location에는 목록 8과 같은 Groovy 수퍼클래스가 있다.


리스트 8. Location의 기본 클래스

import com.google.code.morphia.Morphia
import com.google.code.morphia.annotations.Id
import com.mongodb.Mongo
import org.bson.types.ObjectId

abstract class AbstractModel {
  @Id
  private ObjectId id;

  def save() throws Exception {
    def mongo = new Mongo("fame.mongohq.com", 32422)
    def datastore = new Morphia().createDatastore(mongo, "xxxx", 
      "xxxx", "xxxx".toCharArray())
    datastore.save(this)
    return this.id
  }
}

"Climb the Elastic Beanstalk"의 목록 3에서 이 코드를 확인할 수 있다. Gretty 구현을 위해 필자는 단지 Location.java의 실제 파일 이름을 Location.groovy로 변경했을 뿐이기 때문에 필자는 서버를 시작하기 전에 이 파일을 컴파일할 필요가 없었다. 또한, 기본 클래스를 추가했다. Location은 해당 URI에서 얻은 수신 매개변수 account를 통해 계정에 연결된다.

그러면 응답이 성공을 나타내는JSON으로 전송된다. 오류가 발생하는 경우에는 또 다른 응답이 생성된다.


결론: Gretty는 준비가 되어 있다.

Gretty는 더할 나위 없이 경량이다. 여기에는 임베디드 ORM 프레임워크가 없다. 여기에는 간단한 템플리트를 제외하면 강건한 뷰 프레임워크가 없지만, 일부 다른 프레임워크를 연결하는 것이 완전히 가능하다. 이러한 모든 것이 일상적으로 사용하기에는 Gretty가 아직 준비가 되어 있지 않다는 것을 의미할까? 테스트 프레임워크가 없다는 것도 이와 동일한 의미를 갖고 있을까? 그렇지 않다. 그 이유는 첫째는 Gretty는 Netty의 제대로 된 코드를 사용하여 빌드되었기 때문에 즉시 보장을 받을 수 있기 때문이다. 둘째는 다른 웹 엔드포인트에서 하듯이 Gretty를 자동이나 수동으로 테스트할 수 있기 때문이다. 사실상, Gretty를 어떻게 테스트하는지 알고 싶으면 Gretty의 소스 코드를 확인하자. 여기에는 많은 테스트 정보를 확인할 수 있다.

때로는 개발자가 전체 스택을 필요로 하지 않다는 점에서 Gretty는 완전한 스택이 있는 최신 웹 프레임워크와는 대조적인 프레임워크이다. Gretty와 같은 프레임워크로 너무 많은 것을 수행하고 있다는 것을 느끼게 되면 완전한 스택이 많이 있고 잘 문서화된 Java 웹 프레임워크 중 하나를 사용하는 편이 더 좋다. 마찬가지로 웹 서비스 요청과 응답을 처리하기 위해 완전한 스택이 왜 있어야 하는지 의문이 드는 경우에는 바로 Gretty가 필요한 것일 수도 있다.


참고자료

교육

제품 및 기술

토론

  • developerWorks 커뮤니티에 참여하자. 개발자가 이끌고 있는 블로그, 포럼, 그룹 및 Wiki를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

Andrew Glover 사진

Andrew Glover는 Stelligent Incorporated의 사장이다. 회사들이 코드 품질을 일찍 그리고 자주 모니터할 수 있게 하는 효과적인 개발자 테스팅 전략과 지속적 통합 기법으로 소프트웨어 품질 문제를 해결하는 것을 돕고 있다. Andy의 저서 목록은 그의 블로그를 보라.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=자바, 클라우드 컴퓨팅, 웹 개발, 오픈 소스
ArticleID=773027
ArticleTitle=Java development 2.0: Gretty를 사용한 초경량 Java 웹 서비스
publish-date=11092011

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.