메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Stripes로 하는 자바 웹 개발 - 1

한빛미디어

|

2007-02-12

|

by HANBIT

14,150

제공 : 한빛 네트워크
저자 : Mark Eagle
역자 : 이정목
원문 : http://www.onjava.com/pub/a/onjava/2007/01/24/java-web-development-with-stripes.html

Stripes는 오픈소스로서 웹 개발은 개발자에게 단순하며 생산성 있어야 한다는 원칙에 입각하여 설계된 액션 기반(action-based)의 자바 웹 프레임워크이다. 전통적인 자바 웹 개발이 결합도를 낮추는 것(decoupling)을 통한 융통성에 집중한 나머지 다수의 설정 파일(multiple configuration files), 부수적인 객체(additional object), 그리고 기타 단편화된 자원들(fragmented resources)이 만들어지는 결과를 낳았는데 이러한 문제들로 수많은 개발자들이 더 높은 학습곡선과 낮아진 생산성을 겪게 되었다. 그 결과 일부 자바 개발자들은 Ruby on RailsDjango와 같은 비자바 프레임워크(non-Java Framework)로 옮겨가게 되었다. Stripes와 같은 자바 웹 프레임워크는 개발공정의 능률을 높여주는 대안 프레임워크의 성공으로부터 이제 막 배우기 시작하고 있다. 이 기사는 Stripes이 루비 온 레일즈(Ruby on Rails)에서 가능한 것과 같은 단순성을 제공해 주면서, 자체적으로 어떻게 스트러츠(Struts)와 같은 다른 액션 기반의 자바 웹 프레임워크와 구별되는지에 대해 보여줄 것이다.

[그림 1]은 Stripes로 작성된 애플리케이션에서 전형적으로 나타나는 이벤트와 컴포넌트의 일반적인 흐름을 보여준다.


[그림 1] 전형적인 Stripes의 흐름

여러분도 볼 수 있듯이 이것은 여러분이 MVC 프레임워크에서 볼 수 있는 것과 거의 유사하다. Stripes와 다른 액션 기반의 프레임워크간의 한 가지 주된 차이점은 Stripes는 외부 설정 파일이 없다는 것이다. 앞으로 다루겠지만 Stripes는 어노테이션(annotation)과 ‘설정보다는 관례(convention over configuration)’ 이용하여 좀 더 개발에 집중할 수 있게 해주고 번잡스러움은 피하게 해준다.

첫 번째 Stripe Action 만들기

곧바로 무엇이 어떻게 돌아가는지 이해하기 위해 “Hello World” 예제를 만들어 보면서 Stripes 프레임워크에 뛰어들어 보도록 하자. HelloWorldAction 클래스는 사용자에게 성명을 물어 본 다음 그것을 별도의 뷰(view)에 출력할 것이다. 먼저 컨트롤러 자바 클래스를 작성한다.
public class HelloWorldAction implements ActionBean {    

  @ValidateNestedProperties({
    @Validate(field = "firstName", required = true, 
              on = {"hello"}),
    @Validate(field = "age", required = true, minvalue = 13, 
              on = {"hello"}) 
  })
  private Person person;
  private ActionBeanContext context;
    
  @DefaultHandler 
  public Resolution index() {
    return new ForwardResolution("Hello.jsp");
  }
        
  public Resolution hello() {
    return new ForwardResolution("SayHello.jsp");
  }

  public void setPerson(String person) {this.person = person;}
  public String getPerson() { return person;}
  public void setContext(ActionBeanContext c) {this.context = c; }
  public ActionBeanContext getContext() {return context; }
}
컨트롤러 클래스는 ActionBean이라 불리는 Stripes에 특정한 인터페이스를 구현하는 POJO(Plain Old Java Object)와 닮았다. 모든 Stripes 액션은 StripesDispatcher 서블릿이 ActionBeanContext 객체를 현재 서비스되고 있는 액션에 주입하도록 이 인터페이스를 구현할 필요가 있다. ActionBeanContext 객체는 여러분이 요청(request), 응답(response), 서블릿 컨텍스트(servlet context)와 같은 API 객체에 접근할 수 있도록 해준다. Stripes 애플리케이션에서는 이러한 저수준 API 객체에 접근할 필요가 거의 없다. 또한 ActionBeanContext 클래스는 여러분이 현재 서비스 되고 있는 액션에 관한 상태 정보를 얻을 수 있도록 해줄 뿐만 아니라 현재 서비스되고 있는 액션으로부터의 통보 메시지(informational message)와 오류 메시지를 추가할 수 있도록 해준다. ActionBeanContext 필드와 접근자(accessor)는 모든 Stripes 액션들이 이 구현 클래스를 필요로 할 것이므로 기반 클래스에 저장될 수도 있다.

컨트롤러 클래스의 나머지 부분들은 다른 자바 개발자들에게 친숙할 것이다. Person이라는 객체는 뷰에서 한 사람의 성과 이름을 읽고 기록하는데 사용될 접근자를 포함한다. 이 객체는 단순히 중첩된 객체에 불과하나 Stripes는 자바 컬렉션(Java Collection), 제네릭 지원(generics support), 그리고 색인화된 프로퍼티(indexed propertis)를 통해 좀 더 복잡한 데이터 바인딩도 할 수 있도록 해준다. Stripes가 복잡한 데이터 바인딩을 처리할 수 있으므로 여러분의 도메인 객체를 그것을 필요로 하는 다른 계층에서도 재사용 할 수 있다. 예를 들어 Stripes를 통해 도메인 객체 내에 들어있는 정보들을 수집하여 Hibernate와 같은 다른 POJO 프레임워크나 EJB 3를 이용하여 퍼시스턴스 차원의 변경을 손쉽게 할 수 있다.

hello 메소드 호출시 사용자가 성명을 입력하도록 하는 간단한 Stripes 유효성 검증 어노테이션(validation annotation)이 person 필드에 추가되어 있다. 만일 사용자가 필수 입력란에 내용을 입력하지 않으면 원래 페이지로 되돌아온 다음 이 유효성 검증과 관련된 오류 메시지가 보여질 것이다. 이 유효성 검증은 어노테이션 속성(on = {“hello”})에 지정되어 있는 것과 같이 hello 이벤트가 요청되었을 경우에만 검사될 것이다. 또한 Stripes는 유효성 검증의 유형과 필드명에 근거한 sensible default를 사용하여 오류 메시지를 만들어낼 것이다. 예를 들어 만약 한 Person 객체의 필수 입력필드인 firstName이 폼이 전송될 때 주어지지 않을 경우 사용자는 다음과 같은 오류 메시지를 보게 될 것이다:
Person First Name is a required field.
(Person First Name은 필수 입력필드입니다.)
이 메시지는 Person.firstName에 대한 객체 그래프 컴포넌트(object graph component)를 이용하여 생성되는데 이것은 메시지를 좀 더 사람이 읽기 쉬운 형태로 만들어 준다. 이러한 유효성 검증 오류 메시지는 좀 더 커스터마이즈가 필요할 경우 오버라이드할 수 있다. 또한 Person 객체의 프로퍼티인 age라 불리는 Integer 타입의 필드도 있다. Stripes는 먼저 Integer 필드인 person.age에 대한 요청 파라미터 값의 타입 변환을 수행한 다음 그 값을 Person 객체내의 값에 바인딩할 것이다. 그 값이 Person 객체의 age 필드에 바인딩되고 나면 Stripes는 그 Integer 값이 13보다 작은지에 대한 유효성 검사를 수행할 것이다. 만약 사용자가 정수 대신 문자열을 입력할 경우 사용자는 다음과 같은 메시지를 보게 될 것이다:
The value (Mark) entered in field Person Age must be a valid number.
(Person Age 필드에 입력된 값(표시)은 유효한 숫자여야 합니다.)
만약 사용자가 정수지만 13보다 작은 값을 입력할 경우 다음 메시지를 보게 될 것이다:
The minimum allowed value for Age is 13.
(Age에 허용된 최소값은 13입니다.)
다시 한번 말하지만 우리는 이러한 오류 메시지에 대한 어떠한 외부 설정(external configuration)을 제공할 필요가 없었다. 이러한 유효성 검사를 제공하는 어노테이션이 여러분의 필드에 인라인되어 개발자가 유효성 검사를 위치시키는 것과, 유효성 검사가 수행될 것을 알게되는 것, 그리고 유효성 검사에 대한 유지보수성 변경(maintenance change)을 용이하게 한다.

이 Stripes 액션에는 호출가능한 두 개의 메소드(이벤트라 불리는)도 포함되어 있는데, 이벤트는 ActionBean 클래스에서 다음과 같은 서명을 가진 메소드로서 나타난다:
public Resolution eventName
index 메소드에 @DefaultHandler가 표시되어 있음을 주목하라. 이 액션에는 여러 개의 이벤트가 있으므로 그것들 중 하나는 기본 이벤트로 지정되어 있을 필요가 있다. 만약 이러한 액션을 요청하는 URL에 이벤트가 기입되어 있지 않으면 Stripes는 @DefaultHandler 어노테이션이 지정된 이벤트를 찾아 그것을 실행시킬 것이다.



이제 Hello World 예제에 뷰 로직을 추가해 보자. 기본적으로 Stripes는 JSP를 표준 뷰 기술로 지원하기는 하나 FreeMarker와 같은 다른 뷰 기술을 사용할 수도 있다. 여기에는 Stripes 태그 라이브러리를 제외하고는 사실 새로이 배워야 할 것이 없다. Hello.jsp라 불리는 첫 번째 뷰는 사용자가 이름을 입력하고 전송할 수 있도록 해줄 것이다.
<%@ taglib prefix="stripes" 
          uri="http://stripes.sourceforge.net/stripes.tld" %>

  
    Stripes Hello World
  
  
    
    
    Say hello to: 
First name:
Age:
이 JSP는 읽고 유지보수 하기에도 간단하다. 폼과 입력 필드에 사용된 Stripes 태그들은 HTML에 그것과 대응되는 태그들과 매우 유사하다. Stripes:form 태그는 beanclass라 불리는 속성을 포함하고 있는데 이것은 앞서 정의하였던 컨트롤러 클래스의 전체 경로를 포함한 이름이다. 우리는 beanclass 속성 대신 stripes:form 태그의 액션 속성을 사용할 수도 있었다. 그러나 beanclass 속성은 여러분이 Stripes 액션에 대한 리팩터링을 수행할 필요가 있을 경우 리팩터링을 더 쉽게 만들어 준다. 아래에는 액션 속성을 사용할 경우 stripes:form 태그를 어떻게 지정해야 하는지 나타나 있다:

stripes:input 태그들 중 하나는 입력 필드의 값을 컨트롤러 내의 Person 객체의 firstName 필드에 저장하는데 사용될 person.firstName의 name 속성을 지정한다. 마지막으로 stripes:submit 태그는 Stripes HelloWorldAction 클래스가 hello 이벤트를 사용하도록 지시하는데 사용될 name 속성을 지정한다.

이제 이름과 성의 값을 HelloWorldAction에 전송하도록 설정할 것이다. 우리가 해야할 일은 오직 별도의 뷰에 그것을 출력하도록 하는 것이다.
<%@ taglib prefix="stripes" 
       uri="http://stripes.sourceforge.net/stripes.tld" %>

  
    
    

Hello ${actionBean.person.firstName} your age is ${actionBean.person.age}

Say Hello Again

이 JSP는 action에 직접 연결된 레퍼런스에 접근하여 사람의 이름과 성 필드의 내용을 출력할 것이다. 이러한 목적으로 Stripes는 자동적으로 actionBean 요청 속성(request attribute)을 포함하는데 그것은 JSTL로 접근가능하다. 마지막으로 stripes:link 태그를 사용하여 HelloWorldAction 클래스로 되돌아가는 링크를 하나 만들어서 다른 이름을 입력하여 출력하게 할 수 있도록 하였다. 뿐만 아니라 이러한 방식으로 stripes:link가 명시적으로 index 이벤트를 참조하도록 만들 수도 있다:
Say Hello Again
index 메소드에 @DefaultHandler 어노테이션을 지정하였으므로 Stripes는 이벤트 속성 없이도 어떤 메소드를 실행할지 알게 된다.
TAG :
댓글 입력
자료실

최근 본 책0