Framework/Another Lore2009. 3. 20. 14:06

AL의 간단한 코드 Samle을 보면 아래와 같다. 공지사항 Application을 만든다고 생각해보자. 웹이어도 상관없고 웹이 아니어도 상관없다. 가장 첫번째 해야 할일은 모델을 만드는 일이다. 이전에는 ERD를 그리고 - 종이에 그리든 마음속으로 그리든 - ERD에 맞춰 DB 테이블을 설계한다.

AL은 DB 테이블을 만들지 않고 오직 코드로 모델을 만든다. 기존의 OR-Mapping 툴과 달리 이미 존재하는 테이블과 매핑과정을 설정하는게 아니라 아예 테이블을 만들지 않는다. 실제로 구현되는 물리적 과정은 철저히 숨겨져 있다.


package com.bleujin.lore.impl.board.init;

import 생략

public class BoardInitializer implements INotice, IBoard, IComment{

  
  private AnotherLore lore ;
  private IGlobalPersistence globalPersistence ;
  public AnotherLore init() throws RepositoryException{
    lore = new AnotherLore() ;
    
    UserSession session = lore.login(new TestCredential("admin")"localhost";
    globalPersistence = session.getWorkspace().getGlobalPersistence() ;

    NodeType objectType = globalPersistence.createNodeType(NodeType.NO_SUPERTYPE, "_object"new PropertyDefinition[0]) ;
    Node root = session.createNode(Node.NO_PARENT, objectType, "/";
    Node anonymousRoot = session.createNode(root, objectType, "anonymous";

    
    // notice
    NodeType noticeBoardType = globalPersistence.createNodeType(objectType, "notice_board"new PropertyDefinition[0]) ;


    PropertyDefinition[] noticeProperties = new PropertyDefinition[]{
          createProperty(BOARDNO, PropertyType.LONG)
          createProperty(SUBJECT, PropertyType.STRING)
          createProperty(REGUSERID, PropertyType.STRING)
          createProperty(REGDATE, PropertyType.DATE)
          createProperty(CONTENT, PropertyType.STRING
        ;
    NodeType noticeType = globalPersistence.createNodeType(objectType, "notice", noticeProperties;

    noticeType.addPropertyConstraint(BOARDNO, new NumberConstraint()) ;
    noticeType.addPropertyConstraint(SUBJECT, new AndConstraint(new RequireConstraint()new UnderByteLengthConstraint(200))) ;
    noticeType.addPropertyConstraint(REGUSERID, new RequireConstraint()) ;
    noticeType.addPropertyConstraint(REGDATE, new RequireConstraint()) ;

    noticeBoardType.setMemberType(noticeType;

    
    Node noticeBoardRootNode = session.createNode(root, noticeBoardType, "noticeboard";
    
    session.save() ;
    session.logout() ;
    return lore ;
  }
  
  private PropertyDefinition createProperty(String pid, int requireTypethrows RepositoryException {
      return globalPersistence.createPropertyDefinition(pid, requireType);
    }

}



공지사항 그자체도 컨텐트 - 즉 Node - 이고 공지사항에 올려지는 글들도 컨텐트 이기 때문에 2가지의 타입이 필요하다.

globalPersistence.createNodeType(objectType, "notice_board"new PropertyDefinition[0]) ;
먼저 noticeBoardType(공지사항게시판타입)을 만든다.
공지사항은 특별한 속성을 가지지 않아도 상관없어서 속성타입을 정의하지 않았다. 만약 공지사항마다 인삿말이 필요하다거나 StyleSheet를 정의해야 한다면 공지사항도 속성타입을 가질 수 있지만 위 예제는 가장 간단한 예제이므로 생략한다.

noticeProperties = new PropertyDefinition[]{.... }
속성타입을 만든다. Table의 Column과 비슷한 것이라고 생각하면 된다. 5개의 속성타입을 정의했고

noticeType = globalPersistence.createNodeType(objectType, "notice", noticeProperties;
5가지 속성을 가진 공지사항글타입을 만든다. DB에 비교하자면 테이블 그 자체이다.

noticeType.addPropertyConstraint(BOARDNO, new NumberConstraint()) ;
공지사항글타입에 Constraint를 정의한다.

noticeBoardType.setMemberType(noticeType;
공지시항타입의 멤버타입으로 공지사항글타입을 지정했다. memberType은 이미 정의된 LinkType중 하나로 공지사항타입은 공지사항글타입이나 하위 타입만을 멤버로 가질수 있게 된다.

위 코드는 타입을 만드는 과정이므로 실제로는 수명중 단 한번만 실행된다. 재시작해도 재실행되지 않아야 한다.


실제 글을 등록하고 보는 과정은 간단하다. 

private void listPage(HttpServletRequest request, NoticeForm formthrows RepositoryException {
    UserSession session = getUserSession() ;
    Node noticeBoard = session.getNode("/noticeboard";
    request.setAttribute(LIST, noticeBoard.getChildNode()) ;
    
    form.setRowCount((int)noticeBoard.getChildNode().getSize()) ;
    }
<List>

 private void addNotice(HttpServletRequest request, NoticeForm formthrows RepositoryException{
    UserSession session = getUserSession() ;
    Node noticeBoard = session.getNode("/noticeboard";
    NodeType noticeType = getNodeType("notice");

    Node article = session.createNode(noticeBoard, noticeType, form.getSubject()) ;
    article.setProperty(BOARDNO, noticeBoard.getChildNode().getSize()+1;
    article.setProperty(SUBJECT, form.getSubject()) ;
    article.setProperty(REGUSERID, session.getUserId()) ;
    Calendar current = Calendar.getInstance() ;
    current.setTime(new Date()) ;
    article.setProperty(REGDATE, current;
    article.setProperty(CONTENT, form.getContent()) ;
    
    session.save() ;
    }

<Add>

private void delNotice(HttpServletRequest request, NoticeForm formthrows RepositoryException {
    Node node = getUserSession().getNodeByUUID(form.getUUID());
      node.delNode() ;
      getUserSession().save() ;
    }
<Del>

private void editNotice(HttpServletRequest request, NoticeForm formthrows RepositoryException {
    Node node = getUserSession().getNodeByUUID(form.getUUID());
    node.setProperty(SUBJECT, form.getSubject()) ;
    node.setProperty(CONTENT, form.getContent()) ;

    getUserSession().save() ;
    }

<Edit>

private 
void viewPage(HttpServletRequest request, NoticeForm formthrows IOException, RepositoryException {
    Node node = getUserSession().getNodeByUUID(form.getUUID());
    node.getBean().increaseViewCount() ;
    getUserSession().save() ;
    
    NodeHandler handler = new NodeHandler() ;
    handler.saveFormBean(node, form;
    }

<View>


AL은 EJB3나 DB매핑류 프레임워크가 별로여서 개인적인 대안으로서의 프레임워크이다. 다만 같은 문제를 고민하기보단 문제의 영역을 바꿔버렸다. AL은 그밖에도 DB에서 하지말아야 하는 모델링을 하는등 대부분의 격언을 대놓고 반대로 하고있는 Extreme 프레임워크이다. 프로그램의 변증법에서 말했듯이 이게 하나의 과정일지 결과물이 될지는 아직 알 수 없다.


'Framework > Another Lore' 카테고리의 다른 글

와~~~  (0) 2009.04.09
AL - Extreme  (0) 2009.04.04
AL - Abstraction & Model  (0) 2009.03.13
AL - 배경  (0) 2009.03.07
Framework - AL(개요)  (0) 2009.03.06
Posted by bleujin