JCF3.0™ 공통모듈-메뉴 관리 가이드

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물 : JCF3.0™ 공통모듈-메뉴 권한 관리 가이드
  • 작성자: 고경철
  • 작성일 : 2007/12/03
  • 버전 : 0.9
  • 개정이력 :

Copyright © 2007 Daewoo Information Systems Co., Ltd.

목차

[편집] 개요

[편집] 메뉴관리 모듈

기업용 어플리케이션에서 필수적으로 구현하여 활용하는 메뉴관리를 위한 공통모듈을 JCF3.0에서 구현하여 릴리즈한다. JCF를 적용하므로써 별도의 메뉴관리 프로그램을 구현하는 것이 아니라 공통모듈 메뉴관리 프로그램을 그대로 사용하여 메뉴를 구성할 수 있다. 단, UI 및 보안에 대한 구현체를 다른 형태로 하고자 한다면 변경하여 프로그램하는 것이 필요하다.

[편집] JCF3.0 메뉴관리의 특징

JCF3.0 공통모듈 중 메뉴관리에 대한 특징은 다음과 같다.

1. 메뉴를 구성하기 위해 Tree구조의 자료형 적용
2. Tree의 구현체는 ArrayTree이며, TreeRoot와 TreeNode로 구성된다.
3. Tree 자료구조의 특성상 하나의 TreeNode는 부모와 자식의 Collection, 그리고 Sibling을 알고 있다.
4. 메뉴의 초기 로드 시 모든 메뉴로 구성된 메뉴트리를 구성하여 MenuManager의 메모리상에 로딩한다.
5. 사용자별 메뉴를 로딩할 때 DB에 접근하는 것이 아니라 메모리상의 메뉴트리를 활용하므로 성능을 향상시킨다.
6. MenuManager와 SecurityAdaptor 그리고 MenuDisplayer를 분리하여 메뉴관리, 보안관리, UI관리를 독립적으로 분리시켰다.
7. 메뉴구성에 대한 Depth 제한이 없으며, Tree 구조를 통해 유연한 메뉴구성 및 관리가 가능하다.
8. 인터페이스 기반의 메뉴관리 모듈을 통해 다양한 구현이 가능하다.

[편집] 메뉴관리 모듈 설정

[편집] 테이블 생성하기

  • 메뉴 테이블
CREATE TABLE MENU
(
  MENU_ID               VARCHAR2(20 BYTE)       NOT NULL,
  PARENT_ID             VARCHAR2(20 BYTE),
  MENU_NAME             VARCHAR2(20 BYTE),
  MENU_LEVEL            NUMBER,
  MENU_ORDER            NUMBER,
  MENU_DESC             VARCHAR2(50 BYTE),
  PROGRAM_ID            VARCHAR2(20 BYTE),
  FIRST_INSERT_TIME     TIMESTAMP(6)            NOT NULL,
  LAST_UPDATE_TIME      TIMESTAMP(6),
  FIRST_INSERT_USER_ID  VARCHAR2(20 BYTE),
  LAST_UPDATE_USER_ID   VARCHAR2(20 BYTE),
  ONDISPLAY             NUMBER(1)               DEFAULT 0
);
 
CREATE UNIQUE INDEX MENU_PK ON MENU
(MENU_ID)
LOGGING
NOPARALLEL;
 
ALTER TABLE MENU ADD (
  CONSTRAINT MENU_PK
 PRIMARY KEY
 (MENU_ID)
    USING INDEX);

[편집] Spring 메뉴 설정

  • applicationContext-menu.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
	default-autowire="no"
	default-lazy-init="false"
	default-dependency-check="none"
  	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
	http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd" >
	
	<bean id="menuService" class="jcf.biz.menu.service.MenuServiceImpl">
		<property name="menuDao"><ref bean="menuDao"/></property>
	</bean>	
	<bean id="authService" class="jcf.biz.authority.service.AuthServiceImpl">
		<property name="authDao"><ref bean="authDao"/></property>
	</bean>	
	<bean id="securityAdaptor" class="jcf.biz.authority.acegi.AcegiSecurityAdaptor">
		<property name="authService"><ref bean="authService"/></property>
	</bean>
	<bean id="menuManager" class="jcf.biz.menu.DatabaseMenuManager">
		<property name="menuService"><ref bean="menuService"/></property>
		<property name="securityAdaptor"><ref bean="securityAdaptor"/></property>
	</bean>
	<bean id="menuDisplayer" class="jcf.biz.menu.display.miplatform.MiplatformMenuDisplayer">
		<property name="programService"><ref bean="programService"/></property>
		<property name="securityAdaptor"><ref bean="securityAdaptor"/></property>
	</bean>	
        <bean id="menuDao" class="jcf.biz.menu.dao.MenuDAOImpl">
            <property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
        </bean>
	<bean id="authDao" class="jcf.biz.authority.dao.AuthDAOImpl">
            <property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
        </bean>
</beans>

[편집] 메뉴관리 모듈 구조

  • Spring Bean에 등록된 공통모듈 관계도

공통모듈은 메뉴관리, 프로그램관리, 공통코드관리, 사용자관리, 권한관리, 용어사전관리, 보안관리 기능을 제공하고 각 기능을 제공하기 위해 Spring에 등록된 Bean들이 다음과 같은 관계를 가지고 상호 연동한다.



  • Spring Bean에 등록된 메뉴관리 모듈 관계도
  1. 사용자가 로그인하면 Acegi Security에서 SessionID를 기반으로 SecurityContext를 생성한다.
  2. 최초 로그인을 기반으로 MeuuManager에서는 전체 메뉴를 menuArrayTree(Tree<Menu>형) 객체에 로딩한다.
  3. MenuManager에서는 로그인한 사용자의 역할/권한과 접근통제 설정을 SecurityAdaptor를 통해 획득하고 사용자에게 할당된 메뉴를 트리구조로 구성한 후, 세션의 범위에서 전역적으로 사용하기 위해 세션에 저장한다.
  4. 개인에게 할당된 트리구조의 메뉴는 변경이 발생하지 않는 이상 DB에 접근하지 않고 사용자에게 메뉴서비스를 제공한다.
  5. SecurityAdaptor는 AuthService를 통해 인증/인가정보에 대한 DRUD를 수행한다.
  6. MenuManager는 MenuService를 통해 메뉴정보에 대한 CRUD를 수행한다.
  7. MenuDisplayer는 UI에 대한 메뉴관리 모듈의 독립성을 보증하기 위한 채널 인터페이스의 역할을 수행한다.


위의 그림을 통해 1~7번까지의 관계를 명시적으로 확인할 수 있다.

[편집] Presentation Tier

  • 메뉴관리 Presentation Tier의 역할
1. UI기술에 독립적으로 request를 받아서 적절한 메소드에 매핑한다.
2. 별도의 UI 모델을 통해 UI와 Action의 독립성을 유지한다.
3. Action이 다양한 UI를 활용할 수 있도록 다양한 UI API를 제공한다.
4. MenuDisplayer(인터페이스)를 통해 다양한 UI 채널을 지원한다.

Action 클래스는 UI기술에 독립적인 API를 제공한다.


UI의 독립성을 유지하기 위한 UI 모델을 적용한다.


MenuDisplayer는 다양한 UI 채널을 제공하기 위해 인터페이스 기반으로 구성된다.


[편집] Business Tier

  • 메뉴관리 Business Tier의 역할
1. Menu를 구성하고 관리하는 MenuManager를 구성한다.
2. 역할/권한/버튼접근과 관련된 보안사항은 SecurityAdaptor를 통해 구성되고 관리된다.
3. MenuManager와 SecurityAdaptor에서 메뉴관리돠 보안관리에 대한 DB접근의 독립성을 보장하기 위해 MenuService와 AuthService를 분리하여 메뉴관리를 수행한다.
4. Menu 객체를 통해 Business에서 데이터 공유에 대한 일관성을 유지한다.


[편집] Persistence Tier

  • 메뉴관리 Persistence Tier의 역할
1. Cache를 적용하여 불필요한 DB I/O를 최소화하고 성능을 최대화한다.
2. Service와 연동하여 트랜잭션이 보장될 수 있도록 한다.
3. 리턴값이나 파라미터로 다양한 데이터형을 지원한다.

[편집] 메뉴관리

  • 초기 로그인 이후 구성되는 베이스 화면

베이스 화면은 MenuManager와 SecurityAdaptor를 통해 구성된 사용자 메뉴를 최초로 출력하게 된다.

상위메뉴와 좌측메뉴의 Depth를 분리하는 blocking depth는 app.properties 파일에서 설정하면 WAS 가동 시 반영되어 메뉴를 구성하게 된다. 위의 메뉴는 blockingDepth가 3이므로 2 Depth의 메뉴에 상위에 있고 나머지 Depth의 메뉴가 좌측에 위치하게 된다.

  • app.properties 설정

app.properties설정화면

  • TopMenu 클릭 후 좌측메뉴 변경화면

상단에 있는 메뉴를 클릭하는 경우 좌측 메뉴가 클릭된 메뉴의 하위메뉴만 좌측에 출력되게 된다.

  • 메뉴를 추가하고 구성하는 관리화면

화면에서 위에 있는 공통버튼은 사용자의 권한과 접근통제 설정에 따라 출력되고 안되는 것이 결정된다. 메뉴의 구성에서 저장, 수정, 삭제는 X-internet의 특성에 따라 save 메소드하나로 동시에 처리된다. 물론 권한이 있는 경우에만 버튼이 출력되고 실행된다. 아래의 그림 중간에 있는 메뉴트리는 현재 존재하는 모든 메뉴를 출력한다. 따라서 관리자만이 이 화면을 통해 메뉴를 관리할 수 있다. 메뉴를 입력하여 구성할 경우 레벨과 순서를 잘 조합하여 저장하여야 자신이 원하는 위치에 메뉴를 위치시킬 수 있다.