지난 [JAVA]HashMap을 사용하여 메뉴정보 가져오기에 이어 수정한 내용과 추가적으로 작업한 내용이 있어 이어서 설명하고자 한다.
먼저 지난번 마지막 작업부분이었던
Vector<String> clsList = new Vector<String>();
for(String key : menuMap.keySet()) {
if(menuMap.get(key).getMenuLwprtCnt() < 1 && StringUtil.isEmpty(menuMap.get(key).getAuthProgrmId())) {
clsList.add(key); // 삭제할 key정보를 담는다.
}
}
//삭제할 key정보를 담은 Vector를 활용하여 remove 호출
for(int i = 0; i < clsList.size(); i++) {
menuMap.remove(clsList.get(i));
}
이 부분을 수정하였다. 위 방식의 문제점은
1. 자식메뉴가 삭제된 경우, 부모메뉴와 그 상위의 모든 메뉴에 대해 검증을 하지 않기 때문이다. 예를 들면,
계절
└봄
└봄 음식
└새싹비빔밥
└봄 휴양지
└경주 불국사
└여름
└여름음식
└팥빙수
이런 식으로 메뉴 구성이 있을 때 "팥빙수"메뉴 삭제 시 더 이상 필요없는(자식메뉴가 없는) "여름음식"과 "여름"이 삭제되어야 한다. 하지만 위 방식대로라면 부모메뉴에 대한 검증이 없어 단순 자식메뉴만 삭제하게 된다.
2. 각각의 메뉴마다 자식메뉴 정보를 List<Menu>로 가지고 있는데 반영이 되지 않는다. 그래서 다음과 같이 수정하였다.
// 필요없는 메뉴 Key 찾기(최종메뉴가 아니면서, 하위 메뉴가 비어있는 상위메뉴)
menuMap = upperMapCls(menuMap);
// 메뉴 재설정
List<Menu> menuList = menuMap.get(1).getSubMenuList(); // 최상위 메뉴의 자식메뉴부터 List로 저장
menuList = clearMenuSet(menuList, clsMap);
// 자식메뉴가 없는 상위메뉴 삭제(1번문제 해결)
public Map<Integer, Menu> upperMapCls(Map<Integer, Menu> menuMap) {
boolean chk = false;
for(int key : menuMap.keySet()) {
if(menuMap.get(key).getMenuLwprtCnt() < 1 && StringUtil.isEmpty(menuMap.get(key).getAuthProgrmId())) {
clsList.add(key);
if(StringUtil.notEmpty(menuMap.get(key).getMenuUpperNo())) {
int upperMenuLwprtCnt = menuMap.get(menuMap.get(key).getMenuUpperNo()).getMenuLwprtCnt();
menuMap.get(menuMap.get(key).getMenuUpperNo()).setMenuLwprtCnt(upperMenuLwprtCnt-1);
}
chk = true;
}
}
for(int i = 0; i < clsList.size(); i++) {
menuMap.remove(clsList.get(i));
clsMap.put(clsList.get(i), clsList.get(i));
}
if(chk) {
menuMap = upperMapCls(menuMap);
}
return menuMap;
}
//하위메뉴로 탐색하면서 필요없는 메뉴 삭제 (2번문제 해결)
public List<Menu> clearMenuSet(List<Menu> menuList, Map<Integer, Integer> clsMap) {
List<Menu> newMap = new ArrayList<>();
for(int i = 0; i < menuList.size(); i++) {
int key = menuList.get(i).getMenuNo();
if(StringUtil.isEmpty(menuList.get(i).getAuthProgrmId()) && (menuList.get(i).getMenuLwprtCnt() > 0)) {
List<Menu> subMenuList = menuList.get(i).getSubMenuList();
subMenuList = clearMenuSet(subMenuList, clsMap);
menuList.get(i).setSubMenuList(subMenuList);
}
if(StringUtil.isEmpty(clsMap.get(key))) {
newMap.add(menuList.get(i));
}
}
return newMap;
}
이렇게 해주면 어느정도 메뉴구성은 끝이 난다.
메뉴 구현을 하면서 느낀점은 자식메뉴가 달라짐에 따라 부모 메뉴와 형제 메뉴들의 정보가 달라지고 그걸 최상위/최하위까지 검색을 해야한다는 문제를 해결하는게 가장 어렵다는 것이다. 이번을 계기로 메뉴 구현을 여러 번 하다보면 점점 더 좋은 코드와 기능들로 바뀔 것이라 기대된다.
2020/09/09 - [IT&Dev/BACK-END] - [JAVA]HashMap을 사용하여 메뉴정보 가져오기
'IT&Dev > BACK-END' 카테고리의 다른 글
[JAVA]HashMap을 사용하여 메뉴정보 가져오기 (0) | 2020.09.09 |
---|---|
Hwplib와 꼬꼬마 한글 형태소 분석기를 활용한 문서 분석기 제작 (2) | 2020.09.04 |
[이클립스]오프라인 환경에서 maven 구성하는 방법 (0) | 2020.08.28 |
[이클립스 플러그인] Jmr Code Generator 사용법 및 리뷰 (0) | 2020.08.28 |