• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
메타웍스3 워크숍 - 개념소개 및 예제, 그리고 간단한 API문서포함
 

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

on

  • 1,018 views

 

Statistics

Views

Total Views
1,018
Views on SlideShare
1,018
Embed Views
0

Actions

Likes
0
Downloads
17
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • 메타웍스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.javaUserIdPassword return Menu.java Content.java new Main() Login return Selection.java new AContent() AContent.java return new BContent() Bcontent.java
    • 1. Recognizing Objects in facebook1.1. Person objects in different ‘Context’ Where: NORMAL Where: MINIMISED Where: MEDIUM
    • Step 2. 모델링객체와 화면요소를 최대한단순하게 매핑하라!
    • Login.java Main.javaUserIdPassword return Menu.java Content.java new Main() Login Selection.java login() 이 실행되면 Main 을 리턴하므로 Main을 화면에 그려라!
    • Login.java Main.javaUserIdPassword 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 MetaworksView 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
    • Applicationswww.metaworks3.org website Social CMS
    • ApplicationsProcessCodi Cloud IDE
    • ApplicationsProcessCodi 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 동작 관련 스크립트 taworksmetaworks folder WebContent Ejs 파일 Pathmetaworks3.jar WebContent/WEB- 메타웍스3 프레임워크 관련 API INF/libspringframework * . 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(Stringmessage) { this.message = message; }} Page 46
    • UI 선언법# “Face”라고 칭하며 JSP, ASP 와 유사한 스크립트렛식을 기반하여 앞서 개발한자바 클래스를 화면에 뿌리는 로직을 작성합니다.#저장위치[ 자바클래스와 동일패키지 이하 /동일 클래스명.ejs ]# 사용 가능 표현 expressions 설명 비고Fields.필드명.here() 자바 클래스에 선언된 field와 연결하는 objectMethod.메서드명.here() 자바 클래스에 선언된 method와 연결하는 objectMethod.메서드명.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- 실제 화면에서의 동작과 관련된 메서드를 선언하기 위해 사용하는 annotation1. 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 연관된 annotation1. ejsPath : 기본적으로 같은 패키지명.클래스명에 존재하는 ejs templete 이나 없을경우 ObjectFace.ejs 를 사용하지만 ejsPath 속성을 지정할 경우 해당 ejstemplete 을 사용한다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 에 객체를 특정한 상황에 표시하기 위한 annotation1. 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 에 사용하는 annotationpublic 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 객체를 returndatabaseMe() DAO 객체에 Annotation @Id 로 설정된 Field로 Database 를 검색하여 결과를 DAO 객체로 returnsyncToDAtabaseMe() DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는 Database 를 입력된 정보로 수정 후 DAO 객체를 returndeleteDatabaseMe() DAO 객체에 Annotation @Id 로 설정된 Field 의 해당하는 Database 를 삭제sql(Class, String) 쿼리를 직접 호출하여 결과를 특정 Class 타입으로 맵핑하 여 returnsql(String) 쿼리를 직접 호출하여 결과를 return Page 65
    • 개발 관련 FAQ1. 서버 관련 FAQ - 1질문) 필드명과 메서드명을 동일하게 작성했더니 실행이 되지 않습니다.int indent = 0;@ServiceMethodpublic void indent(){ indent += 10;}답변)서비스 메서드와 필드명이 동일한 경우 메타웍스3에서는 정상적으로 필드와 메서드를 구분하지 못해 오류를 발생시킵니다. 위의 코드는 다음과 같이 서로 다른 이름으로 사용하세요.int indentDepth = 0;@ServiceMethodpublic void indent(){ indentDepth += 10;} Page 66
    • 개발 관련 FAQ1. 서버 관련 FAQ - 2질문) 다음과 같이 서비스 메서드가 매개변수를 가질 수 있나요?@ServiceMethodpublic void indent(int x){ indentDepth += x;}답변)메타웍스3에서는 아키텍처 상에서 서비스 메서드를 호출할 때에는 매개변수를 전달할 수 없도록 하여 응집도 높은 객체설계를 유도합니다. 이는 개발 생산성과 품질에 직결됩니다. 만약 특정 값을 사용하고자 할 경우에는 아래 예시처럼 멤버 필드를 선언하거나 @AutowiredFromClient를 사용하세요.int getX() { … }void setX(int x) { … }@ServiceMethodpublic void indent(){ indentDepth += getX();} Page 67
    • 개발 관련 FAQ1. 서버 관련 FAQ - 3질문) 다음과 같이 코드를 하였는데 화면이 멈추어 버립니다.class Node { Node[] child;}답변)메타웍스3에서는 자신과 동일한 객체를 직접 가지면 재귀호출이 발생하게 됩니다.따라서 자신과 동일한 객체를 소유하려면 ArrayList와 같은 Collection 등을 이용하여 우회적으로 사용하여야 합니다.class Node { ArrayList<Node> child;} Page 68
    • 개발 관련 FAQ1. 서버 관련 FAQ - 4질문) 다음과 같이 서버에서 Annotation을 사용하여 Client 객체를 얻으려고 하는데 정상동작 하지 않습니다.class MainPage { @AutowiredFromClient ClientSession session;}답변)메타웍스3에서는 클라이언트를 가져오는 객체에 대해서는 public 접근제한자에국한해서 지원합니다.class MainPage { @AutowiredFromClient public ClientSession session;} Page 69
    • 개발 관련 FAQ1. 서버 관련 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
    • 개발 관련 FAQ1. 서버 관련 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
    • 개발 관련 FAQ1. 서버 관련 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
    • 개발 관련 FAQ2. 클라이언트 관련 FAQ - 1질문) ejs를 만들었는데 반영이 되지 않습니다. 이유가 무엇인가요?답변)ejs는 자바클래스와 동일한 폴더에 작성할 수도 있고, webapps 이하의 contents영역에 자바클래스의 패키지와 똑같은 이름의 path 상에 작성할 수도 있습니다. 그러나 만약 두 군데 모두 ejs가 존재할 경우 자바클래스와 동일한 폴더 내에 작성된ejs가 우선 적용됩니다.만약 자바클래스에서 @Face Annotation을 통해 특정 ejs를 지정한 경우에는@Face를 통해 지정된 ejs가 최우선 적용됩니다.질문) ejs가 변경되었을 때 반영되는 속도가 느립니다. 빠르게 할 수 있나요?답변)ejs의 경로 URL을 웹 브라우저로 하나 열어 두고 변경 시 그곳을 refresh 시키면ejs의 반영이 빨라 집니다. Page 73
    • 개발 관련 FAQ2. 클라이언트 관련 FAQ - 2질문) 자바클래스로 일부의 값이 전달되어 오지 않습니다. 이유가 무엇인가요?myEjs.ejsID : <%= fields.userId.here() %><br/>PW : <%= fields.password.here() %><br/>답변)fields 객체를 사용할 경우 동일명의 필드를 호출하게 되면 가장 마지막에 입력된값을 가져오게 됩니다. 위 예시와 같이 fields의 id 를 잘못하여 두번 사용하게 되면실제 자바클래스에서는 id 값으로 pw 값이 들어오게 됩니다.myEjs.ejsID : <%= fields.userId.here() %><br/>PW : <%= fields.password.here() %><br/> Page 74
    • 개발 관련 FAQ2. 클라이언트 관련 FAQ - 3질문) 화면이 뜨지 않고 깨집니다. 이유가 무엇인가요?myEjs.ejs<!-- <%= fields.xxx.here() %> -->Hello!!!답변)자바클래스와 연동된 객체를 호출하는 것은 ejs의 코멘트에 의해 실행을 막을 수없습니다. 결론적으로 ejs Template 엔진이 계속하여 코멘트 영역에 html을 넣게되므로 화면이 깨지게 됩니다. Page 75
    • 개발 관련 FAQ3. 클라이언트 관련 스크립트 FAQ - 1질문) ejs.js 생성자에서 자바클래스 객체를 얻어오지 못합니다. 이유는?myEjs.ejs.jsvar my_one_two_yourClass = function(objectId, className) { var obj = mw3.getObject(objectId);}답변)ejs.js 내의 생성자와 getValue메서드 내에서는 mw3.getObject(objectId) 대신mw3.object[objectId] 를 사용해야 합니다.myEjs.ejs.jsvar my_one_two_yourClass = function(objectId, className) { var obj = mw3.object[objectId];} Page 76
    • 개발 관련 FAQ3. 클라이언트 관련 스크립트 FAQ - 2질문) ejs.js 에서 자바클래스 객체의 필드를 얻고자 합니다.myEjs.ejs.jsvar my_one_two_yourClass = function(objectId, className) { this.objectId = objectId; this.className = className; alert(this.userId); //  가능한가요?}답변)ejs.js 내의 this는 FaceHelper 클래스입니다. 따라서 자바클래스 객체를 획득 후해당 필드를 얻으셔야 합니다.myEjs.ejs.jsvar my_one_two_yourClass = function(objectId, className) { …. var obj = mw3.objects[this.objectId]; alert(obj.userId);} Page 77
    • 개발 관련 FAQ3. 클라이언트 관련 스크립트 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