===== 개요 =====
**LDAP조직도관리**는 조직과 사용자 정보를 효율적으로 관리하기 위한 컴포넌트로, \\
LDAP과의 연계를 통해 조회 성능을 향상시키고, 차트형태와 같이 다양한 방식으로 조직도를 표현할 수 있는 기능을 제공한다. \\
LDAP조직도관리는 아래와 같은 기능을 포함한다.
^ 기능 ^ 설명 ^
|조직도 조회|LDAP에 저장된 조직도 정보를 트리형태 또는 차트형태로 렌더링|
|엔트리 동적생성 기능| UI를 통한 새로운 엔트리 추가 기능|
|엔트리 정보 편집| UI를 통한 기존 엔트리 속성값수정/삭제/이동 기능|
|행자부 표준지원|행자부 유통표준 LDAP스키마인 UCORG2를 지원|
===== 설명 =====
LDAP조직도관리 컴포넌트에서 조직도 정보는 아래와 같이 트리형태과 차트형태 두가지로 표현한다.\\
엔트리 추가/수정/삭제를 위한 컨텍스트 메뉴는 트리형태로 표현된 경우에만 제공한다.
==== 조직도 조회 화면1 - 트리형태 ====
* '/ext/ldapumt/dpt/selectDeptManageTreeView.do?baseDn=...'을 이용해 LDAP 서버로부터 데이터를 조회하면, 조직도 정보가 화면 왼쪽에 트리형태로 표현된다.\\
* 하나의 엔트리가 하위 엔트리를 가지는 경우, 해당 엔트리 앞에 삼각형으로 표시된다. \\
* 각 엔트리에 대한 상세 정보는 오른쪽 화면에 출력되고, 데이터를 변경한 후 저장 버튼을 누르면 LDAP 서버에 변경된 데이터가 저장된다.\\
* 조직도 정보는 최초 request로 넘어온 dn의 하위 엔트리에 대해서만 조회를 하고, 하위 엔트리의 펼침 버튼을 눌렀을 때만 LDAP에서 추가 조회하기 때문에 부하를 최소화할 수 있다.\\
{{:egovframework:ldap_tree1.png|}}
=== 조직도 컨텍스트 메뉴 ===
* 컨텍스트 메뉴를 이용하면 화면상에서 부서와 사용자 엔트리를 추가할 수 있고, 원하는 엔트리 이름을 변경하거나 삭제할 수 있다.\\
* 트리목록 중 변경을 원하는 엔트리 위치에서 마우스 우클릭하면 컨텍스트 메뉴가 나온다.
^컨텍스트 메뉴^하위 메뉴^설명^
|추가|부서, 사용자|엔트리 추가||
|이름변경|-|엔트리 이름 변경||
|삭제|-|엔트리 삭제|
|편집| 이동부서선택|엔트리 위치 이동|
{{:egovframework:ldap_tree2.png|}}
==== 조직도 조회 화면2 - 차트(그래프)형태 ====
* '/ext/ldapumt/dpt/selectDeptManageOrgChartView.do?baseDn=...'을 이용해 LDAP 서버로부터 데이터를 조회하면, 조직도 정보가 차트 형태로 표현된다.
* 엔트리를 한번 클릭하면 우측 하단에 엔트리 상세정보가 나타나며, 내용을 변경할 수 있다. \\
* 엔트리를 더블 클릭을 하면 하위 엔트리를 LDAP에서 추가 조회하여 동적으로 보여준다.
{{:egovframework:ldap_chart2.png|}}
==== 관련 패키지 및 소스 ====
^유형^소스^설명^
|Controller|egovframework.com.ext.ldapumt.web.EgovOrgManageLdapController.java |조직도 관리를 위한 컨트롤러 클래스|
|VO|egovframework.com.ext.ldapumt.service.LdapTreeObject.java |웹에서의 tree구현을 위한 오브젝트 클래스|
|VO|egovframework.com.ext.ldapumt.service.LdapObject.java |LDAP과 인터페이스를 위한 추상클래스|
|VO|egovframework.com.ext.ldapumt.service.UcorgVO.java |부서 VO클래스|
|VO|egovframework.com.ext.ldapumt.service.UserVO.java |사용자 VO클래스|
|Service|egovframework.com.ext.ldapumt.service.EgovOrgManageLdapService.java |조직도 관리를 위한 서비스 인터페이스|
|ServiceImpl|egovframework.com.ext.ldapumt.service.impl.EgovOrgManageLdapServiceImpl.java |조직도 관리를 위한 서비스 구현클래스|
|Execute Interface|egovframework.com.ext.ldapumt.service.impl.Executable.java |ORMapping 지원을 위한 클래스|
|Object Mapper|egovframework.com.ext.ldapumt.service.impl.ObjectMapper.java |LdapTemplate을 사용하기 위한 ObjectMapper클래스|
|DAO|egovframework.com.ext.ldapumt.service.impl.OrgManageLdapDAO.java|조직도 관리를 위한 추상 Data Access Object|
|DAO|egovframework.com.ext.ldapumt.service.impl.DeptManageLdapDAO.java|부서 관리를 위한 Data Access Object|
|DAO|egovframework.com.ext.ldapumt.service.impl.com.ext.ldapumt.service.impl.UserManageLdapDAO.java|사용자 관리를 위한 Data Access Object|
|XML|/resources/egovframework/spring/com/context-ldap.xml | LDAP Spring 설정 관련 XML|
|패키지|/html/egovframework/com/ext/ldapumt|JSTree 패키지|
|JSP|/WEB-INF/jsp/egovframework/com/ext/ldapumt/EgovDeptManageTree.jsp|조직도 관리를 위한 트리 JSP 페이지|
|JSP|/WEB-INF/jsp/egovframework/com/ext/ldapumt/EgovDeptManageOrgChart.jsp|조직도 관리를 위한 조직도 차트 JSP 페이지|
=== 아키텍쳐 ===
{{:egovframework:ldap_architecture2.png|}}
=== 클래스 다이어그램 ===
{{:egovframework:ldap_classdiagram.png|}}
===== 사용방법 =====
1. ldap 서버와 연결하기 위한 서버 연결 정보를 context-ldap.xml파일에 작성한다.
2. ldap 서버에 저장된 데이터를 조회하기 위한 URL 호출 방법은 다음과 같다.
- 트리형태로 보기
/ext/ldapumt/dpt/selectDeptManageTreeView.do?baseDn=[DN|RDN]
//예시, /ext/ldapumt/dpt/selectDeptManageTreeView.do?baseDn=o=Government of Korea
- 차트형태로 보기
/ext/ldapumt/dpt/selectDeptManageOrgChartView.do?baseDn=[DN|RDN]
//예시, /ext/ldapumt/dpt/selectDeptManageOrgChartView.do?baseDn=o=Government of Korea
3. LDAP조직도관리 컴포넌트를 위한 조직 스키마(ucOrg2)와 조직원 스키마(User)가 담긴 LDIF 파일\\
(단, 아래 파일은 ApacheDS 서버에서 export한 파일임, 다른 서버에서 import할 경우 정상적으로 import되지 않을 수 있음)
{{:egovframework:schema.zip|}}
^object class :: ucOrg2^^^^^^
^attribute^description^attribute^description^attribute^description^
|docSystemInfo|기관별 문서함|ou|해당기관의 명칭(필수)|ouCode|기관코드(필수)|
|ouDocumentReceipientSymbol|수신 문서 symbol|ouLevel|조직의 차수|ouOrder|차상위 기관내의 조직의 서열|
|ouReceiveDocumentYN|대외문서 처리과여부|ouSendOutDocumentYN|대외문서 송신여부|ouSMTPAddress|조직 전자메일 주소|
|parentouCode|차상위 기관코드|repouCode|대표기관코드|signCertificate|서명용 전자 관인|
|topouCode|최상위 기관코드|typeBig|대분류|typeMid|중분류|
|typeSml|소분류|ucChieftitle|발신인명의|ucOrganizationalUnitName|해당 기관의 명칭|
|ucOrgFullName|상위기관을 포함한 전체 조직명|useGroupware|조직 사용하는 그룹웨어명|userCertificate|조직 인증서 정보|
|wsignCertificate|무선 서명용 인증서|wuserCertificate|무선 암호화용 인증서|||
^object class :: User^^^^^^
^attribute^description^attribute^description^attribute^description^
|birthday|생일|business|업무|cn|행정전자서명 아이디|
|companyName|사용자가 속한 부처명|departmentName|사용자가 속한 실국명|dispatchYN|파견여부|
|displayName|화면에 보여줄 사용자의 이름 예) 홍길동|facsimileTelephoneNumber|회사팩스번호|givenName|사용자의 영문이름|
|grade|직급|homePhone|사용자의 집 전화번호|homePostalAddress|집주소|
|insayn|인사권한여부|mail|SMTP|mgrTopOuCode|최상위 기관코드|
|mobile|사용자의 휴대 전화번호|office|사용자의 사무실 전화번호|orgManagerYN|관리자여부|
|ou|해당기관의 명칭|ouCode|기관코드|ouLevel|조직의 차수|
|ouOrder|차상위 기관내의 조직의 서열|parentouCode|차상위 기관코드|position|사용자직위|
|postalAddress|회사주소|RegDate|등록일|RegDestType|등록목적타입|
|repouCode|대표기관코드|signCertificate|서명용 전자관인|telephoneNumber|회사전화번호|
|topouCode|상위기관코드|ucOrgFullName|상위기관포함 전체 조직명|useEndDate|사용종료일|
|userCertificate|사용자 인증서 정보|userFullName|자신이 속한 조직 전체명 + 사용자명|userType|사용자 타입 |
|useStartDate|사용시작일|wsignCertificate|무선 서명용 인증서|wuserCertificate|무선 암호화용 인증서|
===== 조직도 조회화면 테스트방법 =====
1. **[환경구성 및 설치]** Apache Directory Studio 2.0.0 설치 후 Apache Directory Studio.exe 실행
* 설치 - https://directory.apache.org/studio/downloads.html
2. **[서버 생성]** LDAP Servers 탭 > ApacheDS 2.0.0 더블클릭 (없으면 추가) > Partitions 탭 > Add 버튼 > 아래와 같이 입력 후 저장 (Ctrl + S)
{{:egovframework:ldap_test1.png|}}
3. **[서버 실행]** LDAP Servers 탭 > ApacheDS 2.0.0 우클릭 > Create a Connection, Run (서버 실행)
4. **[LDAP 디렉토리 생성]** Connections 탭 > ApacheDS 2.0.0 더블클릭 > LDAP Browser 탭 > DIT-Root DSE-c=kr 디렉토리 생성 확인
{{:egovframework:ldap_test2.png|}}
5. **[LDAP 스키마 추가]** LDAP Browser 탭 > DIT 우클릭 > Import > LDIF Import > Browse > schema.ldif 선택 > Finish\\
(Import 결과, ou=schema > cn=schema 아래 ou=attributetypes, ou=objectclasses 디렉토리 생성)
{{:egovframework:ldap_test5.png|}}
6. **[LDAP 엔트리 생성]** 조직(ucOrg2)과 조직원(User) 스키마를 기준으로 필요한 조직, 조직원 엔트리를 생성 (아래는 예시)\\
c=kr
o=Government of Korea --- 1)
ou=Seoul --- 2)
ou=organization1
ou=department1
ou=department2
ou=organization2
ou=people
cn=honggildong --- 3)
cn=kimmimi
* 1) c=kr 우클릭 > New Entry > Next > object classes에서 'organization' Add > RDN 입력 (o=Government of Korea)
* 2) o=Government of Korea 우클릭 > New Entry > Next > object classes에서 'ucOrg2' 입력 후 새로고침 버튼 > Add > RDN 입력 (ou=Seoul) > Attribute 추가 입력(동일한 방식으로 ou=organization1, 2와 ou=department1, 2, ou=people 생성)
* 3) ou=people 우클릭 > New Entry > Next > object classes에서 'User' 입력 후 새로고침 버튼 > Add > RDN 입력 (cn=honggildong) > Attribute 추가 입력
7. **[최종 결과]** 실행 결과 및 URL 호출 방법 (현재 조직정보는 필수값만 입력된 상태)
* o=Government of Korea를 기준으로 조회한 화면
{{:egovframework:ldap_test9.png|}}
* ou=people,ou=Seoul,o=Government of Korea를 기준으로 조회한 화면
{{:egovframework:ldap_test10.png|}}