SlideShare une entreprise Scribd logo
1  sur  82
메타웍스3 교육자료


기초부터 활용까지
교육커리큘럼
 구분         시간                 프로그램              비고
                          워크숍 장소 집결 및 회의준비
            ~13:30
                            (장비세팅 및 물품구매)
          14:00~15:00   상호인사 및 메타웍스3 프레임워크 소개   장진영 대표
          15:00~15:10            휴식
 3월 9일
                                                김승현 부장
 (1일차)
          15:10~18:00         설치 및 기초실습         조진원 과장
                                                홍세진 과장
          18:30~20:00            석식

            20:30~          자유실습 및 토론의 장        개별 실습

            ~09:50             기상 및 조식

                            어드밴스드 메타웍스3:
                                                장진영 대표
          10:00~11:00      샘플어플리케이션 소개 및
                                                조진원 과장
 3월 10일                       개발과정 설명
 (2일차)
          11:00~12:00     각자 실습-예제 어플리케이션       개별 실습

          12:00~13:00            중식

          13:00~14:00          정리 및 해산




                                                         Page   2
AGENDA


  - 메타웍스3 기반 프레임워크의 이해

  - 메타웍스3를 이용한 개발 실전

  - 메타웍스3 기반의 프로세스 코디
    구현 방안 공유


                         Page   3
I         메타웍스3 개요
    메타웍스3 프레임워크 소개
    메타웍스3 프레임워크 특장점
    메타웍스3 프로젝트 설치 및 실행
    메타웍스3 프레임워크의 주요 파일들




                          Page   4
표준웹기반 생
산성 극대화를
위한 프레임워
크–
메타웍스3
유엔진 오픈소스 BPM 프로젝트
장진영
jyjang@uengine.org
Concurrent Web-based Applications :
어떤 도구를 사용할 것인가?

                       고난이 요구사항

                  •   순수웹
                  •   페이지 비전환
                  •   Lazy Loading
                  •   키/마우스 바인딩
                  •   모바일 동시지원
                  •   NIO기반 채팅       시장의 요구
                                       수준

        품질                                     생산성
                                     •   서버/클라이언트 개발
        •   트랜잭셔널                        자 그리고 디자이너 역
        •   요소간 간섭최소화                    할구분어려워 –
        •   일관성 있는 사용자                   CSS/JS/Java/AJAX
            경험과 예측성                  •   다양한 언어를 넘나드
        •   UI기반의 테스트                    는 과정의 커뮤니케이
            자동화                          션 비용
                                     •   순수자바개발자만
                                         있다.
UI 프레임워크 – 메타웍스3
                   기존 프로그래밍 모델 (이벤트 드리븐)
                   과 약간 차이가 있는 “선언형 프로그
                   래밍 모델”
                   – MDA, 메타데이터와 리플랙션을 계
                   승함

                   1. 모델 중심 아키텍처의 장점은 적은 코드량과
                      도메인 중심의 비즈니스 목적 중심의 코드로
                      품질과 생산성을 동시에 높힘
                   2. 메타웍스3의 독특한 POJO선언은 웹의 입력
                      값과 버튼을 객체의 „필드‟와 „메서드‟로 기본
                      매핑하여 „모델 기반 기본 앱‟을 자동으로 구
                      현해주어 „선-프로토타이핑‟ 이 가능하다.
                   3. 이후 객체에 특화된 디자인과 인터랙션을 공
                      통모듈 디자이너와 개발자가 분산되어 작업
                      할수 있으며, 그 사이에도 도메인 개발자는
                      작업을 지속할 수 있다.
                   4. 컴포넌트가 쌓이면 쌓일수록 개발의 추상성
                      과 생산성은 배가된다.
선언형 방식이 뭔가요?
  선언형 프로그래밍 모델                                                 일반 이벤트-드리븐 모델
                                                     #Client
#Only in Server / only in Domain-class               document.addEventListener(new function(e){

@AutowiredFromClient                                 If( when==MetaworksContext.WHEN_VIEW,
public FormDefinition formDefinition;                     && where=="in-container” e.keyCode==”delete",
                                                          $.ajax(“/server/FormEditor”, …..);
@ServiceMethod(                                      }
 when=MetaworksContext.WHEN_VIEW,                    );
 where="in-container",
 keyBinding=”delete",                                … context menu 등록 코드 생략 ….
 inContextMenu=true)                                 #Server
                                                     public FormDefinition remove(Request req) {
public FormDefinition remove() {
           formDefinition.formFields.remove(this);
                                                          …. Request에서 formDefinition 을
           return formDefinition;
                                                     unmarshalling 하는 코드 생략 …..
}
                                                                formDefinition.formFields.remove(this);
                                                                return formDefinition;
                                                     }
   • 짧은 코드량
   • 의미중심                                                  •   구현 중심의 긴 코드
   • 해석 방식의 전환 용이                                          •   구현중심의 코드로 해석이 어려움
   e.g. 스프링 어노테이션 프레임워크                                    •   양산된 코드는 일괄전환 어려움
메타웍스 기반 개발 과정
Steps:
1. 무엇이 ‘객체’인지 파악하기
2. 객체를 잘 (응집도 높게) 모델링하기
3. 객체에 화장시키기
4. 객체들을 데리고 앱을 만들기
Step 1. 분석
무엇이 “객체”인가?
그리고..무엇이 “컨텍스트”인가?
1. Recognizing Objects in facebook
- Login.java




        UserId
        Password

              Login



         Login.java

   userId property        Password property   Login method   12
1. Recognizing Objects in facebook
- Main.java




   Menu object          Selection object   Contents object   Person object
Login.java                                 Main.java

UserId
Password
              return       Menu.java             Content.java
              new Main()
      Login
                                            return
                             Selection.java new AContent() AContent.java




                                          return
                                          new BContent() Bcontent.java
1. Recognizing Objects in facebook
1.1. Person objects in different ‘Context’




   Where: NORMAL                Where: MINIMISED   Where: MEDIUM
Step 2. 모델링
객체와 화면요소를 최대한
단순하게 매핑하라!
Login.java                                           Main.java

UserId
Password
                      return       Menu.java             Content.java
                      new Main()
      Login

                                     Selection.java




           login() 이 실행되면 Main
                을 리턴하므로
             Main을 화면에 그려라!
Login.java                                 Main.java

UserId
Password
              return       Menu.java             Content.java
              new Main()
      Login
                                            return
                             Selection.java new AContent() AContent.java




                                          return
                                          new BContent() Bcontent.java




                                       (화면에 여러 객체가 이미 존재하
                                       는 경우) 리턴된 객체는 자신이 가
                                        장 부합되는 응집력을 가진 화면
                                            요소에 가서 그려짐
21
모델링이 곧 구현!

 # 객체의 응집도를 따라 서버에서 리턴된 객체가 표시될 위치를 잡는다
  타겟을 정의하지 않아도 위치를 찾기 때문에 UI 컨트롤 코드가 배제됨


 # 도메인 객체 이외의 UI와 관련된 컨트롤은 가능한 대표 모델 몇가지만을 사용
 하고 가능한 어노테이션에 옵션을 준다 (e.g. Face)
  일괄적 UI 표준을 적용하기 용이함


 # 데이터를 접근하는 ‘databaseMe()’를 통해 데이터와 웹입력 값의 비교 및 처리
 를 추상화한다
  데이터 접근에 대한 구체적인 코드가 줄어들고 모델레벨이 유지됨
#퀴즈

 # 메인화면에서 로그인 화면으로 이동하는 “로그아웃”은 어떻게 하면 될까요?
Step 3. UX 일관성기반 디자인
디자이너는 매핑된 모델별로 디자인 작업을,

그리고 자바스크립트 개발자는 유저 인터랙션이
높은 것들을

최대한 “컴포넌트” 단위로 작성한다.

* 요구사항 별로 작성하지 않고, 요구사항을
수집하여 공통사항을 일반화 하여 컴포넌트
단위로 UI와, 스크립트를 ‘한번만’ 만든다.
UI 프레임워크 – 메타웍스3
메타웍스3 컴포넌트 래핑 예시 – 구글 챠트 컴포넌트




  자바 = 모델           HTML = Face   자바스크립트 = FaceHelper
UI 프레임워크 – 메타웍스3
메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트




  자바 = 모델
UI 프레임워크 – 메타웍스3
메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트




 HTML = Face
UI 프레임워크 – 메타웍스3
메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트




 자바스크립트 = FaceHelper
Step 4. 추상성 높은 앱 개발
1. 자바스크립트와 CSS, 심지어 JSP, 서블릿도
   모르는 일반 자바만을 다루는 개발자로 구성된 팀

1. 적당한 도메인 지식을 갖고 있고,

3. 고객과 협의를 할 수 있는 커뮤니케이션 스킬을
가졌다고 가정.
UI 프레임워크 – 메타웍스3
컴포넌트 조합 – 화이트박스 사용




                자바 개발자는 UI요소들을
                자바의 관점으로만 통합하
                여 불러쓴다
32
메타웍스 동작 메커니즘:
 – 흩어진 메타데이터를 자동으로 관리하는 메타웍스3


        General Approach:                                                  Using Metaworks3:
Spring MVC, JSON, jQuery, Hibernate

                      meta
                      data                                                            Controlle
                                                                                         r
                         Domain class
        Controlle        (java version)
           r
                                                                  View                                      DAO


                         You have to
         meta         Synchronize the gap       meta
                                                                  Metaworks                            Metaworks
View     data                         DAO       data
                                                             Synchronizes the Proxy
                                                                                        meta
                                                                                                  Synchronizes the Proxy
                                                                                        data
                                            Domain class
       Domain class                                                                   Domain
                                            (Hibernate ver
       (JS version)
                                                sion)                                  Class
                                                                                      (Java)
“메타웍스3 우산”


     < 선언형 프로그래밍 모델과 추상성 극대화를 통한 생산성>
     • 프로그래밍 모델 추상화
        • 자바-자바스크립트 간 통신 추상화
        • 자바-자바스크립트 간 메타데이터 자동 동기화
        • 자바스크립트 인터랙션 (버튼, 키보드/마우스) 추상화
        • 네비게이션 추상화
        • 롱-폴링 기반 콜백 추상화
     • 데이터베이스 접근 추상화
        • JPA어노테이션 기반 ORMapping
        • 데이터베이스 캐시 / 동기화
        • 트랜잭션 자동화 (스프링없이 동작가능)

     <테스트 자동화와 품질 향상>
     • 매우 짧은 코드 – 품질에 직결
     • 설계가 곧 구현 – 모델중심의 생산성과 품질
     • 아규먼트 없는 서비스메서드 – 객체의 응집도를 유지
     • 웹 기반 테스팅 자동화
     • Guided Tour 기능 자동화                 34
Applications




www.metaworks3.org website Social CMS
Applications




ProcessCodi Cloud IDE
Applications




ProcessCodi Enterprise 2.0 Platform
II          메타웍스3 실전
     dwr.xml에 패키지 경로 설정
     메타웍스3에서 자바 클래스 사용법
     메타웍스3의 자바 클래스에서 Annotation 사용법
     메타웍스3의 API 레퍼런스
     메타웍스3에서 EJS 템플릿 사용법




                                      Page 38
메타웍스3 프로젝트 설치 및 실행
1.   메타웍스3 프로젝트 설치

     1.   이클립스 웹 프로젝트 생성

     2.   메타웍스3 관련 jar 파일 추가 – WEB-INFlib
           [ uEngine 제공 파일들 – spring / dwr 포함 ]

     3.   설정 파일 구성
           [ applicationContext.xml, dwr.xml ]


2.   메타웍스3 프로젝트 실행

     1.   연동해서 사용할 DBMS 기동

     2.   WAS 기동 – [ ex. %CATALINA_HOME%binstartup.bat ]

     3.   웹 브라우저 : http://localhost:8080/metaworks3/index.html




                                                                 Page 39
주요 설정 파일들

          파일명                   현재 경로                           설명           비고

applicationContext.xml    WebContent/WEB-INF      스프링 프레임워크 관련 설정 및         스프링 사
                                                  DBMS 설정                   용시만 적
                                                                            용
dwr.xml                   WebContent/WEB-INF      dwr 프레임워크에서 사용될 package
                                                  경로설정

metaworks.js              WebContent/scripts/me   metaworks 동작 관련 스크립트
                          taworks

metaworks folder          WebContent              Ejs 파일 Path



metaworks3.jar            WebContent/WEB-         메타웍스3 프레임워크 관련 API
                          INF/lib

springframework * . jar   WebContent/WEB-         스프링 프레임워크 관련 API
                          INF/lib




                                                                                  Page 40
dwr.xml에 패키지 경로 설정
1. Metaworks3 작업할 Java 작업 package를 만든다.
    Ex) example.login.* package의 경우

2. Package를 Metaworks3 프로젝트에서 인식할 수 있도록 dwr.xml에 등록한다.
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
   <dwr>

   <init>
      <converter id="metaworks" class="org.metaworks.dwr.MetaworksConverter"/>
   </init>

    <allow>
     <create creator="spring" javascript="Metaworks" scope="page">
      <param name="beanName" value="MetaworksRemoteService"/>
     </create>

   <convert converter="bean" match="org.metaworks.dwr.*"/>
   <convert converter="metaworks" match="example.login.*"/>

   <convert match="java.lang.Exception" converter="exception">
    <param name="include" value="message,lineNumber"/>
   </convert>
   </allow>
   </dwr>


3. 서버를 재 시작하거나 JREBEL를 통해 Hot Deploy 되도록 한다.


                                                                                                                      Page 41
자바 클래스 선언법
1. Pure Java [ ex. Login.java ]
1단계
    package examples.login;

    public class Login {
         String userId;
              public String getUserId() {
                        return userId;
              }
              public void setUserId(String userId) {
                        this.userId = userId;
              }
         String password;
              public String getPassword() {
                        return password;
              }
              public void setPassword(String password)
         {
                        this.password = password;
              }
                                                         Page 42
    }
자바 클래스 선언법
1. Pure Java [ ex. Login.java ]
2단계
 package examples.login;

 public class Login {
       String userId;
             public String getUserId() {
                          return userId;
             }
             public void setUserId(String userId) {
                          this.userId = userId;
             }
       String password;
             public String getPassword() {
                          return password;
             }
             public void setPassword(String password) {
                          this.password = password;
             }
       @ServiceMethod(callByContent=true)
       public Main login() throws Exception{
             return 버튼클릭시 표시될 자바클래스 생성;
             // ex) return new Main();
       }
 }
                                                          Page 43
자바 클래스 선언법
2. DB 연동 Java [ ex. ILogin2.java / Login2.java ]
1단계
 package examples.login;

 import javax.persistence.Id;
 import javax.persistence.Table;

 import org.metaworks.annotation.ServiceMethod;     DB Schema
 import org.metaworks.dao.IDAO;

 @Table(name="login2")                              create table login2 (
 public interface ILogin2 extends IDAO {                        userId varchar(20) primary key,
                                                                password varchar(20)
            @Id                                     );
            public String getUserId();
            public void setUserId(String userId);

            public String getPassword();
            public void setPassword(String password);

            @ServiceMethod(callByContent=true)
            public Main login() throws Exception;
 }

                                                                                                  Page 44
자바 클래스 선언법
2. DB 연동 Java [ ex. ILogin2.java / Login2.java ]
2단계
package examples.login;
import org.metaworks.dao.Database;
public class Login2 extends Database<ILogin2> implements ILogin2{
            String userId;
                        public String getUserId() {
                                    return userId;
                        }
                        public void setUserId(String userId) {
                                    this.userId = userId;
                        }
            String password;
                        public String getPassword() {
                                    return password;
                        }
                        public void setPassword(String password) {
                                    this.password = password;
                        }
            public Main login() throws Exception{
                        if(databaseMe().getPassword().equals(getPassword()))
                                    return new Main();
                        else
                                    throw new Exception("Password is wrong. Forgot?");
            }
}                                                                                        Page 45
자바 클래스 선언법
2. DB 연동 Java [ ex. Main.java ]

3단계

package examples.login;
public class Main {
         public Main() {
                 setMessage(“login success”);
         }

      String message;
              public String getMessage() {
                      return message;
              }
              public void setMessage(String
message) {
                      this.message = message;
              }
}                                               Page 46
UI 선언법
# “Face”라고 칭하며 JSP, ASP 와 유사한 스크립트렛식을 기반하여 앞서 개발한
자바 클래스를 화면에 뿌리는 로직을 작성합니다.

#저장위치
[ 자바클래스와 동일패키지 이하 /동일 클래스명.ejs ]

# 사용 가능 표현

        expressions                       설명                       비고

Fields.필드명.here()      자바 클래스에 선언된 field와 연결하는 object

Method.메서드명.here()     자바 클래스에 선언된 method와 연결하는 object

Method.메서드명.caller()   method의 경우 해당 method 를 onclick 과 같은 event
                       에 연결하기 위해 사용
value                  fields 부터 data 추출시 사용

mw3                    Metaworks 기본 객체




                                                                        Page 47
UI 선언법 - 예시

사용자 ID:
<%=fields.userId.here()%>

패스워드:
<%=fields.password.here()%>

<%=methods.login.here()%>


                              Page 48
인터랙션 스크립트 선언법
# FaceHelper 라고 칭하며, ejs파일과 동일 위치에 OOO.ejs.js 로 선언해줌

1. 생성자
var 패키지명.클래스명 = function(objectId, className){
  this.objectId = objectId;
  this.className = className;

    // object : 객체의 id
    // className : 객체의 class name
}
// 패키지명은 . 대신 _ (언더바)로 표시

2. FaceHelper function 작성
패키지명.클래스명.prototype.함수명 = function(args){
}

3. FaceHelper function 사용방법(ejs에서)
mw3.getFaceHelper(„<%=objectId%>‟).함수명();

4. FaceHelper 값 맵핑
패키지명.클래스명.prototype.setValue = function(args){
 var object = mw3.getObject(this.objectId);

    object.필드 = 값;
}

5. 서버 응답 Metaworks 객체 얻는 방법
mw3.getObject(objectId); 또는 mw3.objects[objectId];



                                                       Page 49
인터랙션 스크립트 선언법
#java/lang/Boolean.ejs




#java/lang/Boolean.ejs.js




                            Page 50
Annotation 레퍼런스
1. Server Interaction 관련 Annotation
     Annotation                              설명              비고
@ServiceMethod         실제 화면에서의 동작과 관련된 메서드를 선언하기 위해 사용

@AutowiredFromClient   객체를 Client 에서 Server 로 주입받기 위해 사용   public 필수


@AutowiredToClient     Server 에서 Client 로 주입하기 위해서 사용




                                                                   Page 51
Annotation 레퍼런스
@ServiceMethod
- 실제 화면에서의 동작과 관련된 메서드를 선언하기 위해 사용하는 annotation
1. callByContent
: ServiceMethod 실행 시 화면(client) 에 존재하는 해당 객체의 모든 필드 객체를 받아온다.

2. except
: callByContent 속성 사용 시 너무 많은 필드 객체를 받아오면 성능에 대한 이슈가 발생하므로 except 선언된 field 는 제외하고 받아온다.
(일반적으로 받아오길 원하는 필드 객체가 받지 않을 필드 객체 보다 많을 시에 사용)

3. payload
: callByContent 를 사용하지 않으면 @Id annotation 을 사용한 필드 객체 외에는 받아오지 않는데 추가로 필드 객체를 받아오기 위해서 사용된다.
(일반적으로 받아오길 원하는 필드 객체가 받지 않을 필드 객체 보다 적을 시에 사용)

4. target
: ServiceMethod 를 통해 반환된 객체를 화면에 표시하는 유형을 정의한다. 기본은 TARGET_AUTO 로 Metaworks 가 알아서 화면에 표시한다.

5. when, where, how
: MetaworksContext 값에 해당되는 값이 존재 할때 ejs templete 에 표시하기 위해 사용한다.

6. keyBinding
: ServiceMethod 에 key event 를 할당하여 해당 화면(client) 에서 keyBinding 속성에 할당된 key event 발생 시 해당 ServiceMethod 를 호출한다.

7. mouseBinding
: ServiceMethod 에 mouse event 를 할당하여 해당 ServiceMethod(button) 에서 mouseBinding 에 할당된 mouse event 발생 시 해당
ServiceMethod 를 호출한다.

8. inContextMenu
: inContextMenu 속성을 true 로 설정하면 해당 ServiceMethod 는 context menu 형식으로 표현한다. (일반적으로 mouse event 혼합하여 적용)




                                                                                                                 Page 52
Annotation 레퍼런스
@AutowiredFromClient
- 화면(client) 에 존재하는 객체를 server 로 받아오기 위한 annotation 이다.
 public class FormField {
   @AutowiredFromClient
   FormDefinition formDefinition;

     String fieldName;
       public String getFieldName() { return fieldName; }
       public void setFieldName(String fieldName) { this.fieldName = fieldName; }

     String type;
       public String getType() { return type; }
       public void setType(String type) { this.type = type; }

     public FormDefinition save() throws Exception{
     }

     public FormDefinition add() throws Exception{
     }

     public FormDefinition remove() throws Exception{
     }
 }

∙ FormField 는 FormDefinition 의 ArrayList 객체인데 FormField 에서 FormDefinition 을 얻기위해 @AutowiredFromClient 를 사용하여 처리한다.




                                                                                                                     Page 53
Annotation 레퍼런스
@AutowiredToClient
- client 에 존재하는 객체를 server 로 받아오기 위한 annotation 이다.
public class Post {
  String postId;
     @Hidden
     @AutowiredToClient
     public String getPostId() {
        return postId;
     }
     public void setPostId(String postId) {
        this.postId = postId;
     }

    String content;
      public String getContent() {
         return content;
      }
      public void setContent(String content) {
         this.content = content;
      }
}

∙ Hidden 또는 Available 그리고 ejs 에서 fields.postId.here() 를 사용하지 않아 해당 필드 객체가 화면에 표시되지 않는 상황에 해당 필드 객체를 서버로
받아오기 위해 강제로 Client 주입하는 annotation




                                                                                                     Page 54
Annotation 레퍼런스
2. UI Control 관련 Annotation
     Annotation                              설명                            비고
@Face                  객체의 ejs 연동을 위한 필요한 정보를 설정하기 위해 사용

@Available             옵션에 따라 해당 객체를 Client에 표시하기 위해 사용

@NonEditable           MetaworksContext 가 edit 상태일 때에도 view 상태로 표시할 때 사용
                       (수정 불가하게)
@Hidden                객체를 Client에 표시하지 않기 위해 사용




                                                                            Page 55
Annotation 레퍼런스
@Face
- ejs templete 연관된 annotation
1. ejsPath
 : 기본적으로 같은 패키지명.클래스명에 존재하는 ejs templete 이나 없을경우 ObjectFace.ejs 를 사용하지만 ejsPath 속성을 지정할 경우 해당 ejs
templete 을 사용한다

2. displayName
: ejs templete 에서 표시할 객체의 이름을 설정하여 ejs templete 에서 사용한다.

3. options, values
: ejs templete 에 option 에 해당하는 value 설정하여 ejs templete 의 사용성을 확장한다.


@Face(ejsPath=“genericfaces/Window.ejs”, displayName=“연락처”, options={“width”, “height”}, values={400, 900})
public class ContactWindow{
     IUser user;
     public IUser getUser(){
        return this.user.
     }

    public void setUser(IUser user){
      this.user = user;
    }
}




                                                                                                              Page 56
Annotation 레퍼런스
@Available
- ejs templete 에 객체를 특정한 상황에 표시하기 위한 annotation
1. when, where, how
: MetaworksContext 값에 해당되는 값이 존재 할때 ejs templete 에 표시하기 위해 사용한다.

public class Wizard implements ContextAware {
  MetaworksContext metaworksContext;
     public MetaworksContext getMetaworksContext() { return metaworksContext; }
     public void setMetaworksContext(MetaworksContext metaworksContext) { this.metaworksContext = metaworksContext; }

    String packageName;
      @Available(when={"edit", "view"})
      public String getPackageName() { return packageName; }
      public void setPackageName(String packageName) { this.packageName = packageName; }

    String className;
      @Available(when={"step1", "view"})
      public String getClassName() { return className; }
      public void setClassName(String className) { this.className = className; }

    @ServiceMethod
    @Available(when="edit")
    public void next1() { getMetaworksContext().setWhen("step1"); }

    @ServiceMethod
    @Available(when={"step1", "view"})
    public void save() { getMetaworksContext().setWhen("view"); }
}




                                                                                                                        Page 57
Annotation 레퍼런스
@NonEditable
- ejs templete 에서 MetaworksContext 가 edit mode 일때도 view 상태로 표기
public class Post {
  String postId;
     public String getPostId() {
        return postId;
     }
     public void setPostId(String postId) {
        this.postId = postId;
     }

    String content;
      public String getContent() {
         return content;
      }
      public void setContent(String content) {
         this.content = content;
      }

    IUser author;
      @NonEditable
      public IUser getAuthor() {
        return author;
      }
      public void setAuthor(IUser author) {
        this.author = author;
      }
}

∙ author(글쓴이) 는 사용자에게 입력 받지 않는 부분이므로 입력하지 못하게 @NonEditable annotation 처리



                                                                           Page 58
Annotation 레퍼런스
@Hidden
- ejs templete 에서 표시하지 않을 Object 에 사용하는 annotation
public class Post {
  String postId;
     @Hidden
     public String getPostId() {
        return postId;
     }
     public void setPostId(String postId) {
        this.postId = postId;
     }

    String content;
      public String getContent() {
         return content;
      }
      public void setContent(String content) {
         this.content = content;
      }

    IUser author;
      public IUser getAuthor() {
        return author;
      }
      public void setAuthor(IUser author) {
        this.author = author;
      }
}

∙ postId 는 사용자에게 보여지지 않는 부분이므로 입력하지 못하게 @Hidden annotation 처리



                                                                Page 59
Annotation 레퍼런스
3. Database 관련 Annotation
      Annotation                            설명                 비고
@Table               DAO 객체에 DB Table 의 맵핑을 위해 사용

@Id                  DB Table의 primary key와 맵핑을 위해 사용

@NonSavable          transient 상태로 지정하기 위해 사용

@ORMapping           Database 의 Table 필드와 객체의 필드를 맵핑하기 위해 사용




                                                                Page 60
Annotation 레퍼런스
@Table
- DAO Object 가 DAO 명과 다른 이름을 사용할 시에 Table 명과의 맵핑을 위해 사용
1. name
: DAO Object 와 맵핑될 Database 의 Table 명을 정의 한다.

@Table(name="user")
public interface ILogin extends IDAO {

    public String getUserId();
    public void setUserId(String userId);

    public String getUserName();
    public void setUserName(String userName);

    public String getPassword();
    public void setPassword(String password);

}

∙ DAO 명(ClassName)은 Login 이지만 실제로 맵핑될 Table 은 user 라는 이름을 가진 Table 이므로 @Table annotation 처리




                                                                                              Page 61
Annotation 레퍼런스
@Id
- DAO Object 를 핸드링 하기 위한 key value 으로 unique 한 value 가진 field 지정
public interface ILogin extends IDAO {

    @Id
    public String getUserId();
    public void setUserId(String userId);

    public String getUserName();
    public void setUserName(String userName);

    public String getPassword();
    public void setPassword(String password);

}

∙ 사용자 Table 에서는 userId 가 조회 및 삭제, 수정이 이루어지므로 userId 에 @Id annotation 을 사용하여 DAO 를 핸들링 한다.




                                                                                            Page 62
Annotation 레퍼런스
@NonSavable
- DAO Object 를 에서 Database 에 저장 및 수정 시 사용하지 않을 field 에 사용
public interface ILogin extends IDAO {

    public String getUserId();
    public void setUserId(String userId);

    public String getUserName();
    public void setUserName(String userName);

    public String getPassword();
    public void setPassword(String password);

    @NonSavable
    public String getSSN();
    public void setSSN(String ssn);

}

∙ ssn(주민번호) 필드는 본인확인을 위해서만 필요하고 실제 Database 에 저장하지 않을 것이므로 @NonSavable annotation 사용하여 처리




                                                                                            Page 63
Annotation 레퍼런스
@ORMapping
- DAO Object 를 field 와 Database Table column 과의 맵핑을 처리하기 위해 사용
 public interface User extends IDAO {
   @ORMapping(databaseFields={"empNo"}, objectFields={"userId“})
   public String getUserId();
   public void setUserId(String userId);

     @ORMapping(databaseFields={"empName"}, objectFields={"userId“})
     public String getUserName();
     public void setUserName(String userName);

     public String getPassword();
     public void setPassword(String password);
 }

∙ Table 의 column 명과 DAO Object 의 field 명이 서로 달라 맵핑이 필요한 경우에 @ORMapping annotation 을 사용한다


 public interface IPost extends IDAO {
   public String getPostId();
   public void setPostId(String postId);

     public String getContent();
     public void setContent(String content);

     @ORMapping(databaseFields={“authorId"}, objectFields=“userId")
     public IUser getAuthor();
     public void setAuthor(IUser author);
 }

∙ 또한 Table Post 의 authorId column 을 Iuser 의 userId 필드와 Object 의 맵핑에서도 사용된다.


                                                                                           Page 64
DB접근 API 레퍼런스
org.metaworks.dao.Database

               메서드                          설명                           비고
createDataBaseMe()      DAO 객체에 입력된 정보로 Database 에 입력 후 입력된
                        DAO 객체를 return
databaseMe()            DAO 객체에 Annotation @Id 로 설정된 Field로 Database 를
                        검색하여 결과를 DAO 객체로 return
syncToDAtabaseMe()      DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는
                        Database 를 입력된 정보로 수정 후 DAO 객체를 return
deleteDatabaseMe()      DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는
                        Database 를 삭제
sql(Class, String)      쿼리를 직접 호출하여 결과를 특정 Class 타입으로 맵핑하
                        여 return
sql(String)             쿼리를 직접 호출하여 결과를 return




                                                                              Page 65
개발 관련 FAQ
1. 서버 관련 FAQ - 1

질문) 필드명과 메서드명을 동일하게 작성했더니 실행이 되지 않습니다.
int indent = 0;
@ServiceMethod
public void indent(){
   indent += 10;
}


답변)
서비스 메서드와 필드명이 동일한 경우 메타웍스3에서는 정상적으로 필드와 메서
드를 구분하지 못해 오류를 발생시킵니다. 위의 코드는 다음과 같이 서로 다른 이
름으로 사용하세요.
int indentDepth = 0;
@ServiceMethod
public void indent(){
   indentDepth += 10;
}



                                          Page 66
개발 관련 FAQ
1. 서버 관련 FAQ - 2

질문) 다음과 같이 서비스 메서드가 매개변수를 가질 수 있나요?
@ServiceMethod
public void indent(int x){
  indentDepth += x;
}


답변)
메타웍스3에서는 아키텍처 상에서 서비스 메서드를 호출할 때에는 매개변수를 전
달할 수 없도록 하여 응집도 높은 객체설계를 유도합니다. 이는 개발 생산성과 품
질에 직결됩니다. 만약 특정 값을 사용하고자 할 경우에는 아래 예시처럼 멤버 필
드를 선언하거나 @AutowiredFromClient를 사용하세요.
int getX() { … }
void setX(int x) { … }

@ServiceMethod
public void indent(){
  indentDepth += getX();
}
                                          Page 67
개발 관련 FAQ
1. 서버 관련 FAQ - 3

질문) 다음과 같이 코드를 하였는데 화면이 멈추어 버립니다.
class Node {
           Node[] child;
}


답변)
메타웍스3에서는 자신과 동일한 객체를 직접 가지면 재귀호출이 발생하게 됩니다.
따라서 자신과 동일한 객체를 소유하려면 ArrayList와 같은 Collection 등을 이용하
여 우회적으로 사용하여야 합니다.
class Node {
           ArrayList<Node> child;
}




                                                   Page 68
개발 관련 FAQ
1. 서버 관련 FAQ - 4

질문) 다음과 같이 서버에서 Annotation을 사용하여 Client 객체를 얻으려고 하는
데 정상동작 하지 않습니다.
class MainPage {
           @AutowiredFromClient
           ClientSession session;
}


답변)
메타웍스3에서는 클라이언트를 가져오는 객체에 대해서는 public 접근제한자에
국한해서 지원합니다.
class MainPage {
           @AutowiredFromClient
           public ClientSession session;
}




                                                  Page 69
개발 관련 FAQ
1. 서버 관련 FAQ - 5

질문) ServiceMethod Annotation을 사용했음에도 불구하고 has no method
„myMethod' 라는 오류가 발생합니다.
class MainPage implements IMainPage {
           @ServiceMethod
           public void myMethod() { … }
}


답변)
메타웍스3에서는 인터페이스를 상속하는 클래스에 대해서는 해당 인터페이스 메
서드를 주 참조 클래스로 인식합니다. 따라서 구현되는 서비스 메서드의 원형을
인터페이스에서도 넣어 주어야 합니다.
Interface IMainPage {
            @ServiceMethod
            public void myMethod();
}
class MainPage implements IMainPage{
            public void myMethod() { … }
}
                                                          Page 70
개발 관련 FAQ
1. 서버 관련 FAQ - 6

질문) 자바 클래스를 정상적으로 생성했음에도 불구하고 No Converter for
„yourClass‟ 라는 오류가 발생합니다.
package my.one.two;
class yourClass { … }


답변)
메타웍스3에서는 사용하려는 패키지에 대해서는 dwr.xml 파일에 선언해 주어야
합니다. 이는 화면에서 참조하는 클래스를 인식하기 위함입니다.
dwr.xml

<convert converter="metaworks" match=“my.one.two.*"/>




                                                        Page 71
개발 관련 FAQ
1. 서버 관련 FAQ - 7

질문) ORMapping Annotation이 인식되지 않는것 같습니다.
@Table(name=“Login”)
interface ILogin extends IDAO {
            @Id
            @ORMapping(databaseFields={“id”}, objectFields={“num”})
            public int getNum();
            ….
            @ORMapping(databaseFields={“name”}, objectFields={“name”})
            public String getName();
            ….
}


답변)
ORMapping은 DB Table의 필드명과 자바 클래스의 필드명이 다를 경우에 인식이
됩니다. 따라서 동일한 이름으로 되어 있을 경우에는 ORMapping을 사용할 필요
가 없습니다. 만약 사용하게 되면 어떤 공간을 저장 영역으로 써야 할 지에 대한 혼
돈이 발생하게 됩니다.


                                                                         Page 72
개발 관련 FAQ
2. 클라이언트 관련 FAQ - 1

질문) ejs를 만들었는데 반영이 되지 않습니다. 이유가 무엇인가요?

답변)
ejs는 자바클래스와 동일한 폴더에 작성할 수도 있고, webapps 이하의 contents
영역에 자바클래스의 패키지와 똑같은 이름의 path 상에 작성할 수도 있습니다. 그
러나 만약 두 군데 모두 ejs가 존재할 경우 자바클래스와 동일한 폴더 내에 작성된
ejs가 우선 적용됩니다.
만약 자바클래스에서 @Face Annotation을 통해 특정 ejs를 지정한 경우에는
@Face를 통해 지정된 ejs가 최우선 적용됩니다.


질문) ejs가 변경되었을 때 반영되는 속도가 느립니다. 빠르게 할 수 있나요?

답변)
ejs의 경로 URL을 웹 브라우저로 하나 열어 두고 변경 시 그곳을 refresh 시키면
ejs의 반영이 빨라 집니다.

                                                     Page 73
개발 관련 FAQ
2. 클라이언트 관련 FAQ - 2

질문) 자바클래스로 일부의 값이 전달되어 오지 않습니다. 이유가 무엇인가요?

myEjs.ejs

ID : <%= fields.userId.here() %><br/>
PW : <%= fields.password.here() %><br/>

답변)
fields 객체를 사용할 경우 동일명의 필드를 호출하게 되면 가장 마지막에 입력된
값을 가져오게 됩니다. 위 예시와 같이 fields의 id 를 잘못하여 두번 사용하게 되면
실제 자바클래스에서는 id 값으로 pw 값이 들어오게 됩니다.

myEjs.ejs

ID : <%= fields.userId.here() %><br/>
PW : <%= fields.password.here() %><br/>

                                                Page 74
개발 관련 FAQ
2. 클라이언트 관련 FAQ - 3

질문) 화면이 뜨지 않고 깨집니다. 이유가 무엇인가요?

myEjs.ejs
<!-- <%= fields.xxx.here() %> -->
Hello!!!

답변)
자바클래스와 연동된 객체를 호출하는 것은 ejs의 코멘트에 의해 실행을 막을 수
없습니다. 결론적으로 ejs Template 엔진이 계속하여 코멘트 영역에 html을 넣게
되므로 화면이 깨지게 됩니다.




                                                 Page 75
개발 관련 FAQ
3. 클라이언트 관련 스크립트 FAQ - 1

질문) ejs.js 생성자에서 자바클래스 객체를 얻어오지 못합니다. 이유는?

myEjs.ejs.js

var my_one_two_yourClass = function(objectId, className) {
  var obj = mw3.getObject(objectId);
}

답변)
ejs.js 내의 생성자와 getValue메서드 내에서는 mw3.getObject(objectId) 대신
mw3.object[objectId] 를 사용해야 합니다.

myEjs.ejs.js

var my_one_two_yourClass = function(objectId, className) {
  var obj = mw3.object[objectId];
}
                                                             Page 76
개발 관련 FAQ
3. 클라이언트 관련 스크립트 FAQ - 2

질문) ejs.js 에서 자바클래스 객체의 필드를 얻고자 합니다.
myEjs.ejs.js

var my_one_two_yourClass = function(objectId, className) {
  this.objectId = objectId;
  this.className = className;
  alert(this.userId); //  가능한가요?
}


답변)
ejs.js 내의 this는 FaceHelper 클래스입니다. 따라서 자바클래스 객체를 획득 후
해당 필드를 얻으셔야 합니다.
myEjs.ejs.js

var my_one_two_yourClass = function(objectId, className) {
  ….
  var obj = mw3.objects[this.objectId];
  alert(obj.userId);
}

                                                             Page 77
개발 관련 FAQ
3. 클라이언트 관련 스크립트 FAQ - 3

질문) 다음과 같은 오류는 왜 발생하나요?
Error marshalling data. See the logs for more details.


답변)
ejs.js 의 package_className.prototype.getValue 에서 값을 type 에 맞지 않게 넣
을때 발생하므로 type 확인 및 넘겨주는 값(value) 확인하셔야 합니다.


질문) ejs.js 파일이 반영이 되지 않습니다. 이유가 무엇인가요?

답변)
ejs.js는 기본적으로 ejs 파일이 존재해야 그 경로를 통해 ejs.js를 찾아내어 실행하
게 됩니다. 따라서 ejs 파일이 존재하는지 확인하세요.




                                                                Page 78
III          확장 메타웍스3
      메타웍스3 기반의 ProcessCodi


      PaaS를 지원하는 Cloud IDE




                              Page 79
메타웍스3 기반의 ProcessCodi




                        Page 80
PaaS를 지원하는 Cloud IDE




                       Page 81
감사합니다!




         Page 82

Contenu connexe

En vedette

객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강uEngine Solutions
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱uEngine Solutions
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석uEngine Solutions
 
9 design factors for cloud applications
9 design factors for cloud applications9 design factors for cloud applications
9 design factors for cloud applicationsuEngine Solutions
 
Front-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and PolymerFront-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and PolymeruEngine Solutions
 
성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택uEngine Solutions
 

En vedette (7)

객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
 
Hz
HzHz
Hz
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
 
9 design factors for cloud applications
9 design factors for cloud applications9 design factors for cloud applications
9 design factors for cloud applications
 
Front-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and PolymerFront-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and Polymer
 
성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택
 

Similaire à 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함

Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015uEngine Solutions
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Androidtaeinkim6
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)SangIn Choung
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장Seongchan Kang
 
파이썬 피피티 초보 테란만
파이썬 피피티 초보 테란만파이썬 피피티 초보 테란만
파이썬 피피티 초보 테란만lustrum
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료beom kyun choi
 
Lost practice : Requirement Analysis
Lost practice : Requirement AnalysisLost practice : Requirement Analysis
Lost practice : Requirement Analysisc K
 
소프트웨어설계론
소프트웨어설계론소프트웨어설계론
소프트웨어설계론JeongDong Kim
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Suhyeon Jo
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksSunuk Park
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?NAVER Engineering
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...Taekyu Lim
 
Spring Framework - Inversion of Control Container
Spring Framework - Inversion of Control ContainerSpring Framework - Inversion of Control Container
Spring Framework - Inversion of Control ContainerKyung Koo Yoon
 

Similaire à 메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함 (20)

Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015Metaworks3 Framework workbook 2015
Metaworks3 Framework workbook 2015
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Android
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장
 
파이썬 피피티 초보 테란만
파이썬 피피티 초보 테란만파이썬 피피티 초보 테란만
파이썬 피피티 초보 테란만
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
 
Lost practice : Requirement Analysis
Lost practice : Requirement AnalysisLost practice : Requirement Analysis
Lost practice : Requirement Analysis
 
소프트웨어설계론
소프트웨어설계론소프트웨어설계론
소프트웨어설계론
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworks
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
ecdevday4
ecdevday4ecdevday4
ecdevday4
 
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
 
Design patterns
Design patternsDesign patterns
Design patterns
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
 
Spring Framework - Inversion of Control Container
Spring Framework - Inversion of Control ContainerSpring Framework - Inversion of Control Container
Spring Framework - Inversion of Control Container
 

Plus de uEngine Solutions

이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기uEngine Solutions
 
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture LearninguEngine Solutions
 
Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3uEngine Solutions
 
Event storming based msa training commerce example v2
Event storming based msa training commerce example v2Event storming based msa training commerce example v2
Event storming based msa training commerce example v2uEngine Solutions
 
Event storming based msa training commerce example
Event storming based msa training commerce exampleEvent storming based msa training commerce example
Event storming based msa training commerce exampleuEngine Solutions
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation WorkshopuEngine Solutions
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...uEngine Solutions
 
Safe cloud native transformation approaches
Safe cloud native transformation approachesSafe cloud native transformation approaches
Safe cloud native transformation approachesuEngine Solutions
 
microservice architecture public education v2
microservice architecture public education v2microservice architecture public education v2
microservice architecture public education v2uEngine Solutions
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementationuEngine Solutions
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)uEngine Solutions
 
Distributed transanction in microservices
Distributed transanction in microservicesDistributed transanction in microservices
Distributed transanction in microservicesuEngine Solutions
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementationuEngine Solutions
 
Open Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsOpen Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsuEngine Solutions
 
Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos uEngine Solutions
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례uEngine Solutions
 
Process Oriented Architecture
Process Oriented ArchitectureProcess Oriented Architecture
Process Oriented ArchitectureuEngine Solutions
 
Building multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickBuilding multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickuEngine Solutions
 

Plus de uEngine Solutions (20)

이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
 
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
 
Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3
 
Event storming based msa training commerce example v2
Event storming based msa training commerce example v2Event storming based msa training commerce example v2
Event storming based msa training commerce example v2
 
Event storming based msa training commerce example
Event storming based msa training commerce exampleEvent storming based msa training commerce example
Event storming based msa training commerce example
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation Workshop
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...
 
Microservice coding guide
Microservice coding guideMicroservice coding guide
Microservice coding guide
 
Safe cloud native transformation approaches
Safe cloud native transformation approachesSafe cloud native transformation approaches
Safe cloud native transformation approaches
 
microservice architecture public education v2
microservice architecture public education v2microservice architecture public education v2
microservice architecture public education v2
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
 
Distributed transanction in microservices
Distributed transanction in microservicesDistributed transanction in microservices
Distributed transanction in microservices
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
 
Open Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsOpen Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS Snapshots
 
Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례
 
Process Oriented Architecture
Process Oriented ArchitectureProcess Oriented Architecture
Process Oriented Architecture
 
Building multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickBuilding multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quick
 

메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함

  • 2. 교육커리큘럼 구분 시간 프로그램 비고 워크숍 장소 집결 및 회의준비 ~13:30 (장비세팅 및 물품구매) 14:00~15:00 상호인사 및 메타웍스3 프레임워크 소개 장진영 대표 15:00~15:10 휴식 3월 9일 김승현 부장 (1일차) 15:10~18:00 설치 및 기초실습 조진원 과장 홍세진 과장 18:30~20:00 석식 20:30~ 자유실습 및 토론의 장 개별 실습 ~09:50 기상 및 조식 어드밴스드 메타웍스3: 장진영 대표 10:00~11:00 샘플어플리케이션 소개 및 조진원 과장 3월 10일 개발과정 설명 (2일차) 11:00~12:00 각자 실습-예제 어플리케이션 개별 실습 12:00~13:00 중식 13:00~14:00 정리 및 해산 Page 2
  • 3. AGENDA - 메타웍스3 기반 프레임워크의 이해 - 메타웍스3를 이용한 개발 실전 - 메타웍스3 기반의 프로세스 코디 구현 방안 공유 Page 3
  • 4. I 메타웍스3 개요 메타웍스3 프레임워크 소개 메타웍스3 프레임워크 특장점 메타웍스3 프로젝트 설치 및 실행 메타웍스3 프레임워크의 주요 파일들 Page 4
  • 5. 표준웹기반 생 산성 극대화를 위한 프레임워 크– 메타웍스3 유엔진 오픈소스 BPM 프로젝트 장진영 jyjang@uengine.org
  • 7. 어떤 도구를 사용할 것인가? 고난이 요구사항 • 순수웹 • 페이지 비전환 • Lazy Loading • 키/마우스 바인딩 • 모바일 동시지원 • NIO기반 채팅 시장의 요구 수준 품질 생산성 • 서버/클라이언트 개발 • 트랜잭셔널 자 그리고 디자이너 역 • 요소간 간섭최소화 할구분어려워 – • 일관성 있는 사용자 CSS/JS/Java/AJAX 경험과 예측성 • 다양한 언어를 넘나드 • UI기반의 테스트 는 과정의 커뮤니케이 자동화 션 비용 • 순수자바개발자만 있다.
  • 8. UI 프레임워크 – 메타웍스3 기존 프로그래밍 모델 (이벤트 드리븐) 과 약간 차이가 있는 “선언형 프로그 래밍 모델” – MDA, 메타데이터와 리플랙션을 계 승함 1. 모델 중심 아키텍처의 장점은 적은 코드량과 도메인 중심의 비즈니스 목적 중심의 코드로 품질과 생산성을 동시에 높힘 2. 메타웍스3의 독특한 POJO선언은 웹의 입력 값과 버튼을 객체의 „필드‟와 „메서드‟로 기본 매핑하여 „모델 기반 기본 앱‟을 자동으로 구 현해주어 „선-프로토타이핑‟ 이 가능하다. 3. 이후 객체에 특화된 디자인과 인터랙션을 공 통모듈 디자이너와 개발자가 분산되어 작업 할수 있으며, 그 사이에도 도메인 개발자는 작업을 지속할 수 있다. 4. 컴포넌트가 쌓이면 쌓일수록 개발의 추상성 과 생산성은 배가된다.
  • 9. 선언형 방식이 뭔가요? 선언형 프로그래밍 모델 일반 이벤트-드리븐 모델 #Client #Only in Server / only in Domain-class document.addEventListener(new function(e){ @AutowiredFromClient If( when==MetaworksContext.WHEN_VIEW, public FormDefinition formDefinition; && where=="in-container” e.keyCode==”delete", $.ajax(“/server/FormEditor”, …..); @ServiceMethod( } when=MetaworksContext.WHEN_VIEW, ); where="in-container", keyBinding=”delete", … context menu 등록 코드 생략 …. inContextMenu=true) #Server public FormDefinition remove(Request req) { public FormDefinition remove() { formDefinition.formFields.remove(this); …. Request에서 formDefinition 을 return formDefinition; unmarshalling 하는 코드 생략 ….. } formDefinition.formFields.remove(this); return formDefinition; } • 짧은 코드량 • 의미중심 • 구현 중심의 긴 코드 • 해석 방식의 전환 용이 • 구현중심의 코드로 해석이 어려움 e.g. 스프링 어노테이션 프레임워크 • 양산된 코드는 일괄전환 어려움
  • 10. 메타웍스 기반 개발 과정 Steps: 1. 무엇이 ‘객체’인지 파악하기 2. 객체를 잘 (응집도 높게) 모델링하기 3. 객체에 화장시키기 4. 객체들을 데리고 앱을 만들기
  • 11. Step 1. 분석 무엇이 “객체”인가? 그리고..무엇이 “컨텍스트”인가?
  • 12. 1. Recognizing Objects in facebook - Login.java UserId Password Login Login.java userId property Password property Login method 12
  • 13. 1. Recognizing Objects in facebook - Main.java Menu object Selection object Contents object Person object
  • 14. Login.java Main.java UserId Password return Menu.java Content.java new Main() Login return Selection.java new AContent() AContent.java return new BContent() Bcontent.java
  • 15. 1. Recognizing Objects in facebook 1.1. Person objects in different ‘Context’ Where: NORMAL Where: MINIMISED Where: MEDIUM
  • 16. Step 2. 모델링 객체와 화면요소를 최대한 단순하게 매핑하라!
  • 17. Login.java Main.java UserId Password return Menu.java Content.java new Main() Login Selection.java login() 이 실행되면 Main 을 리턴하므로 Main을 화면에 그려라!
  • 18.
  • 19.
  • 20. Login.java Main.java UserId Password return Menu.java Content.java new Main() Login return Selection.java new AContent() AContent.java return new BContent() Bcontent.java (화면에 여러 객체가 이미 존재하 는 경우) 리턴된 객체는 자신이 가 장 부합되는 응집력을 가진 화면 요소에 가서 그려짐
  • 21. 21
  • 22.
  • 23. 모델링이 곧 구현! # 객체의 응집도를 따라 서버에서 리턴된 객체가 표시될 위치를 잡는다  타겟을 정의하지 않아도 위치를 찾기 때문에 UI 컨트롤 코드가 배제됨 # 도메인 객체 이외의 UI와 관련된 컨트롤은 가능한 대표 모델 몇가지만을 사용 하고 가능한 어노테이션에 옵션을 준다 (e.g. Face)  일괄적 UI 표준을 적용하기 용이함 # 데이터를 접근하는 ‘databaseMe()’를 통해 데이터와 웹입력 값의 비교 및 처리 를 추상화한다  데이터 접근에 대한 구체적인 코드가 줄어들고 모델레벨이 유지됨
  • 24. #퀴즈 # 메인화면에서 로그인 화면으로 이동하는 “로그아웃”은 어떻게 하면 될까요?
  • 25. Step 3. UX 일관성기반 디자인 디자이너는 매핑된 모델별로 디자인 작업을, 그리고 자바스크립트 개발자는 유저 인터랙션이 높은 것들을 최대한 “컴포넌트” 단위로 작성한다. * 요구사항 별로 작성하지 않고, 요구사항을 수집하여 공통사항을 일반화 하여 컴포넌트 단위로 UI와, 스크립트를 ‘한번만’ 만든다.
  • 26. UI 프레임워크 – 메타웍스3 메타웍스3 컴포넌트 래핑 예시 – 구글 챠트 컴포넌트 자바 = 모델 HTML = Face 자바스크립트 = FaceHelper
  • 27. UI 프레임워크 – 메타웍스3 메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트 자바 = 모델
  • 28. UI 프레임워크 – 메타웍스3 메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트 HTML = Face
  • 29. UI 프레임워크 – 메타웍스3 메타웍스3 컴포넌트 래핑 예시 – 챠트 컴포넌트 자바스크립트 = FaceHelper
  • 30. Step 4. 추상성 높은 앱 개발 1. 자바스크립트와 CSS, 심지어 JSP, 서블릿도 모르는 일반 자바만을 다루는 개발자로 구성된 팀 1. 적당한 도메인 지식을 갖고 있고, 3. 고객과 협의를 할 수 있는 커뮤니케이션 스킬을 가졌다고 가정.
  • 31. UI 프레임워크 – 메타웍스3 컴포넌트 조합 – 화이트박스 사용 자바 개발자는 UI요소들을 자바의 관점으로만 통합하 여 불러쓴다
  • 32. 32
  • 33. 메타웍스 동작 메커니즘: – 흩어진 메타데이터를 자동으로 관리하는 메타웍스3 General Approach: Using Metaworks3: Spring MVC, JSON, jQuery, Hibernate meta data Controlle r Domain class Controlle (java version) r View DAO You have to meta Synchronize the gap meta Metaworks Metaworks View data DAO data Synchronizes the Proxy meta Synchronizes the Proxy data Domain class Domain class Domain (Hibernate ver (JS version) sion) Class (Java)
  • 34. “메타웍스3 우산” < 선언형 프로그래밍 모델과 추상성 극대화를 통한 생산성> • 프로그래밍 모델 추상화 • 자바-자바스크립트 간 통신 추상화 • 자바-자바스크립트 간 메타데이터 자동 동기화 • 자바스크립트 인터랙션 (버튼, 키보드/마우스) 추상화 • 네비게이션 추상화 • 롱-폴링 기반 콜백 추상화 • 데이터베이스 접근 추상화 • JPA어노테이션 기반 ORMapping • 데이터베이스 캐시 / 동기화 • 트랜잭션 자동화 (스프링없이 동작가능) <테스트 자동화와 품질 향상> • 매우 짧은 코드 – 품질에 직결 • 설계가 곧 구현 – 모델중심의 생산성과 품질 • 아규먼트 없는 서비스메서드 – 객체의 응집도를 유지 • 웹 기반 테스팅 자동화 • Guided Tour 기능 자동화 34
  • 38. II 메타웍스3 실전 dwr.xml에 패키지 경로 설정 메타웍스3에서 자바 클래스 사용법 메타웍스3의 자바 클래스에서 Annotation 사용법 메타웍스3의 API 레퍼런스 메타웍스3에서 EJS 템플릿 사용법 Page 38
  • 39. 메타웍스3 프로젝트 설치 및 실행 1. 메타웍스3 프로젝트 설치 1. 이클립스 웹 프로젝트 생성 2. 메타웍스3 관련 jar 파일 추가 – WEB-INFlib [ uEngine 제공 파일들 – spring / dwr 포함 ] 3. 설정 파일 구성 [ applicationContext.xml, dwr.xml ] 2. 메타웍스3 프로젝트 실행 1. 연동해서 사용할 DBMS 기동 2. WAS 기동 – [ ex. %CATALINA_HOME%binstartup.bat ] 3. 웹 브라우저 : http://localhost:8080/metaworks3/index.html Page 39
  • 40. 주요 설정 파일들 파일명 현재 경로 설명 비고 applicationContext.xml WebContent/WEB-INF 스프링 프레임워크 관련 설정 및 스프링 사 DBMS 설정 용시만 적 용 dwr.xml WebContent/WEB-INF dwr 프레임워크에서 사용될 package 경로설정 metaworks.js WebContent/scripts/me metaworks 동작 관련 스크립트 taworks metaworks folder WebContent Ejs 파일 Path metaworks3.jar WebContent/WEB- 메타웍스3 프레임워크 관련 API INF/lib springframework * . jar WebContent/WEB- 스프링 프레임워크 관련 API INF/lib Page 40
  • 41. dwr.xml에 패키지 경로 설정 1. Metaworks3 작업할 Java 작업 package를 만든다. Ex) example.login.* package의 경우 2. Package를 Metaworks3 프로젝트에서 인식할 수 있도록 dwr.xml에 등록한다. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <init> <converter id="metaworks" class="org.metaworks.dwr.MetaworksConverter"/> </init> <allow> <create creator="spring" javascript="Metaworks" scope="page"> <param name="beanName" value="MetaworksRemoteService"/> </create> <convert converter="bean" match="org.metaworks.dwr.*"/> <convert converter="metaworks" match="example.login.*"/> <convert match="java.lang.Exception" converter="exception"> <param name="include" value="message,lineNumber"/> </convert> </allow> </dwr> 3. 서버를 재 시작하거나 JREBEL를 통해 Hot Deploy 되도록 한다. Page 41
  • 42. 자바 클래스 선언법 1. Pure Java [ ex. Login.java ] 1단계 package examples.login; public class Login { String userId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } Page 42 }
  • 43. 자바 클래스 선언법 1. Pure Java [ ex. Login.java ] 2단계 package examples.login; public class Login { String userId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @ServiceMethod(callByContent=true) public Main login() throws Exception{ return 버튼클릭시 표시될 자바클래스 생성; // ex) return new Main(); } } Page 43
  • 44. 자바 클래스 선언법 2. DB 연동 Java [ ex. ILogin2.java / Login2.java ] 1단계 package examples.login; import javax.persistence.Id; import javax.persistence.Table; import org.metaworks.annotation.ServiceMethod; DB Schema import org.metaworks.dao.IDAO; @Table(name="login2") create table login2 ( public interface ILogin2 extends IDAO { userId varchar(20) primary key, password varchar(20) @Id ); public String getUserId(); public void setUserId(String userId); public String getPassword(); public void setPassword(String password); @ServiceMethod(callByContent=true) public Main login() throws Exception; } Page 44
  • 45. 자바 클래스 선언법 2. DB 연동 Java [ ex. ILogin2.java / Login2.java ] 2단계 package examples.login; import org.metaworks.dao.Database; public class Login2 extends Database<ILogin2> implements ILogin2{ String userId; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Main login() throws Exception{ if(databaseMe().getPassword().equals(getPassword())) return new Main(); else throw new Exception("Password is wrong. Forgot?"); } } Page 45
  • 46. 자바 클래스 선언법 2. DB 연동 Java [ ex. Main.java ] 3단계 package examples.login; public class Main { public Main() { setMessage(“login success”); } String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } Page 46
  • 47. UI 선언법 # “Face”라고 칭하며 JSP, ASP 와 유사한 스크립트렛식을 기반하여 앞서 개발한 자바 클래스를 화면에 뿌리는 로직을 작성합니다. #저장위치 [ 자바클래스와 동일패키지 이하 /동일 클래스명.ejs ] # 사용 가능 표현 expressions 설명 비고 Fields.필드명.here() 자바 클래스에 선언된 field와 연결하는 object Method.메서드명.here() 자바 클래스에 선언된 method와 연결하는 object Method.메서드명.caller() method의 경우 해당 method 를 onclick 과 같은 event 에 연결하기 위해 사용 value fields 부터 data 추출시 사용 mw3 Metaworks 기본 객체 Page 47
  • 48. UI 선언법 - 예시 사용자 ID: <%=fields.userId.here()%> 패스워드: <%=fields.password.here()%> <%=methods.login.here()%> Page 48
  • 49. 인터랙션 스크립트 선언법 # FaceHelper 라고 칭하며, ejs파일과 동일 위치에 OOO.ejs.js 로 선언해줌 1. 생성자 var 패키지명.클래스명 = function(objectId, className){ this.objectId = objectId; this.className = className; // object : 객체의 id // className : 객체의 class name } // 패키지명은 . 대신 _ (언더바)로 표시 2. FaceHelper function 작성 패키지명.클래스명.prototype.함수명 = function(args){ } 3. FaceHelper function 사용방법(ejs에서) mw3.getFaceHelper(„<%=objectId%>‟).함수명(); 4. FaceHelper 값 맵핑 패키지명.클래스명.prototype.setValue = function(args){ var object = mw3.getObject(this.objectId); object.필드 = 값; } 5. 서버 응답 Metaworks 객체 얻는 방법 mw3.getObject(objectId); 또는 mw3.objects[objectId]; Page 49
  • 51. Annotation 레퍼런스 1. Server Interaction 관련 Annotation Annotation 설명 비고 @ServiceMethod 실제 화면에서의 동작과 관련된 메서드를 선언하기 위해 사용 @AutowiredFromClient 객체를 Client 에서 Server 로 주입받기 위해 사용 public 필수 @AutowiredToClient Server 에서 Client 로 주입하기 위해서 사용 Page 51
  • 52. Annotation 레퍼런스 @ServiceMethod - 실제 화면에서의 동작과 관련된 메서드를 선언하기 위해 사용하는 annotation 1. callByContent : ServiceMethod 실행 시 화면(client) 에 존재하는 해당 객체의 모든 필드 객체를 받아온다. 2. except : callByContent 속성 사용 시 너무 많은 필드 객체를 받아오면 성능에 대한 이슈가 발생하므로 except 선언된 field 는 제외하고 받아온다. (일반적으로 받아오길 원하는 필드 객체가 받지 않을 필드 객체 보다 많을 시에 사용) 3. payload : callByContent 를 사용하지 않으면 @Id annotation 을 사용한 필드 객체 외에는 받아오지 않는데 추가로 필드 객체를 받아오기 위해서 사용된다. (일반적으로 받아오길 원하는 필드 객체가 받지 않을 필드 객체 보다 적을 시에 사용) 4. target : ServiceMethod 를 통해 반환된 객체를 화면에 표시하는 유형을 정의한다. 기본은 TARGET_AUTO 로 Metaworks 가 알아서 화면에 표시한다. 5. when, where, how : MetaworksContext 값에 해당되는 값이 존재 할때 ejs templete 에 표시하기 위해 사용한다. 6. keyBinding : ServiceMethod 에 key event 를 할당하여 해당 화면(client) 에서 keyBinding 속성에 할당된 key event 발생 시 해당 ServiceMethod 를 호출한다. 7. mouseBinding : ServiceMethod 에 mouse event 를 할당하여 해당 ServiceMethod(button) 에서 mouseBinding 에 할당된 mouse event 발생 시 해당 ServiceMethod 를 호출한다. 8. inContextMenu : inContextMenu 속성을 true 로 설정하면 해당 ServiceMethod 는 context menu 형식으로 표현한다. (일반적으로 mouse event 혼합하여 적용) Page 52
  • 53. Annotation 레퍼런스 @AutowiredFromClient - 화면(client) 에 존재하는 객체를 server 로 받아오기 위한 annotation 이다. public class FormField { @AutowiredFromClient FormDefinition formDefinition; String fieldName; public String getFieldName() { return fieldName; } public void setFieldName(String fieldName) { this.fieldName = fieldName; } String type; public String getType() { return type; } public void setType(String type) { this.type = type; } public FormDefinition save() throws Exception{ } public FormDefinition add() throws Exception{ } public FormDefinition remove() throws Exception{ } } ∙ FormField 는 FormDefinition 의 ArrayList 객체인데 FormField 에서 FormDefinition 을 얻기위해 @AutowiredFromClient 를 사용하여 처리한다. Page 53
  • 54. Annotation 레퍼런스 @AutowiredToClient - client 에 존재하는 객체를 server 로 받아오기 위한 annotation 이다. public class Post { String postId; @Hidden @AutowiredToClient public String getPostId() { return postId; } public void setPostId(String postId) { this.postId = postId; } String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } } ∙ Hidden 또는 Available 그리고 ejs 에서 fields.postId.here() 를 사용하지 않아 해당 필드 객체가 화면에 표시되지 않는 상황에 해당 필드 객체를 서버로 받아오기 위해 강제로 Client 주입하는 annotation Page 54
  • 55. Annotation 레퍼런스 2. UI Control 관련 Annotation Annotation 설명 비고 @Face 객체의 ejs 연동을 위한 필요한 정보를 설정하기 위해 사용 @Available 옵션에 따라 해당 객체를 Client에 표시하기 위해 사용 @NonEditable MetaworksContext 가 edit 상태일 때에도 view 상태로 표시할 때 사용 (수정 불가하게) @Hidden 객체를 Client에 표시하지 않기 위해 사용 Page 55
  • 56. Annotation 레퍼런스 @Face - ejs templete 연관된 annotation 1. ejsPath : 기본적으로 같은 패키지명.클래스명에 존재하는 ejs templete 이나 없을경우 ObjectFace.ejs 를 사용하지만 ejsPath 속성을 지정할 경우 해당 ejs templete 을 사용한다 2. displayName : ejs templete 에서 표시할 객체의 이름을 설정하여 ejs templete 에서 사용한다. 3. options, values : ejs templete 에 option 에 해당하는 value 설정하여 ejs templete 의 사용성을 확장한다. @Face(ejsPath=“genericfaces/Window.ejs”, displayName=“연락처”, options={“width”, “height”}, values={400, 900}) public class ContactWindow{ IUser user; public IUser getUser(){ return this.user. } public void setUser(IUser user){ this.user = user; } } Page 56
  • 57. Annotation 레퍼런스 @Available - ejs templete 에 객체를 특정한 상황에 표시하기 위한 annotation 1. when, where, how : MetaworksContext 값에 해당되는 값이 존재 할때 ejs templete 에 표시하기 위해 사용한다. public class Wizard implements ContextAware { MetaworksContext metaworksContext; public MetaworksContext getMetaworksContext() { return metaworksContext; } public void setMetaworksContext(MetaworksContext metaworksContext) { this.metaworksContext = metaworksContext; } String packageName; @Available(when={"edit", "view"}) public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } String className; @Available(when={"step1", "view"}) public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } @ServiceMethod @Available(when="edit") public void next1() { getMetaworksContext().setWhen("step1"); } @ServiceMethod @Available(when={"step1", "view"}) public void save() { getMetaworksContext().setWhen("view"); } } Page 57
  • 58. Annotation 레퍼런스 @NonEditable - ejs templete 에서 MetaworksContext 가 edit mode 일때도 view 상태로 표기 public class Post { String postId; public String getPostId() { return postId; } public void setPostId(String postId) { this.postId = postId; } String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } IUser author; @NonEditable public IUser getAuthor() { return author; } public void setAuthor(IUser author) { this.author = author; } } ∙ author(글쓴이) 는 사용자에게 입력 받지 않는 부분이므로 입력하지 못하게 @NonEditable annotation 처리 Page 58
  • 59. Annotation 레퍼런스 @Hidden - ejs templete 에서 표시하지 않을 Object 에 사용하는 annotation public class Post { String postId; @Hidden public String getPostId() { return postId; } public void setPostId(String postId) { this.postId = postId; } String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } IUser author; public IUser getAuthor() { return author; } public void setAuthor(IUser author) { this.author = author; } } ∙ postId 는 사용자에게 보여지지 않는 부분이므로 입력하지 못하게 @Hidden annotation 처리 Page 59
  • 60. Annotation 레퍼런스 3. Database 관련 Annotation Annotation 설명 비고 @Table DAO 객체에 DB Table 의 맵핑을 위해 사용 @Id DB Table의 primary key와 맵핑을 위해 사용 @NonSavable transient 상태로 지정하기 위해 사용 @ORMapping Database 의 Table 필드와 객체의 필드를 맵핑하기 위해 사용 Page 60
  • 61. Annotation 레퍼런스 @Table - DAO Object 가 DAO 명과 다른 이름을 사용할 시에 Table 명과의 맵핑을 위해 사용 1. name : DAO Object 와 맵핑될 Database 의 Table 명을 정의 한다. @Table(name="user") public interface ILogin extends IDAO { public String getUserId(); public void setUserId(String userId); public String getUserName(); public void setUserName(String userName); public String getPassword(); public void setPassword(String password); } ∙ DAO 명(ClassName)은 Login 이지만 실제로 맵핑될 Table 은 user 라는 이름을 가진 Table 이므로 @Table annotation 처리 Page 61
  • 62. Annotation 레퍼런스 @Id - DAO Object 를 핸드링 하기 위한 key value 으로 unique 한 value 가진 field 지정 public interface ILogin extends IDAO { @Id public String getUserId(); public void setUserId(String userId); public String getUserName(); public void setUserName(String userName); public String getPassword(); public void setPassword(String password); } ∙ 사용자 Table 에서는 userId 가 조회 및 삭제, 수정이 이루어지므로 userId 에 @Id annotation 을 사용하여 DAO 를 핸들링 한다. Page 62
  • 63. Annotation 레퍼런스 @NonSavable - DAO Object 를 에서 Database 에 저장 및 수정 시 사용하지 않을 field 에 사용 public interface ILogin extends IDAO { public String getUserId(); public void setUserId(String userId); public String getUserName(); public void setUserName(String userName); public String getPassword(); public void setPassword(String password); @NonSavable public String getSSN(); public void setSSN(String ssn); } ∙ ssn(주민번호) 필드는 본인확인을 위해서만 필요하고 실제 Database 에 저장하지 않을 것이므로 @NonSavable annotation 사용하여 처리 Page 63
  • 64. Annotation 레퍼런스 @ORMapping - DAO Object 를 field 와 Database Table column 과의 맵핑을 처리하기 위해 사용 public interface User extends IDAO { @ORMapping(databaseFields={"empNo"}, objectFields={"userId“}) public String getUserId(); public void setUserId(String userId); @ORMapping(databaseFields={"empName"}, objectFields={"userId“}) public String getUserName(); public void setUserName(String userName); public String getPassword(); public void setPassword(String password); } ∙ Table 의 column 명과 DAO Object 의 field 명이 서로 달라 맵핑이 필요한 경우에 @ORMapping annotation 을 사용한다 public interface IPost extends IDAO { public String getPostId(); public void setPostId(String postId); public String getContent(); public void setContent(String content); @ORMapping(databaseFields={“authorId"}, objectFields=“userId") public IUser getAuthor(); public void setAuthor(IUser author); } ∙ 또한 Table Post 의 authorId column 을 Iuser 의 userId 필드와 Object 의 맵핑에서도 사용된다. Page 64
  • 65. DB접근 API 레퍼런스 org.metaworks.dao.Database 메서드 설명 비고 createDataBaseMe() DAO 객체에 입력된 정보로 Database 에 입력 후 입력된 DAO 객체를 return databaseMe() DAO 객체에 Annotation @Id 로 설정된 Field로 Database 를 검색하여 결과를 DAO 객체로 return syncToDAtabaseMe() DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는 Database 를 입력된 정보로 수정 후 DAO 객체를 return deleteDatabaseMe() DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는 Database 를 삭제 sql(Class, String) 쿼리를 직접 호출하여 결과를 특정 Class 타입으로 맵핑하 여 return sql(String) 쿼리를 직접 호출하여 결과를 return Page 65
  • 66. 개발 관련 FAQ 1. 서버 관련 FAQ - 1 질문) 필드명과 메서드명을 동일하게 작성했더니 실행이 되지 않습니다. int indent = 0; @ServiceMethod public void indent(){ indent += 10; } 답변) 서비스 메서드와 필드명이 동일한 경우 메타웍스3에서는 정상적으로 필드와 메서 드를 구분하지 못해 오류를 발생시킵니다. 위의 코드는 다음과 같이 서로 다른 이 름으로 사용하세요. int indentDepth = 0; @ServiceMethod public void indent(){ indentDepth += 10; } Page 66
  • 67. 개발 관련 FAQ 1. 서버 관련 FAQ - 2 질문) 다음과 같이 서비스 메서드가 매개변수를 가질 수 있나요? @ServiceMethod public void indent(int x){ indentDepth += x; } 답변) 메타웍스3에서는 아키텍처 상에서 서비스 메서드를 호출할 때에는 매개변수를 전 달할 수 없도록 하여 응집도 높은 객체설계를 유도합니다. 이는 개발 생산성과 품 질에 직결됩니다. 만약 특정 값을 사용하고자 할 경우에는 아래 예시처럼 멤버 필 드를 선언하거나 @AutowiredFromClient를 사용하세요. int getX() { … } void setX(int x) { … } @ServiceMethod public void indent(){ indentDepth += getX(); } Page 67
  • 68. 개발 관련 FAQ 1. 서버 관련 FAQ - 3 질문) 다음과 같이 코드를 하였는데 화면이 멈추어 버립니다. class Node { Node[] child; } 답변) 메타웍스3에서는 자신과 동일한 객체를 직접 가지면 재귀호출이 발생하게 됩니다. 따라서 자신과 동일한 객체를 소유하려면 ArrayList와 같은 Collection 등을 이용하 여 우회적으로 사용하여야 합니다. class Node { ArrayList<Node> child; } Page 68
  • 69. 개발 관련 FAQ 1. 서버 관련 FAQ - 4 질문) 다음과 같이 서버에서 Annotation을 사용하여 Client 객체를 얻으려고 하는 데 정상동작 하지 않습니다. class MainPage { @AutowiredFromClient ClientSession session; } 답변) 메타웍스3에서는 클라이언트를 가져오는 객체에 대해서는 public 접근제한자에 국한해서 지원합니다. class MainPage { @AutowiredFromClient public ClientSession session; } Page 69
  • 70. 개발 관련 FAQ 1. 서버 관련 FAQ - 5 질문) ServiceMethod Annotation을 사용했음에도 불구하고 has no method „myMethod' 라는 오류가 발생합니다. class MainPage implements IMainPage { @ServiceMethod public void myMethod() { … } } 답변) 메타웍스3에서는 인터페이스를 상속하는 클래스에 대해서는 해당 인터페이스 메 서드를 주 참조 클래스로 인식합니다. 따라서 구현되는 서비스 메서드의 원형을 인터페이스에서도 넣어 주어야 합니다. Interface IMainPage { @ServiceMethod public void myMethod(); } class MainPage implements IMainPage{ public void myMethod() { … } } Page 70
  • 71. 개발 관련 FAQ 1. 서버 관련 FAQ - 6 질문) 자바 클래스를 정상적으로 생성했음에도 불구하고 No Converter for „yourClass‟ 라는 오류가 발생합니다. package my.one.two; class yourClass { … } 답변) 메타웍스3에서는 사용하려는 패키지에 대해서는 dwr.xml 파일에 선언해 주어야 합니다. 이는 화면에서 참조하는 클래스를 인식하기 위함입니다. dwr.xml <convert converter="metaworks" match=“my.one.two.*"/> Page 71
  • 72. 개발 관련 FAQ 1. 서버 관련 FAQ - 7 질문) ORMapping Annotation이 인식되지 않는것 같습니다. @Table(name=“Login”) interface ILogin extends IDAO { @Id @ORMapping(databaseFields={“id”}, objectFields={“num”}) public int getNum(); …. @ORMapping(databaseFields={“name”}, objectFields={“name”}) public String getName(); …. } 답변) ORMapping은 DB Table의 필드명과 자바 클래스의 필드명이 다를 경우에 인식이 됩니다. 따라서 동일한 이름으로 되어 있을 경우에는 ORMapping을 사용할 필요 가 없습니다. 만약 사용하게 되면 어떤 공간을 저장 영역으로 써야 할 지에 대한 혼 돈이 발생하게 됩니다. Page 72
  • 73. 개발 관련 FAQ 2. 클라이언트 관련 FAQ - 1 질문) ejs를 만들었는데 반영이 되지 않습니다. 이유가 무엇인가요? 답변) ejs는 자바클래스와 동일한 폴더에 작성할 수도 있고, webapps 이하의 contents 영역에 자바클래스의 패키지와 똑같은 이름의 path 상에 작성할 수도 있습니다. 그 러나 만약 두 군데 모두 ejs가 존재할 경우 자바클래스와 동일한 폴더 내에 작성된 ejs가 우선 적용됩니다. 만약 자바클래스에서 @Face Annotation을 통해 특정 ejs를 지정한 경우에는 @Face를 통해 지정된 ejs가 최우선 적용됩니다. 질문) ejs가 변경되었을 때 반영되는 속도가 느립니다. 빠르게 할 수 있나요? 답변) ejs의 경로 URL을 웹 브라우저로 하나 열어 두고 변경 시 그곳을 refresh 시키면 ejs의 반영이 빨라 집니다. Page 73
  • 74. 개발 관련 FAQ 2. 클라이언트 관련 FAQ - 2 질문) 자바클래스로 일부의 값이 전달되어 오지 않습니다. 이유가 무엇인가요? myEjs.ejs ID : <%= fields.userId.here() %><br/> PW : <%= fields.password.here() %><br/> 답변) fields 객체를 사용할 경우 동일명의 필드를 호출하게 되면 가장 마지막에 입력된 값을 가져오게 됩니다. 위 예시와 같이 fields의 id 를 잘못하여 두번 사용하게 되면 실제 자바클래스에서는 id 값으로 pw 값이 들어오게 됩니다. myEjs.ejs ID : <%= fields.userId.here() %><br/> PW : <%= fields.password.here() %><br/> Page 74
  • 75. 개발 관련 FAQ 2. 클라이언트 관련 FAQ - 3 질문) 화면이 뜨지 않고 깨집니다. 이유가 무엇인가요? myEjs.ejs <!-- <%= fields.xxx.here() %> --> Hello!!! 답변) 자바클래스와 연동된 객체를 호출하는 것은 ejs의 코멘트에 의해 실행을 막을 수 없습니다. 결론적으로 ejs Template 엔진이 계속하여 코멘트 영역에 html을 넣게 되므로 화면이 깨지게 됩니다. Page 75
  • 76. 개발 관련 FAQ 3. 클라이언트 관련 스크립트 FAQ - 1 질문) ejs.js 생성자에서 자바클래스 객체를 얻어오지 못합니다. 이유는? myEjs.ejs.js var my_one_two_yourClass = function(objectId, className) { var obj = mw3.getObject(objectId); } 답변) ejs.js 내의 생성자와 getValue메서드 내에서는 mw3.getObject(objectId) 대신 mw3.object[objectId] 를 사용해야 합니다. myEjs.ejs.js var my_one_two_yourClass = function(objectId, className) { var obj = mw3.object[objectId]; } Page 76
  • 77. 개발 관련 FAQ 3. 클라이언트 관련 스크립트 FAQ - 2 질문) ejs.js 에서 자바클래스 객체의 필드를 얻고자 합니다. myEjs.ejs.js var my_one_two_yourClass = function(objectId, className) { this.objectId = objectId; this.className = className; alert(this.userId); //  가능한가요? } 답변) ejs.js 내의 this는 FaceHelper 클래스입니다. 따라서 자바클래스 객체를 획득 후 해당 필드를 얻으셔야 합니다. myEjs.ejs.js var my_one_two_yourClass = function(objectId, className) { …. var obj = mw3.objects[this.objectId]; alert(obj.userId); } Page 77
  • 78. 개발 관련 FAQ 3. 클라이언트 관련 스크립트 FAQ - 3 질문) 다음과 같은 오류는 왜 발생하나요? Error marshalling data. See the logs for more details. 답변) ejs.js 의 package_className.prototype.getValue 에서 값을 type 에 맞지 않게 넣 을때 발생하므로 type 확인 및 넘겨주는 값(value) 확인하셔야 합니다. 질문) ejs.js 파일이 반영이 되지 않습니다. 이유가 무엇인가요? 답변) ejs.js는 기본적으로 ejs 파일이 존재해야 그 경로를 통해 ejs.js를 찾아내어 실행하 게 됩니다. 따라서 ejs 파일이 존재하는지 확인하세요. Page 78
  • 79. III 확장 메타웍스3 메타웍스3 기반의 ProcessCodi PaaS를 지원하는 Cloud IDE Page 79
  • 82. 감사합니다! Page 82