= 메뉴 관리

== 개요

메뉴와 하위 Page 및 API 목록을 관리하는 화면이다. +

NOTE: 신규 메뉴를 등록 하거나 메뉴정보를 수정 또는 삭제할 경우 콜백함수를 통해서 메뉴관련 된 모든 캐시가 초기화 된다.

== UI Design & Function

=== 메뉴 관리

메뉴를 등록, 수정 및 관리 할 수 있는 메뉴 트리를 제공한다.

image::menuManagement_01.png[]

* 기능 설명
. 메뉴 트리 목록 조회
. 메뉴 상세정보 조회 : 트리에서 메뉴 선택시 메뉴 상세정보를 조회 한다.
. 메뉴 등록 : 현재 선택된 메뉴 하위에 새로운 메뉴를 추가 한다.
. 메뉴 수정 / 삭제 : 현재 선택된 메뉴를 수정 또는 삭제 한다.
. 메뉴 이동 : 트리에서 Drag&Drop 기능으로 선택한 메뉴를 이동할 수 있다.

=== 페이지 관리

image::menuManagement_02.png[]

* 기능 설명
. Page 목록 조회 : 메뉴 트리에서 메뉴 선택 시 해당 메뉴에 맵핑되어 있는 페이지 목록 조회.
. Page 등록, 수정, 삭제

NOTE: 권한 타입은 READ, UPDATE, EXECUTE, DOWNLOAD 로 구성되어 있으며 사용자가 가지고 있는 해당 메뉴에 대한 권한 종류로 UI의 권한 제어를 하고 있다. +
자세한 내용은 <<_화면별_권한처리,화면별 권한처리>> 매뉴얼을 참고한다.

=== API 관리

image::menuManagement_03.png[]

* 기능 설명
. API 목록 조회
. API 등록
. API 수정
. API 삭제

=== SDL 게시판 Page, API 프리셋 추가

image::menuManagement_04.png[]

* 기능 설명
. 게시판 선택 및 Page, API 자동 추가

== API & Service

=== API

MenuController.java +
Menu와 해당 메뉴에 Mapping 되어 있는 Page, API의 등록, 수정, 삭제 및 조회하는 API를 포함하고 있다.

* 주요 기능 API 목록
. 메뉴 트리 목록 조회 : GET /auth/menus/menu-mgmt/level
. 메뉴 상세정보 조회 : GET /auth/menus/{menuId}
. 메뉴 등록 : POST /auth/menus
. 메뉴 수정 : PUT /auth/menus
. 메뉴 삭제 : DELETE /auth/menus/{menuId}
. 메뉴 이동 : PUT /auth/menus/move-menu
. Page 목록 조회 : GET /auth/menus/{menuId}/pages
. Page 등록 : POST /auth/menus/{menuId}/pages
. Page 수정 : PUT /auth/menus/{menuId}/pages
. Page 삭제 : DELETE /auth/menus/{menuId}/pages
. API 목록 조회 : GET /auth/menus/{menuId}/apis
. API 등록 : POST /auth/menus/{menuId}/apis
. API 수정 : PUT /auth/menus/{menuId}/apis
. API 삭제 : DELETE /auth/menus/{menuId}/apis

== Entity Table & SQL

=== Entity Table

* TN_CF_SYS_RESOURCE : 리소스
* TN_CF_SYS_RESOURCE_MAPP : 리소스 맵핑
* TN_CF_MENU : 메뉴
* TN_CF_PAGE : Page
* TN_CF_API : API

=== SQL

. 메뉴 트리 목록 조회

[source,xml]
----
<select id="selectMenuLevel" parameterType="java.util.HashMap" resultMap="menuTreeInfo">
    SELECT *
    FROM (
            <include refid="conditionMenuLevel"/>
	--생략--
----

[start=2]
. 메뉴 상세정보 조회

[source,xml]
----
<select id="selectMenu" parameterType="java.util.HashMap" resultMap="menuResult">
    SELECT M.MENU_ID, M.LABEL,
           M.MENU_LEVEL, M.MENU_SEQUENCE,
	--생략--
----

[start=3]
. 메뉴 등록

[source,xml]
----
<insert id="insertMenu" parameterType="menu">
    INSERT INTO <include refid="tableMenu" />
        (MENU_ID, LABEL,
	--생략--
----

[start=4]
. 메뉴 수정

[source,xml]
----
<update id="updateMenu" parameterType="menu">
    UPDATE <include refid="tableMenu" />
    SET    LABEL = #{label},
	--생략--
----

[start=5]
. 메뉴 삭제

[source,xml]
----
<delete id="deleteMenu" parameterType="java.util.HashMap">
    UPDATE <include refid="tableMenu" />
    SET    USE_YN = 0,
           DELETE_YN = 1
	--생략--
----

[start=6]
. 메뉴 이동

[source,xml]
----
<update id="updateParentMenuId" parameterType="java.util.HashMap">
    UPDATE <include refid="sysResource.tableSysResource" />
    SET    UPPER_SYS_RESOURCE_ID = #{parentMenuId}
	--생략--
----

[source,xml]
----
<update id="updateMenuSequence" parameterType="java.util.HashMap">
    UPDATE <include refid="tableMenu" />
    SET    MENU_SEQUENCE = #{moveToMenuSequence}
	--생략--
----

[start=7]
. Page 목록 조회

[source,xml]
----
<select id="selectPageList" parameterType="java.util.HashMap" resultMap="pageResult">
    SELECT P.PAGE_ID, SA.AUTHORIZATION_ID, P.PAGE_NAME,
           P.PAGE_PATH, P.COMPONENT_NAME, P.DEFAULTED, P.USE_YN
	--생략--
----

[start=8]
. Page 등록

[source,xml]
----
<insert id="insertPage" parameterType="page">
    INSERT INTO <include refid="tablePage" />
        (PAGE_ID, PAGE_NAME, PAGE_PATH,
	--생략--
----

[start=9]
. Page 수정

[source,xml]
----
    <update id="updatePage" parameterType="page">
    UPDATE <include refid="tablePage" />
    SET    PAGE_NAME = #{pageName},
	--생략--
----

[start=10]
. Page 삭제

[source,xml]
----
<delete id="deletePage" parameterType="java.util.HashMap">
    UPDATE <include refid="tablePage" />
    SET    USE_YN = 0,
	--생략--
----

[start=11]
. API 목록 조회

[source,xml]
----
<select id="selectApiList" parameterType="java.util.HashMap" resultMap="apiResult">
    SELECT A.API_ID, SA.AUTHORIZATION_ID, A.API_NAME,
           A.API_URL, A.HTTP_METHOD, A.SERVER_ID, A.USE_YN
	--생략--
----

[start=12]
. API 등록

[source,xml]
----
<insert id="insertApi" parameterType="api">
    INSERT INTO <include refid="tableApi" />
        (API_ID, API_NAME, API_URL, API_PATH, API_PARAMETERS, HTTP_METHOD, SERVER_ID, USE_YN, DELETE_YN)
	--생략--
----

[start=13]
. API 수정

[source,xml]
----
<update id="updateApi" parameterType="api">
    UPDATE <include refid="tableApi" />
    SET    API_NAME = #{apiName},
	--생략--
----

[start=14]
. API 삭제

[source,xml]
----
<delete id="deleteApi" parameterType="java.util.HashMap">
    UPDATE <include refid="tableApi" />
    SET    USE_YN = 0,
	--생략--
----