Java Development Framework
1. Development Framework의 필요성 예를 들어 각종 자동차 부품과 냉장고 부품이 전부 분해되어 바닥에 즐비하게 서로 섞여 있는 모습을 상상해 보겠습니다. 수많은 볼트와 넛트, 게스킷, 파이프, 심지어 팬치와 드라이버까지 마구 섞여 있습니다. 그러나, 엔진과 기어변속장치, 동력전달장치 등 각종 단위 부품을 미리 조립해 둔 반제품을 이용한다면 최종적으로 카렌스를 만드는 기간은 엄청나게 빨리 끝낼 수 있겠지요. 완제품을 만드는 사람은 엔진구조공학은 모르지만 단지 최종적인 조립을 위한 최소한의 ‘조립공정’과 기술만 보유하고 있으면 됩니다. 카렌스가 SI 프로젝트를 통해 완성시켜야 할 최종적인 시스템에 비유한다면, 각종 부품들은 API(Application Programming Interface)에 해당될 수 있습니다. 물론 지금의 SI프로젝트가 직면한 문제가 위에서 예를 든 것과 비슷한 상황인가란 질문에는 의견이 분분할 수도 있습니다. 사실 엄밀히 말하면 시스템을 구성하기 위해 기계어나 어셈블리어를 사용하지 않고, C/C++언어나 Java언어를 사용하는 것도 이미 기 조립된 단위 부품을 사용한다고 볼 수도 있습니다. PowerBuilder나 Delpi 같은 4GL Tool, TUXEDO, CICS, Entera, Topend 같은 미들웨어제품 군이 그러했고, CORBA/EJB와 같은 더 상위의 어플리케이션 Framework을 사용하려는 시도는 보다 확장성있고, 강력하며, 안정적인 시스템을 보다 빨리 개발할 수 있는 반제품이자 ‘조립공정’이라고 볼 수 있습니다. 지금의 각종 4GL Tool과 더불어 Java IDE Tool, JSP, Servlet, Applet, RMI, CORBA, EJB, Application Server 등은 다양한 시스템을 만들 수 있는 충분한 ‘부품’을 제공하고 있는 것은 사실입니다. “그러나 ‘카렌스’를 만들기에는 아직도 부품이 너무 잘게 쪼개어져 있습니다” 아시다시피 최근의 상황은 IT시장에서 또 하나의 큰 패러다임 전환기를 맞고 있습니다. 국방시설, 국가안전, LG화재, 노동부 등의 프로젝트를 시작으로 해서 한미은행, 한국투자신탁, 주택은행, 동양카드, 한전 프로젝트와 같이 웹을 근간으로 혹은 일부 도입하는 프로젝트의 출현은 금년은 이렇게 막을 내리지만 새 천년을 맞이하는 내년부터는 우후죽순 격으로 생길 것이라는 예상은 그리 빗나가지 않을 것입니다. 그런데, 지금의 시점에서 보면 과거에 겪었던 과정을 또다시 반복하고 있는 현상이 일어나고 있습니다. TUXEDO와 PowerBuilder라는 Client/Server의 대표적인 아키텍춰로 프로젝트를 진행하면서, 한 프로젝트에서 사용된 개발기술 혹은 소스 프로그램 Template을 다른 프로젝트를 진행하면서 발전시켜 나가고, 그러다 누군가는 공통모듈이라는 이름으로 정리하고 모아두었다가 또다시 차기프로젝트에 사용했을 것입니다. 아마 지금 TUXEDO와 PowerBuilder로 프로젝트를 한다면 순수하게 그 제품과 API만으로 시작하지는 않을 것입니다. 유사한 프로젝트에서 사용된 방법과 기술, 공통모듈 혹은 샘플 프로그램을 찾아보는 것이 우선이겠지요… 지금도 똑 같습니다. 유일한 차이가 있다면 그 방법과 기술, 공통모듈이 지금은 없다는 것이 차이입니다. 좀더 비유해서 말하면 신차인 ‘카렌스’를 만들 모든 부품은 마련이 되어 있는데, 그것을 조립할 때, 볼트와 너트부터 조립하고 있는 것이 현실입니다. 이러다 보니 웹을 근간으로 하는 지금의 프로젝트는 각기 고유한 방식으로 초보적인 수준에서 시스템 틀과 공통모듈을 만들고, 제품에서 제공되지 않는 기능을 똑똑한 누군가의 개발자에 의해 만들어져 각기 적용되고 있죠. 국방시설, 행자보, LG화재의 소스를 들여다보면 결국 같은 것을 고민하고 있었습니다. 인식하고 있든 그렇지 않든, 그들은 ‘어떻게 하면 개발자가 업무로직에만 전념케 하며 동일한 소스를 반복해서 생성하지 않고 공통되고 일관된 모습으로 개발을 더 빨리 할 수 있을까’ 라는 문제를 풀고 있었다는 사실입니다. 때론 그것이 아주 초보적인 모습으로 나타나기도 하고, 때론 깊이 고민한 흔적이 역력히 나타나기도 합니다. 프로젝트를 주관하시는 분들이 겪고 있는 흔한 오류 중의 하나는 어떤 기술 Set, 어떤 Application Server를 사용하느냐 보다는 그러한 기술Set을 이용해 프로젝트를 이끌어 나갈 만큼의 충분한 기술력과 표준적인 Framework이 준비되어 있느냐가 더 프로젝트의 성공여부를 결정짓는 요소임을 간과한다는 것입니다. ‘개발할 사람이 없어서..’ 란 생각을 가질 수도 있지만, 정작 필요한 것은 개발자가 아니라 일관된 모습으로 개발할 수 있는 ‘준비된 틀’이 필요합니다. C/S환경의 Framework은 이미 정형화되어 모두들에게 인식되어 있습니다. 그러나 웹을 근간으로 하는 충분한 수준의 개발 Framework은 아직 어느 곳에도 없다는 것을 인정하셔야 합니다. ITG가 사업부와 차별성을 갖으려면 핵심 코아 기술을 보유하고 있어야 합니다. ITG가 사업부 프로젝트에 개발인원을 공급해 주는 용역업체로 전락하느냐 혹은 핵심기술지원을 통한 ITG 본연의 모습을 찾느냐는 결국 지원해 주는 기술의 질에 달려 있다고 볼 수 있습니다. 지금까지의 기술지원 형태를 보면, 통합팀과 같은 팀에서 ‘개발가이드’, ‘구현가이드’, ‘개발코딩표준화’ 등과 같은 문서를 만들고, 실제적인 ‘공통모듈’과 ‘핵심모듈’을 개발해 주는 형태가 지금까지의 기술지원의 형태였습니다. 이러한 구조를 변경하자는 것이 아닙니다. 체계적으로 준비된 기술과 내용을 갖고 시작하자는 것입니다. 지금까지 각 프로젝트에서 제시된 구현가이드가 기술지원 나간 사람의 특성에 따라 서로 상이하였고, 그 구현의 방법이 정말로 진실로 바람직한 방법이었냐라는 의문에서 이 모든 것은 시작됩니다. 또한 기술적인 리딩을 하는 몇몇 사람에게만 모든 요청이 몰리는 현상도 준비된 개발틀이 없음으로 인해 발생되는 문제입니다. 이러한 모든 문제의 해결점이 바로 Development Framework 라고 생각이 됩니다. 2. Java Development Framework 2.1 Framework 의 정의 2.1. Java Development Framework의 위치 가장 상위층의 Layer는 프로젝트에서 business를 어플리케이션으로 변환하여 말 그대로 프로그램을 코딩하는 일반 개발자들이 사용하는 API Layer입니다. 그 다음 하부 Layer에서는 통상 ‘통합팀’ 혹은 ‘TFT팀’에서 주관되어 공통모듈 혹은 프로그램 템플릿을 만들고, 개발자들이 쉽게 프로그램을 구현할 수 있도록 도와주는 모듈성 프로그램 API Layer가 있습니다. DB Resource를 Access 하는 모듈, Log를 남기는 모듈, 모든 어플리케이션에서 공통적으로 사용하는 모듈을 개발하는 Layer입니다. 여기서 사실상의 전체 어플리케이션의 틀이 만들어 지는 부분입니다. 이 Layer가 없거나 흔들리기 시작하면 그 프로젝트는 상당히 위험하게 됩니다. 세번째 Layer를 나눈다면, 저희들같이 ITG 기술지원팀에서 해당 프로젝트를 위해 기술지원을 나가 ‘통합팀’에서 일하면서 아키텍춰와 performance를 고려하여 전체적인 틀을 만들기 위한 가장 바탕이 되는 API를 제공해 주는 Layer입니다. 다양한 Legacy System Access API, Application Server의 API를 이용하여 Background Core Class 를 만들어 줌으로써 보다 효과적으로 전체 시스템의 틀을 만들어 낼 수 있도록 도와 주는 것입니다. 마지막 Layer는 제품의 API Layer입니다. BEA WebLogic, IBM WebSphere, Servlet, JSP, RMI, EJB API 등등 산업계에서 제공되어지는 API Layer가 그것입니다. 근래 들어 일어나는 현상가운데 가장 심각한 현상이 가장 상위층의 일반개발자가 가장 하부층의 제품 API Layer를 바로 이용하고 있는 상황입니다. Source Code 내에 DB Access 정보 같은 Static한 변수를 명시적으로 사용한다거나, 동일한 소스를 모든 개발자가 Cut & Paste하여 전부 자신의 프로그램에 넣어놓고 사용한다는 것이지요. 그나마 나은 경우는 통합팀에서 주관하여 시스템의 전체 틀을 잡고, 필요한 API를 제공하여 개발자들은 그러한 API의 바탕 위에서 프로그램을 하는 경우입니다. 이러한 경우는 사실 매우 바람직합니다. 그러나 ITG의 입장에서 보면, 매 프로젝트 마다 제 각각의 방식으로 동일한 작업을 하고 있는 거지요. 국방시설에서 고민했던 것을 행자보에 가서 다시 처음부터 고민하고 있고, LG화재에 가서 또다시 처음부터 다시 하고 있습니다. 따라서 가장 이상적인 모습은 세번째 Layer인 Development Framework이 존재할 때입니다. 하고자 하는 Java Development Framework은 세번째 Layer에서 해 주었어야 할 일들을 기술적인 입장에서 재정의하고 구체화하여 프로젝트에 도입시키자는 것입니다. 2.3 Java Development Framework 의 범위 1. Java Development Framework의 최종 사용자는 해당 프로젝트에서의 S/W시스템 설계자와 일반 개발자이다. 2.4 Java Development Framework의 구체적인 대상 Java Development Framework은 구체적으로 다음과 같은 기능성을 제공해 주는 API의 모음이며, 프로젝트 지원 Tool이자 개발 Framework입니다. 1) Development API Framework – DBWrapper/Entity Programming Framework – JSP/HTML/XML Support Framework – CICS Accessing Framework 기타 2) Development Support Tool Framework – 프로젝트를 위한 통합 인트라넷 시스템 게시판 2.4.1 Configuration Processing Framework 단일의 머신이나 분산환경에서의 각종 정보를 효과적으로 관리하면서 이러한 정보가 Application Program에서 손쉬운 방법으로 Handling되도록 제공되어야 합니다. 이 기능은 아래의 모든 Framework의 기본 바탕이 됩니다. 예를 들어 DB Connection Info., ID, Password, Legacy Access IP Address, port, 등과 같은 정보를 어딘가 기록해 두고, Application 프로그램내에서 자연스럽게 사용할 수 있는 메커니즘이 제공되어야 한다는 것이지요. “oracle.jdbc.driver.OracleDriver”, Configuration cfg =new Configuration(); 2.4.2 ErrorLog Tracking Framework WebLogic이나 WebSphere같은 Application Server는 운영시에 Error Tracking을 조절할 수 있는 방법이 제공됩니다. 그러나 Applicatoin Server를 이용하여 개발된 우리들의 시스템은 통상 설계 시에 Error Tracking을 조절하는 방법을 고려하지 않았습니다. 기껏해야 Debug.TRACE=true/false 등과 같은 방법으로 System.err.println(), System.out.println()을 이용한 것이 고작입니다. 예) : Logger.err, Logging.warn, Logger.info, Logger.debug, Logger.err.println(“alksjdfalsf”); 2.4.3 DB Connection Resource Handling Framework 시스템을 개발하다보면 각기 다양한 Database를 이용하게 됩니다. JDBC Driver도 다양하고, 어떨 땐 Connection Pooling 기능이 제공되지 않기도 합니다. 만약 Connection Pool 기능이 제공되지 않는다면 제공할 수 있는 방법과 API를 제공하고, 앞으로 우리들이 개발할 모든 시스템에서 DB Resource를 Access하는 표준적인 방법이 제공하여야 합니다. 2.4.4 Hand-by Transaction Processing Framework 아직 JTA(Java Transaction API)에 대한 활용 사례가 그리 많지는 않았습니다. 향후는 JTA를 통한 방법을 사용하겠지만, 그 때까진 java.sql.Connection을 직접 Handling하여 Transaction을 처리하여야 합니다. 설령 JTA를 범용적으로 사용하는 시기가 오더라도, 중소규모의 많은 어플리케이션은 여전히 java.sql.Connection을 이용하여 Transaction을 직접 처리하려 할 것입니다. 어떻게 하면 가장 쉽고 일관된 방법으로 처리할 수 있을지에 대한 고민을 통해 필요한 지원Class를 도출하고 제공되어 져야 합니다. Low-Level인 java.sql.Connection을 직접 handling하라고 개발자에게 모든 것을 위임하는 것은 전체 시스템의 stability를 떨어뜨리는 결과를 초래할 것입니다. 2.4.5 DBWrapper/Entity Programming Framework Web/OO내재화 프로젝트를 진행하면서 DBWrapper/Entity 처리에 대한 know-how가 많이 쌓인 것으로 믿습니다. 그러나 여전히 좀더 고민해야 할 부분이 남아 있는 것 같습니다. 국방시설에서 사용했던 방식과, 행자보에서 사용했던 방식, 또, LG화재에서 사용했던 방식이 서로 상이합니다. 어느 것이 맞습니까? static or non-static, DBWrapper에서의 Log Tracking, Business Exception 처리기법 등등…. 2.4.6 Exception Handling Framework Java에서 Exception처리는 아주 막강합니다. 이 부분은 Framework이기 이전에 Java Programming의 기본적인 테크닉에 속합니다. DBWrapper/Entity 처리시 뿐만 아니라, 분산환경의 전 부분에 걸쳐 Exception은 다양하게 만들고 사용되도록 해야 한다. 2.4.7 Message Handling Framework Exception 은 Message와는 다릅니다. 때론 같은 개념으로 접근하기도 하기만 엄격히 구분되어야 합니다. Message는 사용자에게 보여줄 Message와 Log로 남아야 될 Message로 크게 구분됩니다. Message가 발생되도록 하는것은 Exception을 통한 flow에서 처리되지만, 그 Message 자체를 정의하는 것은 완전히 별개인 것입니다. 2.4.8 JSP/HTML Support Framework Presentation Layer로의 JSP/HTML은 효과적인 수단임에는 틀림없습니다. BEA WebLogic이나, Oracle OAS에서는 Servlet이 HTML을 생성하기 위한 별도의 Java 클래스를 제공해 주고 있습니다. 때론 그것이 산업표준이 아니라는 이유로 사용하지 않는 경향이 있는 것도 사실입니다. 2.4.9 Servlet Support Framework HttpServlet을 그대로 개발자에게 노출시킬 것인가 혹은 한번 더 Wrapping시킬 것인가에 대한 고민의 산물입니다. Servlet의 기본적인 API인 Form Data처리, COOKIE처리, Servlet Chaining, Call JSP 등의 API는 막강한 것이 사실이지만, 지저분하고, Error Tracking의 부재, Form Data 처리의 미진한 부분, File Upload 기능의 부재 등, 아직 정작 SI 를 위한 꼭 필요한 몇 가지 부분이 빠져 있거나, 어설픈 것이 사실입니다. 부족한 부분을 채워 줄 API가 필요합니다. 2.4.10 Javascript Common Function Framework JavaScript는 깊이 있는 부분은 아니지만, 모르면 아무것도 할 수 없는 부분이기도 합니다. 2.4.11 Applet Support Framework 이 부분은 사실 어디까지 진행되어야 하는지 명확하지 않습니다. 그러나 Applet을 이용해 MIS성 프로그램을 짜다 보면, 그 어떤 형태의 기술셋 보다도 Framework이 절실히 필요로 하는 부분임에 틀림없습니다. Applet의 Configuration 처리, EJB나 RMI형태의 서버를 binding하는 기법과, Caching 기법, GUI를 생성하고, Data를 보관하는 방법 등, Applet이기 때문에 겪는 많은 문제들이 있으며, 이러한 개발틀이 없다 보니 개발자의 프로그램 실력에 의존하는 경향이 그 무엇보다도 짙은 영역이기도 합니다. 2.4.12 EJB Support Framework Web/OO과정을 거치면서 기술적인 검토는 일정부분 끝났다고 판단되며, 만약 EJB를 이용하여 실 프로젝트에 적용할 때, 통합팀에서 만들어줘야 할 클래스가 정말 무엇인지, 어떠한 클래스를 제공할 때, 가장 효과적으로 개발자가 개발할 수 있는 지를 검토하고, 그러한 클래스를 만드는 것이 주 관건입니다. 또, 개발절차/Deploy를 위한 자동화 스크립트와 같은 tool이 필요하다면 제공되어야 합니다. 2.4.13 CICS Accessing Framework LG화재에서 개발했던 Java에서 Host CICS 프로그램을 Access 하는 표준적인 Wrapper API를 발전시켜 제공하고자 합니다. IBM 제품은 CTG(CICS Transaction Gateway for Java)를 이용하여 CICS와 연동을 하는데 그 API가 매우 낮은 레벨의 API를 제공하고 있기 때문에 일반개발자가 그대로 이용하기는 매우 불편한 수준입니다. 2.4.14 TUXEDO Accessing Framework Jolt를 이용하든 혹은 우노시스템의 J*Link 등을 이용하든 Java에서 Tuxedo를 Access하는 방법을 파이롯 수준에서만 다루어 봤지만, 실제 프로젝트에서는 어떻게 사용하고 있는지 알아보고, 어떻게 사용하여야 가장 효과적인지, 필요한 추가 Class혹은 API 가 필요하면 제공되어야 합니다. 2.4.15 Java Mail Support Framework 이건 사실 Utility성 패키지 입니다. Java에서 Mail을 보내는 효과적인 수단을 제공할 수 있습니다. 앞으로의 프로젝트가 인터넷을 이용한 서비스가 대부분 있는 만큼, 1-to-1 마케팅, 메일링 기능 등은 꼭 필요한 요소기술이 될 것이 보이며, 이러한 기술을 미리미리 준비해 두는 것인 손해 볼 일은 아니라고 봅니다. 이미 개발되어 있는 만큼, Framework에 추가하고자 합니다. Mailer.setFrom(“leewy7@kornet.net“,”홍길동”); Mailer.setRecipient(“javaservice@hanmail.net“, “이원영”); 2.4.16 PCS Message Send Utility 019, 011 등과 같은 PCS로 문자메세지를 보낼 수 있습니다. 현재는 019 만 만들어져 있지만, 011,016,017,018 등 모두 만들어 제공하고자 합니다. Try { 2.4.17 프로젝트를 위한 통합 인트라넷 시스템 게시판 모듈간의 연관관계를 자동으로 추출하는 도구, DBWrapper/Entity를 자동으로 생성 하는 도구, 프로젝트를 위한 게시판, Oracle DB Helper Site 등 생각해 보면, 프로젝트 초기에 구성해 주면 좋을 법한 내용들이 몇몇 있습니다. LG화재의 게시판 운영은 매우 효과적이었습니다. 이러한 부분에 대한 절차를 마련해 두어야 한다고 봅니다. 2.4.18 산출물 Define Framework 이 부분은 사실 어려운 부분이기도 하며, OOAD 전문가와 상의를 통해, 프로젝트에서 꼭 필요한 산출물이 무엇이어야 하는가에 대한 Define작업이 있어야 합니다. 3. Java Development Framework의 효용성 3.1 Web/OO 내재화의 최종산출물 현재 진행되고 있는 ITG 내부 프로젝트로 진행되고 있는 Web/OO 내재화의 산출물이 막바지 단계에 이르고 있습니다. 지금까지 나와 있던 그 어떤 문서보다도 많은 내용을 다루고 있으며 체계적인 정리를 해 내었다고 평가됩니다. 분명히 이 산출물은 문서를 만든 사람들의 스스로의 기술습득의 차원을 넘어서서 문서 자체로서의 가치가 있는 탁월한 산출물임은 분명합니다. 다행스러운 것은 이 산출물의 마지막 Chapter로서 Java Development Framework의 내용이 기술되어 진다면 가장 이상적인 모습으로 승격될 수 있을 것이라는 것입니다. 모든 이론적인 설명에 끝남과 동시에 실 프로젝트에서 바로 적용할 수 있는 내용이 첨가됨으로써 독자로 하여금 실질적인 프로젝트의 착수단계로 인도할 수 있다는 것입니다. 3.2 교육대학원의 강의 도구로서의 역할 얼마 전까지만 하더라도 CGI에 관련한 강의가 교육대학원에 있었습니다. 아시다시피 CGI(Common Gateway Interface)는 HTTP를 이용한 아키텍춰의 하나입니다. CGI를 개발하기 위한 언어는 C를 이용하기도 하지만 Perl이나 ShellScript, C++ 심지어 Java로도 가능합니다. 그러나 교육대학원에서의 강의는 C 언어를 선택했고, ITG에서 어느 팀에선가 개발된 CgiLib 라는 C로 짜여진 Library를 이용했었습니다. 왜 CgiLib라는 Library가 필요했죠? 3.3 사업부에 대한 ITG기술지원의 극대화 앞서 잠깐 언급한 바와 같이 ITG의 사업부에 대한 기술지원의 방향성에서 개발자를 공급하는 용역업체로의 전락과 진정한 프로젝트 기술지원 사이에서 헤게모니를 장악할 수 있는 참신한 방안이 Java Development Framework의 개발과 확산입니다. 3.4 고질적인 방법론과 개발기술의 불협화음 제거수단 물론 사람에 따라 정도의 차이는 있겠지만 일반적으로 개발기술과 구현을 고려하지 않는 방법론과, 방법론과 Design을 고려하지 않는 개발/구현 사이에서 불협화음은 끊이지 않았습니다. 그러나 OOAD의 탄생과 Java 언어의 출현은 많은 부분에서 두 진영의 자연스런 합일의 방향으로 인도하고 있는 바람직한 현상이 일어나고 있습니다. 그러나 여전히 구체적이고 물리적인 소스코드와 산출물이라는 부분에서는 아직 서로 뜬구름 잡는 얘기를 서로 다른 관점에서 하고 있는 것도 사실 입니다. 4. Java Development Framework의 구현 방안 아무리 지금까지의 설명과 내용이 완벽하고 그 필요성을 인정한다고 하더라도 Framework 이라는 것은 물리적인 API로 제공되어져야 합니다. 실체가 있어야 한다는 것이지요. 구현과정과 결과물에 있어서 특정 집단의 잇권챙기기나 독점은 더더욱 있으면 안됩니다. 이러한 성격의 결과물은 한 집단의 이익이기 이전에 지금 국내 IT시장에서 SI가 살아남을 수 있는 총체적인 몸부림이라는 큰 개념의 산물임을 이 글을 읽는 독자는 인식해 주시기 바랍니다.
|