본문 바로가기

IT&Dev/BACK-END

[JAVA]HashMap을 사용하여 메뉴정보 가져오기2

 

지난 [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을 사용하여 메뉴정보 가져오기