Java에서 메뉴를 만들때 아래 형식으로 많이한다.
------------------------------
ID | PARENT_ID | NAME
------------------------------
0 | null | root
1 | 0 | A
2 | 1 | A-1
3 | 0 | B
4 | 3 | B-1
5 | 3 | B-2
6 | 5 | B-2-1
------------------------------
이 데이터를 아래처럼 Tree Node로 바꿔보기로 한다.
root
A
A-1
B
B-1
B-2
B-2-1
public Menu selectMenuList(Map<String,Object> param) {
List<Menu> menu = repository.selectMenuList(param);
menu.forEach(items -> {
if(items.getPMenuId() != null) {
makeMenuChild(items, menu);
}
});
Menu result = menu.get(0); // root
return result;
}
메뉴 리스트를 갖고와서 foreach로 돌려서 child를 만들어 주기 위한 함수를 만들고
id와 parent와 비교하기위한 메뉴리스트를 넘겨준다.
private void makeMenuChild(Menu menu, List<Menu> temp) {
temp.stream().filter(items -> {
System.out.println(items.getMenuId());
if(items.getMenuId().equals(menu.getPMenuId())) { // ID == PARENT_ID => ADD
items.setChildren(menu);
return true;
}
return false;
}).findFirst().orElse(null);
}
makeMenuChild 메소드를 만들어서 menu_id와 parent_id가 일치하면 menu 에 children을 add 한다.
매치가 되면 for를 계속 도는것보다 return 시키는게 좋아서 stream()과 filter()를 썼다.
아래는 setChildren을 구현한 것이다.
@getter
@setter
private List children = null;
public List getChildren() {
return this.children;
}
public void setChildren(Menu item) {
if (children == null || children.size() == 0) {
children = new ArrayList();
}
children.add(item);
}
처음에는 삽질도 많이 하고 소스코드도 길게해서 가독성이 매우 불편했다.
바꾸고 나니 뿌듯-
'Java' 카테고리의 다른 글
JWT 검증 (0) | 2022.04.19 |
---|---|
File Upload (0) | 2022.02.07 |
[Mybatis] ResultHandler로 대용량 Excel Download (POI) (0) | 2019.10.24 |
Lombok 설치하기 (0) | 2019.06.20 |