목차

공통 컴포넌트 경량화란?

배경 및 목적

전자정부 표준프레임워크가 본격적으로 확산되고 적용 사례들이 늘어나면서 기존에 제공되던 공통컴포넌트를 좀 더 효율적으로 사용하고자 하는 요구가 증대하였다. 전자정부 표준프레임워크 포털을 통해 기존 공통컴포넌트가 컴포넌트간 종속성으로 인해 필요한 컴포넌트만으로 활용이 어렵고, 실행을 위해 분석 노력이 추가로 투입되어야 하는 것에 대한 개선의 목소리가 전달되었고 이를 해결하기 위한 방안으로 공통컴포넌트 경량화 방안이 도출되었다.

공통컴포넌트는 컴포넌트 간 종속성으로 인해 직접 필요하지 않은 컴포넌트도 함께 설치되어야 실행가능한 상태가 된다. 따라서, 불필요한 코드를 포함한 채로 사용하거나 현장에서 이를 분석하여 불필요한 컴포넌트를 제거하고 이와 관련한 코드를 수정하는 등 별도의 노력을 들여야 오류없이 실행될 수 있다. 공통 컴포넌트 경량화를 통해 컴포넌트간 참조관계를 단순화하면 필요한 기능 또는 컴포넌트를 위해 사용되는 코드의 양을 줄일 수 있고 이를 분석하고 수정하기 위해 현장에서 들어가는 노력을 최소화할 수 있다.

새로운 사항들(What's New)

경량화 작업을 통해 새로워진 사항은 다음과 같다.

경량화 방법

Common 배포 파일의 경량화 및 참조 관계의 개선

1) Common 배포 파일의 경량화

공통컴포넌트 1.0의 Common 배포 파일은 cmm을 비롯하여 17 개의 패키지로 구성되어 있다. 그중 cmm, sec, ems, uat.uia, utl.fcc, utl.cas, utl.sim, sym.ccm.cde, sym.ccm.cca, sym.ccm.ccc 등 10 개의 패키지는 아래 그림에서 보는 바와 같이 함수적 종속관계로 상호 복잡하게 얽혀 있어서 이들 중 하나의 패키지만 필요한 경우에도 10 개 패키지 전체가 클래스 패스 내에 있어야 했다. 이와 같은 상황의 중요한 원인은 붉은 실선으로 표현된 패키지간 상호참조 관계라고 판단되어 상호참조를 일방향으로 바꾸도록 리팩토링을 진행하였다.

대부분의 패키지들은 cmm 패키지에 대한 참조를 가지고 있으며 cmm 패키지는 공통컴포넌트의 공통의 목적으로 작성되었다. 일부 클래스들은 업무적 또는 기능적 분류에 의해 각 업무 패키지에 배치되는 구조로 설계 및 구현이 되어 있었다. 문제는 이러한 클래스 중 일부 클래스는 공통컴포넌트의 거의 모든 클래스에서 참조하고 있다는데 있다. 따라서 이러한 클래스를 cmm 패키지로 이동할 경우 상호참조에 의한 바인딩 문제를 해결할 수 있다.

Common 배포파일 참조 구조

2) 인증 관련 참조 관계 개선

1.0의 경우 인증을 위해 스프링 시큐리티를 사용하고 인증 여부를 확인하기 위해 스프링 시큐리티에서 제공하는 SecurityContextHolder와 강결합된 EgovUserDetailsHelper라는 클래스를 공통적으로 사용하고 있다. 이 클래스는 1)의 설명에서와 같이 상호참조를 유발하기도 하지만 인증에 있어 스프링 시큐리티와 강하게 결합되어 관련 패키지들을 반드시 사용해야 하는 결과를 가져온다. 이를 개선하기 위하여 기존의 구상 클래스였던 EgovUserDetailsHelper를 인터페이스로 바꾸고 이 인터페이스의 구현을 스프링 시큐리티를 적용하거나 그 외의 방법을 적용할 수 있도록 개선하여 스프링 시큐리티와의 관계를 decoupling하였다. 공통컴포넌트 2.0을 이용하는 개발자는 편의에 따라 인증 방법을 택할 수 있어 불필요한 스프링 시큐리티 관련 클래스들로부터의 분리가 가능하게 되었다. 또한, 공통컴포넌트 2.0의 컴포넌트와 해당 사이트의 인증을 통합할 때 EgovUserDetailsHelper 인터페이스를 구현하는 클래스를 작성하고 정의된 메소드를 구현하기만 하면공통 컴포넌트의 수정 없이 해당 프로젝트의 인증 방법과 통합할 수 있다.

인증 컴포넌트 참조 관계 개선

3) 게시판의 부속 컴포넌트들의 참조 관계 개선

게시판 관련 컴포넌트의 경우 게시판과 함께 댓글, 만족도 조사, 스크랩 등을 선택적으로 사용할 수 있도록 설계되어 있었다. 그러나, 공통 컴포넌트 1.0에서는 이들의 구현이 참조 관계로 얽혀 있어 부가 기능들에 해당하는 패키지들 없이 게시판 패키지 만으로는 컴파일이 되지 않는다. 따라서, 부가적인 기능을 사용하지 않는 경우에도 이들을 포함하거나 개발자가 해당 소스 파일들을 찾아서 제거해야 하는 별도의 노력을 들여야 했다.
이러한 사항을 개선하기 위하여 공통컴포넌트 2.0에서는 우선 댓글, 만족도 조사, 스크랩에 해당하는 클래스들을 분리하여 별도의 패키지로 정의하였고 참조 관계를 개선하여 이들 컴포넌트가 필요한 경우에만 사용할 수 있도록 하였다.(참조 관계로 인해 댓글, 만족도 조사, 스크랩과 같은 컴포넌트를 사용할 경우에는 게시판 컴포넌트와 함께 설치되어야만 한다.)

4) 게시판 및 커뮤니티 컴포넌트 참조 관계 개선

공통컴포넌트 1.0의 게시판은 게시판, 커뮤니티, 동호회 컴포넌트 간 상호참조로 인하여 게시판 만을 사용하는 경우에도 커뮤니티와 동호회를 함께 설치해야 했다. 이를 개선하기 위하여 클래스 분리, 이동 등을 통하여 참조관계를 단순화하였고 게시판 컴포넌트 만을 설치하여 사용할 수 있도록 개선하였다.

패키지 구조의 개선

공통컴포넌트 1.0의 패키지 구조와 컴포넌트간의 관계를 분석한 결과 하나의 패키지에 여러 개의 컴포넌트가 존재하는 것을 파악하였다.(아래 표 참조) 이러한 컴포넌트를 사용하여 개발하는 경우, 필요없는 클래스도 함께 사용하게 되거나 동일 패키지 내에서 필요한 클래스들만 남기고 나머지 클래스들을 제거하기 위하여 별도의 노력을 들여야 한다. 이러한 점을 개선하기 위해 하나의 패키지 내에 여러 개의 컴포넌트가 매핑되어 있는 경우 패키지를 분리하는 작업을 수행하였다.

컴포넌트갯수패키지(공통컴포넌트 1.0 기준)분리된 패키지(공통컴포넌트2.0)유형
인증서로그인
일반로그인
로그인정책관리
3egovframework.com.uat.uia egovframework.com.uat.uia
egovframework.com.uat.uap(로그인정책관리)
로그인들은 동일 클래스
로그인정책관리는 별도 클래스
실명확인
공공I-PIN 실명확인
2egovframework.com.sec.rnc 동일 동일 클래스
권한관리
권한그룹관리
그룹관리
롤관리
부서권한관리
5egovframework.com.sec.ram egovframework.com.sec.ram(권한관리)
egovframework.com.sec.rgm(권한그룹관리)
egovframework.com.sec.gmt(그룹관리)
egovframework.com.sec.rmt(롤관리)
egovframework.com.sec.drm(부서권한관리)
별도 클래스
게시물통계
사용자통계
접속통계
화면통계
보고서통계
5egovframework.com.stsegovframework.com.sts.bst(게시물통계)
egovframework.com.sts.ust(사용자통계)
egovframework.com.sts.cst(접속통계)
egovframework.com.sts.sst(화면통계)
egovframework.com.sts.rst(보고서통계)
별도 클래스
게시판
게시판생성관리
공지사항관리
디자인템플릿
유효게시판
익명게시판
자료실관리
댓글관리
스크랩기능
만족도조사
10egovframework.com.cop.bbs egovframework.com.cop.bbs(게시판)
egovframework.com.cop.tpl(디자인템플릿)
egovframework.com.cop.cmt(댓글관리)
egovframework.com.cop.scp(스크랩기능)
egovframework.com.cop.stf(만족도조사)
부분적으로 별도 클래스
부분적으로 동일 클래스
커뮤니티관리
커뮤니티방명록
커뮤니티사진첩
3egovframework.com.cop.cmy 동일 방명록과 사진첩은 게시판과 동일 클래스
기업회원관리
사용자괸리
회원관리
사이트맵
4egovframework.com.uss.umt 동일 별도 클래스
우편번호주소찾기
우편번호관리
2egovframework.com.sym.ccm.zip 동일 동일 클래스
로그관리
사용로그관리
송/수신로그관리
시스템이력관리
웹로그관리
접속로그관리
6egovframework.com.sym.log egovframework.com.sym.log.lgm(로그관리)
egovframework.com.sym.log.ulg(사용로그관리)
egovframework.com.sym.log.tlg(송/수신로그관리)
egovframework.com.sym.log.slg(시스템이력관리)
egovframework.com.sym.log.wlg(웹로그관리)
egovframework.com.sym.log.clg(접속로그관리)
동일 클래스
메뉴관리
메뉴생성관리
바로가기메뉴관리
프로그램관리
4egovframework.com.sym.mpmegovframework.com.sym.mnu.mpm(메뉴관리)
egovframework.com.sym.mnu.mcm(메뉴생성관리)
egovframework.com.sym.mnu.bmm(바로가기메뉴관리)
egovframework.com.sym.prm(프로그램관리)
별도 클래스

패키지의 분리 작업을 통해 일부는 독립적으로 실행될 수 있도록 분리되었고 일부는 패키지는 분리되었지만 참조 관계에 의해 함께 배포되어야만 실행되는 구조로 정의되었다. 통계, 로그 관련 패키지들이 전자에 해당하고 사용자관리, 메뉴관리, 권한관리 관련 컴포넌트들이 후자에 속한다. 로그인 관련 컴포넌트들은 인증서로그인과 일반로그인의 경우 하나의 패키지 구조를 유지하되 로그인정책관리는 분리하였다. 게시판 관련 컴포넌트의 경우 앞에서 기술한 바와는 조금 다른데, 공지사항, 유효게시판, 익명게시판, 자료실관리와 같은 사항들이 사실 기능적으로는 분리되어 표현되어 있으나, 구현은 동일하며 속성으로 분리되는 사항이라 구조적인 분리가 불가능하였으며 따라서 게시판 관련 컴포넌트들은 템플릿을 제외하고는 하나의 패키지로 그대로 유지되었다. 커뮤니티 관련 컴포넌트의 경우, 커뮤니티 방명록과 사진첩은 사실상 게시판 컴포넌트의 다른 이름이며 코드 상 실체로 존재하는 것은 아니다. 따라서, 커뮤니티 관련 패키지도 그대로 유지하였으며 커뮤니티는 게시판을 포함하도록 구현되어 있으므로 게시판과 함께 배포되어 사용할 수 있도록 하였다.

경량화된 배포파일의 구성

경량화된 컴포넌트는 소스코드가 묶여 있는 배포 파일의 형태로 사용자에게 제공된다. 이렇게 제공되는 컴포넌트는 전자정부 표준프레임워크의 개발환경에서 곧바로 오류없이 실행되어야 한다. 이를 위하여 경량화된 컴포넌트들을 대상으로 컴포넌트 간 참조관계를 분석하고 참조관계에 있는 컴포넌트들을 묶어서 배포파일을 구성하였다.

배포파일을 이와 같이 구성한 이유는 다음과 같다. 공통컴포넌트들 간의 참조관계는 함수적 종속관계, UI 또는 업무적 연관관계로 구분할 수 있으며, 경량화를 하더라도 이러한 참조관계를 완전히 제거할 수는 없어, 함수적 종속관계에 있는 컴포넌트가 없으면 컴파일 시 오류가 발생하고 UI 또는 업무적 연관관계에 있는 컴포넌트가 없으면 실행시에 오류가 발생할 수 있다. 따라서, 오류없이 실행되기 위해서는 참조관계에 있는 컴포넌트들은 함께 묶어서 배포해야 한다.

부가적으로, 관련 테이블들을 생성하고 초기데이터를 구축할 수 있는 스크립트를 함께 제공, 배포 파일 단위의 정보의 완성도를 높히도록 구성하였다.