본문 바로가기

Java

Menu Children 만들기

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