/// <summary>
        /// 지정된 자식 Menu의 부모를 지정된 Menu로 변경합니다.
        /// </summary>
        /// <param name="child">child menu</param>
        /// <param name="newParent">new parent menu</param>
        public void ChangeMenuParent(Menu child, Menu newParent)
        {
            child.ShouldNotBeNull("child");

            var oldParent = child.Parent;

            if(Equals(oldParent, newParent))
            {
                if(log.IsInfoEnabled)
                    log.Info(@"변경할 부모가 현재 부모와 같습니다. 부모 변경 작업을 수행하지 않습니다.");

                return;
            }

            if(IsDebugEnabled)
                log.Debug("Menu의 부모 정보를 변경합니다... child code={0}, new parent code={1}, old parent code={2}",
                          child.Code,
                          (newParent != null) ? newParent.Code : EntityTool.NULL_STRING,
                          (oldParent != null) ? oldParent.Code : EntityTool.NULL_STRING);

            child.ChangeParent(oldParent, newParent);
            child.UpdateNodePosition();

            Repository<Menu>.SaveOrUpdate(child);
        }
        /// <summary>
        /// 지정된 부모 메뉴의 자식 메뉴를 생성합니다.
        /// </summary>
        /// <param name="parent">부모 메뉴</param>
        /// <param name="code">새로운 메뉴의 Id</param>
        /// <param name="menuTemplate">새로운 메뉴의 메뉴 템플릿 정보</param>
        /// <returns></returns>
        public Menu CreateMenuOf(Menu parent, string code, MenuTemplate menuTemplate)
        {
            if(parent == null)
                return CreateMenu(menuTemplate, code);

            code.ShouldNotBeWhiteSpace("code");
            Guard.Assert(parent.MenuTemplate.Product == menuTemplate.Product,
                         @"부모 메뉴의 Product 정보와 새로 만들 MenuTemplate의 Product정보가 틀립니다.");

            if(IsDebugEnabled)
                log.Debug(@"새로운 Menu 정보를 생성합니다... parent={0}, code={1}, menuTemplate={2}",
                          parent, code, menuTemplate);

            var menu = new Menu(menuTemplate, code);

            menu.SetParent(parent);
            menu.UpdateNodePosition();

            return Repository<Menu>.SaveOrUpdate(menu);
        }