SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES Meta 연동가이드 2012.10.04 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone 02-2108-8030 Fax 02-2108-8031 www.softbase.co.kr Copyright 2010 SOFTBase Inc. All rights reserved
목차 1 장 : Meta 개요... 3 메타개요... 3 메타연계방법... 4 메타연동구조... 5 XFrame 메타연동구조... 5 외부메타솔루션연동구조... 6 2 장 : Meta 사용방법... 7 메타환경설정... 7 환경설정세부내용... 8 메타데이터적용... 10 메타데이터적용속성... 12 메타데이터관리... 13 3 장 : 외부메타솔루션연동...15 Meta.jsp 개요... 15 실행환경... 16 Meta.jsp 샘플소스... 17-2 -
1 장 : Meta 개요 이장에서는 XFrameDevStudio 에서제공하는 Meta 기능및외부메타솔루션과의연동처리에대해서 기술합니다. 이장에서기술하는내용은아래와같습니다. 메타개요 메타연계방법 메타연동구조 메타개요 메타 (Meta) 란화면개발시항목에대한속성 ( 이름, 최대길이등등 ) 에대한표준화된정의를제공하는기능을말한다. 메타기능을사용함으로써다음과같은장점을얻을수있다. 항목이름에대한표준한된명명규칙준수 항목속성에대한표준화된속성반영 소스개발및소스분석이일관된명명체계유지 - 3 -
메타연계방법 XFrameDevStudio 는아래의표와같이두가지메타연계방법을지원한다. 구분 XFrame 메타외부메타솔루션연동 개요메타데이터관리메타데이터범위메타데이터위치기타적용사례 XFrameDevStudio 에서자체적으로제공하는메타데이터를이용하는방법 XFrameDevStudio 에서제공하는기능을이용하여메타데이터의등록 / 수정 / 삭제처리를수행함 XFrameDevStudio 에서사용하는메타속성에해당하는데이터만제공함 메타데이터는 XFrameDevStudio 에서사용하는데이터베이스내에존재함 XFrameDevStudio 이외에는메타데이터를사용할수없음 고객사에서메타솔루션보유하고있지않은경우 XFrameDevStudio에서외부메타솔루션에서제공하는메타데이터를이용하는방법 외부메타솔루션에서제공하는기능을이용하여메타데이터의등록 / 수정 / 삭제처리를수행함 XFrameDevStudio에서사용하는메타속성이외에도다양한데이터및기능을제공함 메타데이터는외부메타솔루션이사용하는데이터베이스내에존재함 XFrameDevStudio에서외부메타솔루션을연동하기위한 Web 서비스에대한커스트마이징이필요함. 고객사에서메타솔루션을보유하고있는경우 - 4 -
메타연동구조 XFrame 메타연동구조 XFrame 메타연동구조는아래의그림과같다. 구분 1 2 설명 XFrameDevStudio 에서 XFrameDevStudio DB의메타테이블의내용을조회하여 UI 콘트롤의속성을설정한다. XFrameDevStudio 에서 XFrameDevStudio DB의메타테이블의내용을조회 / 등록 / 수정 / 삭제작업을수행한다. - 5 -
외부메타솔루션연동구조 외부메타솔루션을연동하는구조는아래의그림과같다. XFrameDevStudio XFrameAdmin 조회 Meta.jsp < 메타조회창 > 조회 < 메타관리창 > 조회 / 등록 / 수정 / 삭제 메타테이블 외부메타솔루션 UI 외부메타솔루션 DB 구분 1 2 3 설명 XFrameDevStudio 에서 XFrameDevStudio DB의메타테이블의내용을조회하여 UI 콘트롤의속성을설정한다. 조회시 XFrameAdmin의 Meta.jsp를호출한다. Meta.jsp는외부메타솔루션의메타테이블의내용을조회하여, XFrameDevStudio 에게조회된내용을전달한다. 외부메타솔루션 UI의메타관리창에서외부메타솔루션의 DB의메타테이블의내용을조회 / 등록 / 수정 / 삭제작업을수행한다. - 6 -
2 장 : Meta 사용방법 이장에서는 XFrameDevStudio 에서제공하는 Meta 기능을사용하는방법에대하여기술합니다. 이장에서 기술하는내용은아래와같습니다. 메타환경설정 메타데이터적용 메타데이터관리 메타환경설정 XFrameDevStudio 에서메타데이터를사용하기위해서는환경설정이필요하다. 메타관련환경설정은 도구 옵션 메뉴를선택하여, 아래의그림과같이맨오른쪽에있는 기타 탭에서 설정한다. - 7 -
환경설정세부내용 메타관련환경설정과관련된세부내용은아래와같다. 구분메타데이터사용서비스사용서비스 URL 서비스 URL을 UTF-8로인코딩 TEXT 속성에적용메타데이터접두어사용 설명 XFrameDevStudio 에서메타데이터사용여부를결정한다. 체크가되어있지않으면, 다른메타관련속성을적용되지않는다. 메타데이터를사용하기위해서는반드시체크되야한다. 메타데이터조회시외부메타솔루션을연동하는경우에체크한다. 서비스사용을체크하는경우에는서비스 URL을반드시지정해야한다. XFrameDevStudio 에서제공하는메타데이터를사용하는경우에는체크하지않는다. 외부메타솔루션의메타데이터를조회하기위한 URL을지정한다. 외부메타솔루션의메타데이터를조회하는 URL을호출할경우, URL을 UTF-8 방식으로인코딩여부를결정한다. 서비스 URL이서비스되는 WAS(Web Application Server) 가 UTF-8 방식으로파라미터를처리하는경우에체크한다. UI 콘트롤중에 TEXT 콘트롤에도메타사용여부를결정한다. 체크되어있는경우에는, TEXT 콘트롤의 TEXT 속성에도메타에서조회된데이터가적용된다. 메타데이터를조회한정보에각콘트롤유형별로접두어를사용할지여부를결정하며, 접두어사용시 접두어등록 버튼을클릭하여, UI 콘트롤별로사용할접두어를등록해야한다. 접두어등록은각프로젝트의네이밍규칙에따라설정된다. 접두어등록을통해서설정된내용은 XFrameDevStudio 설치디렉토리의 config 디렉토리에있는 OptionConfig.ini 파일에기록되며, 네이밍표준담당자가해당정보를설정하여, OptionConfig.ini 파일을배포하는방식으로방영된다. 외부메타솔루션을연동하는경우, 접두어를적용하는다른방법은서비스 URL 에해당하는 JSP 파일에서접두어처리를수행하는방법도있다. 외부메타솔루션을연동하는경우, 접두어처리는서비스 URL에해당하는 JSP 파일에서처리하는것을권고한다. - 8 -
접두어등록창 메타데이터사용관련환경설정에서 메타데이터접두어사용 을체크한경우, 접두어등록 버튼을 클릭하면, 아래의그림과같은창이표시된다. 각 UI 오브젝트별로접두어를설정한이후에 저장 버튼을클릭하면, 설정된내용이저장되며, 이후에메타 데이터조회후적용시해당접두어가 name 속성에반영된다. - 9 -
메타데이터적용 메타데이터적용은 UI 콘트롤의속성중에 name 속성을클릭하면아래의그림과같은창이표시된다. - 10 -
name 속성의우측에표시되는 버튼을클릭하면아래의그림과같은메타데이터조회창이표시된다. 구분 1 2 3 4 설명 메타데이터조회시검색조건에대한정보를설정하는부분이다. 2번항목에입력된메타데이터조회값을기준으로 영문명, 한글명 으로검색여부와검색시검색에대한 LIKE 조건을지정하는부분이다. 메타데이터조회값을입력하는부분이다. 선택된데이터속성반영 체크박스는 3번항목에조회된메타데이터의속성을 UI 콘트롤의속성에지정할지를결정한다. 선택된데이터속성반영 체크를해제하면, 조회된메타데이터의 name 속성에만반영된다. 조회된메타데이터의결과를표시하는부분이다. 조회된메타데이터의레코드를더블클릭하면, 하단의 확인 버튼을누른것과같은효과를나타낸다. 메타데이터의조회결과가없거나, 메타데이터와관련없는항목을 UI 콘트롤 ( 예 : 버튼 ) 에대해서영문명을직접입력하여적용하는부분이다. 메타를사용해야하는콘트롤인경우에는직접입력부분을사용하지않는권고한다. - 11 -
메타데이터적용속성 메타조회를통해사용자가메타데이터를선택하면, 선택된데이터속성반영 이체크되어있는경우, 아래의 표와같이 UI 콘트롤의속성에반영된다. 구분영문명한글명길이소수점이하 설명 UI 콘트롤의 name 속성에반영된다. 그리드의칼럼인경우, 칼럼의데이터부에대한 name 속성에반영된다. UI 콘트롤의 description 속성에반영된다. 그리드의칼럼인경우, 칼럼의데이터부에대한 description 속성에반영된다. 텍스트또는라벨콘트롤인경우, description 과 text 속성에반영된다. UI 콘트롤의 max_length 속성에반영된다. 그리드의칼럼인경우, 칼럼의데이터부에대한 max_length 속성에반영된다. 숫자필드인경우, places 속성에반영된다. 그리드의칼럼인경우, 칼럼의데이터부에대한 max_length 속성에반영된다. - 12 -
메타데이터관리 메타데이터를 XFrameDevStudio 에서제공하는메타데이터를사용하는경우에, 도구 메타데이터등록 메뉴를통해서메타데이터에대한관리를수행한다. 외부메타솔루션을사용하는경우에는사용되지않는다. 구분 1 설명 XFrameDevStudio 에등록되어있는메타테이터를조회하는기능을수행한다. 메타데이터항목에빈값으로입력하면, 전체데이터를조회한다. 메타데이터항목에값을입력하면영문명을기준으로값을조회한다.. 2 조회된메타데이터값을표시부분이다. 3 메타데이터에대한각항목을표시하는부분이다. 2 번항목에서조회된레코드를클릭하며, 해당레코드의내용이표시된다. - 13 -
4 3 번항목에표시된데이터에대하여메타데이터를등록, 수정, 삭제하는기능을수행한다. 메타데이터파일추출 버튼을클릭하면, 현재조회된데이터를 CSV 파일형식의텍스트파 일로추출한다. - 14 -
3 장 : 외부메타솔루션연동 이장에서는 XFrameDevStudio 에서외부메타솔루션에서제공하는메타데이터를연동시사용되는 Meta.jsp 파일에대해서기술합니다. 이장에서기술하는내용은아래와같습니다. Meta.jsp 개요및실행환경 Meta.jsp 샘플소스 Meta.jsp 개요 Meta.jsp 는 XFrameDevStudio 와외부메타솔루션의데이터베이스간의중계역할을수행하며, 다음과같은세부기능을수행한다. XFrameDevStudio 의메타조회창에서발생한 Request 처리 외부메타솔루션의 DB에접속 외부메타솔루션의메타데이터에대한쿼리수행 쿼리수행결과를 XFrameDevStudio에가공하여전달 XFrameDevStudio 에서외부메타솔루션을사용하기위해서는메타데이터관련환경설정부분에서 메타 데이터사용, 서비스사용, 서비스 URL 이설정되어있어야한다. - 15 -
실행환경 Meta.jsp 파일이실행되기위해서는 XFrameAdmin 이실행되는곳과같이, JSP 파일을서비스할수있는 WAS 가필요하다. 아래의표는 Meta.jsp 파일이실행되기위한정보를정리한것이다. 구분 WAS JDBC Library DB Name DB 접속포트 DB User ID 및 Passord 테이블 Layout 설명 J2EE 1.4 이상스펙을만족하는 Web Application Server 외부메타솔루션이사용하는데이터베이스에접속하기위한, JDBC 라이브러리. JDBC 라이브러리는데이터베이스의종류및버전에따라준비해아하며, 라이브러리가클래스패스경로에포함되어있어야한다. 외부메타솔루션이사용하는데이터베이스의이름 외부메타솔루션이사용하는데이터베이스에접속하기위한네트워크포트번호 외부메타솔루션이사용하는데이터베이스에접속하기위한사용자 ID 및패스워드 외부메타솔루션이관리하는메타데이터테이블의 Layout - 16 -
Meta.jsp 샘플소스 아래의 Meta.jsp 샘플소스는외부메타솔루션이사용하는데이터베이스가오라클인경우를가정하고작성된 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <%@ page import="java.sql.*" contenttype="text/html;charset=euc-kr"%> <% final String FIELD_DEL = String.valueOf((char)0x01); // 필드구분자 final String RECORD_DEL = String.valueOf((char)0x02); // 레코드구분자 final String DATA_DEL = String.valueOf((char)0x03); // 데이터시작, 끝 final String DB_SUCCESS = "1"; final String DB_FAIL = "0"; // 검색조건데이터 String metavalue = request.getparameter("value") == null? "" : request.getparameter("value"); // '0' : 영문명, '1' : 한글명 String searchtype = request.getparameter("type") == null? "" : request.getparameter("type"); //'0' : 검색 %, '1' : % 검색 %, '2' : % 검색, '3' : 검색 String liketype = request.getparameter("liketype") == null? "" : request.getparameter("liketype"); // xframe Control Type String controltype = request.getparameter("controltype") == null? "" : request.getparameter("controltype"); if(metavalue.equals("")) { out.println(data_del + DB_FAIL + FIELD_DEL + metavalue + " 메타데이터검색어를입력하지않으셨습니다." + DATA_DEL); return; if(searchtype.equals("")) { out.println(data_del + DB_FAIL + FIELD_DEL + searchtype + " 검색방식을입력하지않으셨습니다." + DATA_DEL); return; if(liketype.equals("")) { out.println(data_del + DB_FAIL + FIELD_DEL + searchtype + " 검색방식을입력하지않으셨습니다." + DATA_DEL); return; Connection conn = null; Statement stmt = null; ResultSet rs = null; - 17 -
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 PreparedStatement prep = null; try { // 아래의부부에메타접속 IP, 포트, SID, 사용자 ID, Password 값을설정해야합니다. String DB_URL = "jdbc:oracle:thin:@172.20.76.164:1521:metadb"; String DB_USER = "meta_db_id"; String DB_PASSWORD = "meta_db_password"; String DRIVER_CLASS_NAME = "oracle.jdbc.driver.oracledriver"; // JDBC Driver Load Class.forName(DRIVER_CLASS_NAME); // Get DB Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); // Create Prepared Statement stmt = conn.createstatement(); // Make Query // Column : ENGLISH_NAME, KOREAN_NAME, DATA_LENGTH, DATA_SCALE StringBuffer metaquery = new StringBuffer(); metaquery.append("select "); metaquery.append(" OBJ_ENM, OBJ_KNM, NVL(DATA_LENGTH, '0') as DATA_LENGTH, "); metaquery.append(" NVL(DATA_SCALE, '0') as DATA_SCALE "); metaquery.append("from "); metaquery.append(" META_TABLE "); // 영문검색 if(searchtype.equals("0")) { if(liketype.equals("0")) { metaquery.append(" OBJ_ENM LIKE '" + metavalue + "%' \n"); else if(liketype.equals("1")) { metaquery.append(" OBJ_ENM LIKE '%" + metavalue + "%' \n"); else if(liketype.equals("2")) { metaquery.append(" OBJ_ENM LIKE '" + metavalue + "%' \n"); else { metaquery.append(" OBJ_ENM = '" + metavalue + "' \n"); // 한글검색 else { if(liketype.equals("0")) { metaquery.append(" OBJ_KNM LIKE '" + metavalue + "%' \n"); else if(liketype.equals("1")) { metaquery.append(" OBJ_KNM LIKE '%" + metavalue + "%' \n"); else if(liketype.equals("2")) { metaquery.append(" OBJ_KNM LIKE '" + metavalue + "%' \n"); - 18 -
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 else { metaquery.append(" OBJ_KNM = '" + metavalue + "' \n"); StringBuffer resultstr = new StringBuffer(); boolean breturn = false; String strdata = ""; resultstr.append(data_del); // 주어진쿼리로메타데이터를검색 rs = stmt.executequery(metaquery.tostring()); // Get ResultSet Meta Information Data ResultSetMetaData rsmd = rs.getmetadata(); // Get Column Count int ncolcount = rsmd.getcolumncount(); while(rs.next()) { breturn = true; for(int i = 0 ; i < ncolcount; i++) { if(rs.getstring(i + 1)!= null) { strdata = rs.getstring(i + 1).trim(); resultstr.append(strdata); resultstr.append(field_del); resultstr.append(record_del); resultstr.append(data_del); if(breturn == true) { out.print(resultstr); else { out.print(data_del + DB_FAIL + FIELD_DEL + RECORD_DEL + DATA_DEL); catch(exception e) { out.println(data_del + DB_FAIL + FIELD_DEL + e.getmessage() + RECORD_DEL + DATA_DEL); finally { try { if(rs!= null) rs.close(); if(stmt!= null) stmt.close(); if(conn!= null &&!conn.isclosed()) conn.close(); catch (Exception e) { out.println(data_del + DB_FAIL + FIELD_DEL + e.getmessage() + RECORD_DEL + DATA_DEL); - 19 -
155 %> 라인 설명 3 ~ 8 JSP에서사용할상수선언 10 ~ 42 XFrameDevStudio 에서요청한파라미터처리및 Validation 44 ~ 47 DB 접속및쿼리수행을위한변수선언 51 ~ 54 DB 접속을위한정보변수설정 69 ~ 104 외부메타솔루션의테이블조회를위한쿼리조립 113 ~ 140 외부메타솔루션의테이블에대한쿼리수행및 XFrameDevStudio 로전달한데이터 조립및전달 146 ~ 153 DB 접속관련리소스해제 - 20 -