Request
아래와 같은 트리 메뉴를 구성할 데이터가 들어있는 테이블이 있습니다.
path 칼럼에 상위 트리의 경로가 "/" 구분자로 들어 있습니다.
예를 들어 id가 7인 노드는 [루트 → 3 → 4 → 7] 의 경로를 가지게 됩니다.
이렇게 데이터가 들어있는 테이블을 조회해서 ul 과 li 태그의 조합으로 화면에 나타내고 싶습니다.
트리 깊이(depth)는 제한이 없습니다.
데이터베이스는 MySQL, 프레임워크는 Spring + iBatis를 사용합니다.
Response
재귀함수/재귀쿼리를 써야 한다.
MySQL 에는 기본적으로 재귀쿼리가 안된단다. -_-;
나 역시도 특정 데이터베이스에서만 있는 문법을 싫어하기 때문에 있어도 안쓸 생각이었다!
단순 select 쿼리로 아래 클래스에 만족하는 계층 클래스 구조를 만들었다.
iBatis는 MyBatis 처럼 <collection>에서 재귀 효과를 낼 수 없기 때문에 다른 곳(Service 영역)에서 이 역할을 해주었다.
아래 그림에서 PathTreeService 클래스의 findChildren() 메소드가 계속 재호출되는 부분이다.
또 이 재귀 부분이 쓰이는 부분은 화면에 <ul>과 <li>를 이용해서 출력하는 부분(JSTL Custom Tag)에서 쓰인다.
PathTreeTag 클래스의 printChildren() 메소드가 계속 재호출 되는 부분이다.
Spring + iBatis + HSQL 을 이용해 만든 샘플이다.
↑ java 소스 포함 WAR 파일
↑ maven 프로젝트
아래와 같은 결과가 나오게 된다.