Explorar o código

카테고리관리 기능 구현

gagamel %!s(int64=5) %!d(string=hai) anos
pai
achega
f8027c8c5b

+ 66 - 5
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaDisplayDao.java

@@ -15,13 +15,74 @@ import com.style24.persistence.domain.Category;
 public interface TsaDisplayDao {
 
 	/**
-	 * 카테고리관리 목록
-	 *
-	 * @param category
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author eskim
-	 * @since 2020. 12. 16
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	Collection<Category> getCategoryList(Category category);
 
+	/**
+	 * 카테고리1 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory1(Category category);
+
+	/**
+	 * 카테고리2 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory2(Category category);
+
+	/**
+	 * 카테고리3 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory3(Category category);
+
+	/**
+	 * 카테고리4 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory4(Category category);
+
+	/**
+	 * 카테고리5 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void saveCategory5(Category category);
+
+	/**
+	 * 상위카테고리 단말여부 "N" 처리
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void updateUpperCategoryLeafNo(Category category);
+
+	/**
+	 * 카테고리4SRCH truncate
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void truncateCategory4Srch();
+
+	/**
+	 * 카테고리4SRCH 생성
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	void createCategory4Srch();
+
 }

+ 67 - 5
style24.admin/src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -3,9 +3,12 @@ package com.style24.admin.biz.service;
 import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.admin.biz.dao.TsaDisplayDao;
+import com.style24.admin.support.security.session.TsaSession;
 import com.style24.persistence.domain.Category;
 
 import lombok.extern.slf4j.Slf4j;
@@ -23,17 +26,76 @@ public class TsaDisplayService {
 	@Autowired
 	private TsaDisplayDao displayDao;
 
+	@Autowired
+	private TsaCommonService commonService;
+
 	/**
-	 * 카테고리관리 목록
-	 *
-	 * @param category
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author sasa004
-	 * @since 2020.01.07
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	public Collection<Category> getCategoryList(Category category) {
 		return displayDao.getCategoryList(category);
 	}
 
+	/**
+	 * 카테고리 저장
+	 * @param category - 카테고리 정보
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCategory(Category category) {
+		category.setRegNo(TsaSession.getInfo().getUserNo());
+		category.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		Integer selLvl = category.getSelLvl();
+
+		// 카테고리번호
+		Integer cateNo = category.getCateNo();
+		if (cateNo == null) {
+			cateNo = commonService.getNextSequence("SEQ_CATE");
+		}
+
+		if (selLvl == 1) {
+			category.setCate1No(cateNo);
+			category.setCate1Nm(category.getCateNm());
+			displayDao.saveCategory1(category);
+		} else if (selLvl == 2) {
+			category.setCate2No(cateNo);
+			category.setCate2Nm(category.getCateNm());
+			displayDao.saveCategory2(category);
+		} else if (selLvl == 3) {
+			category.setCate3No(cateNo);
+			category.setCate3Nm(category.getCateNm());
+			displayDao.saveCategory3(category);
+		} else if (selLvl == 4) {
+			category.setCate4No(cateNo);
+			category.setCate4Nm(category.getCateNm());
+			displayDao.saveCategory4(category);
+		} else if (selLvl == 5) {
+			category.setCate5No(cateNo);
+			category.setCate5Nm(category.getCateNm());
+			displayDao.saveCategory5(category);
+		}
+
+		if (selLvl >= 2) {
+			displayDao.updateUpperCategoryLeafNo(category);
+		}
+	}
+
+	/**
+	 * 카테고리 갱신
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@Transactional("shopTxnManager")
+	@CacheEvict(value = "cate", allEntries = true)
+	public void refreshCategory() {
+		displayDao.truncateCategory4Srch();
+		displayDao.createCategory4Srch();
+	}
 
 }

+ 64 - 5
style24.admin/src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -4,17 +4,23 @@ import java.util.Collection;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.admin.biz.service.TsaDisplayService;
+import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.Category;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.rest.server.GagaResponse;
+
 /**
  * 전시 Controller
  *
@@ -26,16 +32,42 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class TsaDisplayController extends TsaBaseController {
 
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
 	@Autowired
 	private TsaDisplayService displayService;
 
 	/**
-	 * 카테고리관리 조회
-	 *
-	 * @param category
+	 * 카테고리관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@GetMapping("/category/form")
+	public ModelAndView categoryForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		mav.addObject("cateTypeList", rendererService.getAvailCommonCodeList("G031"));
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		mav.addObject("conentsLocList", rendererService.getAvailCommonCodeList("G028"));
+
+		mav.setViewName("display/CategoryForm");
+
+		return mav;
+	}
+
+	/**
+	 * 카테고리 목록
+	 * @param category - 카테고리 정보
 	 * @return
-	 * @author eskim
-	 * @since 2020. 12. 16
+	 * @author gagamel
+	 * @since 2021. 1. 4
 	 */
 	@PostMapping("/category/list")
 	@ResponseBody
@@ -43,4 +75,31 @@ public class TsaDisplayController extends TsaBaseController {
 		return displayService.getCategoryList(category);
 	}
 
+	/**
+	 * 카테고리 저장
+	 * @param category - 카테고리 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@PostMapping("/category/save")
+	@ResponseBody
+	public GagaResponse saveCategory(@RequestBody Category category) {
+		displayService.saveCategory(category);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 카테고리 갱신
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 1. 4
+	 */
+	@PostMapping("/category/refresh")
+	@ResponseBody
+	public GagaResponse refreshCategory() {
+		displayService.refreshCategory();
+		return super.ok(message.getMessage("SUCC_0010"));
+	}
+
 }

+ 5 - 3
style24.admin/src/main/java/com/style24/persistence/domain/Category.java

@@ -19,7 +19,7 @@ public class Category extends TscBaseDomain {
 //	private String upperCateCode;
 	private String cateNm;
 	private Integer clsLvl;
-	private String selLvl;
+
 	private Integer dispOrd;
 	private String dispYn;
 	private String useYn;
@@ -33,8 +33,6 @@ public class Category extends TscBaseDomain {
 //
 //	private String fullCateCd;
 //	private String fullCateNm;
-//
-	private String siteCd;
 //
 //	private String brandGrpNm;
 //
@@ -49,4 +47,8 @@ public class Category extends TscBaseDomain {
 	private Integer cate5No;
 	private String cate5Nm;
 
+	// 검색조건
+	private String siteCd;
+	private Integer selLvl;
+
 }

+ 421 - 93
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -2,123 +2,451 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.style24.admin.biz.dao.TsaDisplayDao">
 
-	<!-- 카테고리관리 목록 -->
+	<!-- 카테고리 목록 -->
 	<select id="getCategoryList" parameterType="Category" resultType="Category">
 		/* TsaDisplay.getCategoryList */
 		<if test='selLvl != null and selLvl != ""'>
-		<choose>
-		<when test='selLvl == "1"'>
-		SELECT SITE_CD
-		     , CATE_GB
-		     , '' AS CATE1_NO
-		     , '' AS CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , '' AS CATE_NO
-		     , '' AS CATE_NM
-		     , '' AS CATE_TYPE     /*카테고리유형*/
-		     , 'N' AS LEAF_YN      /*단말여부*/
-		     , '' AS DISP_ORD      /*우선순위*/
-		     , '' AS FORMAL_GB     /*정상이월구분*/
-		     , '' AS CONTENTS_LOC  /*컨텐츠위치코드*/
-		     , 'N' AS DISP_YN   /*전시여부*/
-		     , 'Y' AS USE_YN   /*사용여부*/
-		FROM TB_CATE1
-		WHERE SITE_CD =  #{siteCd}
-		AND USE_YN = 'Y'
-		GROUP BY SITE_CD, CATE_GB
-		</when>
-		<otherwise>
-		SELECT SITE_CD
-		     , CATE_GB
+		SELECT SITE_CD                 /*사이트코드*/
+		     , CATE_GB                 /*카테고리구분*/
+		    <if test='selLvl == 1'>
 		     , CATE1_NO
-		     <if test='selLvl == "2"'>
-		     , '' AS CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE1_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE2_NO
+		     , NULL     AS CATE3_NO
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE1_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE1_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "3"'>
+		    </if>
+		    <if test='selLvl == 2'>
 		     , CATE2_NO
-		     , '' AS CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE2_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE3_NO
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE2_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE2_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "4"'>
+		    </if>
+		    <if test='selLvl == 3'>
 		     , CATE2_NO
 		     , CATE3_NO
-		     , '' AS CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE3_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE4_NO
+		     , NULL     AS CATE5_NO
+		     , CATE3_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE3_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "5"'>
+		    </if>
+		    <if test='selLvl == 4'>
 		     , CATE2_NO
 		     , CATE3_NO
 		     , CATE4_NO
-		     , '' AS CATE5_NO
-		     , CATE4_NO AS CATE_NO     /*카테고리코드*/
+		     , NULL     AS CATE5_NO
+		     , CATE4_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE4_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     <if test='selLvl == "6"'>
+		    </if>
+		    <if test='selLvl == 5'>
 		     , CATE2_NO
 		     , CATE3_NO
 		     , CATE4_NO
 		     , CATE5_NO
-		     , CATE5_NO AS CATE_NO     /*카테고리코드*/
+		     , CATE5_NO AS CATE_NO     /*카테고리번호*/
 		     , CATE5_NM AS CATE_NM     /*카테고리명*/
-		     </if>
-		     , CATE_TYPE    /*카테고리유형*/
-		     , LEAF_YN      /*단말여부*/
-		     , DISP_ORD     /*우선순위*/
-		     , FORMAL_GB    /*정상이월구분*/
-		     , CONTENTS_LOC /*컨텐츠위치코드*/
-		     , DISP_YN      /*전시여부*/
-		     , USE_YN       /*사용여부*/
-		<if test='selLvl == "2"'>
-		  FROM TB_CATE1
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
+		    </if>
+		     , CATE_TYPE               /*카테고리유형*/
+		     , LEAF_YN                 /*단말여부*/
+		     , DISP_ORD                /*노출순서*/
+		     , FORMAL_GB               /*정상이월구분*/
+		     , CONTENTS_LOC            /*컨텐츠위치*/
+		     , DISP_YN                 /*전시여부*/
+		     , USE_YN                  /*사용여부*/
+		    <if test='selLvl == 1'>
+		FROM   TB_CATE1
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		    </if>
+		    <if test='selLvl == 2'>
+		FROM   TB_CATE2
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		    </if>
+		    <if test='selLvl == 3'>
+		FROM   TB_CATE3
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		    </if>
+		    <if test='selLvl == 4'>
+		FROM   TB_CATE4
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		AND    CATE3_NO = #{cate3No}
+		    </if>
+		    <if test='selLvl == 5'>
+		FROM   TB_CATE5
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		AND    CATE1_NO = #{cate1No}
+		AND    CATE2_NO = #{cate2No}
+		AND    CATE3_NO = #{cate3No}
+		AND    CATE4_NO = #{cate4No}
+		    </if>
+		ORDER  BY DISP_ORD
+		</if>
+	</select>
+	
+	<!-- 카테고리1 저장 -->
+	<insert id="saveCategory1" parameterType="Category">
+		/* TsaDisplay.saveCategory1 */
+		INSERT INTO TB_CATE1 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate1Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE1_NM = #{cate1Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리2 저장 -->
+	<insert id="saveCategory2" parameterType="Category">
+		/* TsaDisplay.saveCategory2 */
+		INSERT INTO TB_CATE2 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate2Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE1_NO = #{cate1No}
+		     , CATE2_NM = #{cate2Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리3 저장 -->
+	<insert id="saveCategory3" parameterType="Category">
+		/* TsaDisplay.saveCategory3 */
+		INSERT INTO TB_CATE3 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate3Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE2_NO = #{cate2No}
+		     , CATE3_NM = #{cate3Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리4 저장 -->
+	<insert id="saveCategory4" parameterType="Category">
+		/* TsaDisplay.saveCategory4 */
+		INSERT INTO TB_CATE4 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate4No}
+		     , #{cate4Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE3_NO = #{cate3No}
+		     , CATE4_NM = #{cate4Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 카테고리5 저장 -->
+	<insert id="saveCategory5" parameterType="Category">
+		/* TsaDisplay.saveCategory5 */
+		INSERT INTO TB_CATE5 (
+		       SITE_CD
+		     , CATE_GB
+		     , CATE1_NO
+		     , CATE2_NO
+		     , CATE3_NO
+		     , CATE4_NO
+		     , CATE5_NO
+		     , CATE5_NM
+		     , CATE_TYPE
+		     , LEAF_YN
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		     , DISP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{cateGb}
+		     , #{cate1No}
+		     , #{cate2No}
+		     , #{cate3No}
+		     , #{cate4No}
+		     , #{cate5No}
+		     , #{cate5Nm}
+		     , #{cateType}
+		     , 'Y'
+		     , #{dispOrd}
+		     , #{formalGb}
+		     , #{contentsLoc}
+		     , #{dispYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CATE4_NO = #{cate4No}
+		     , CATE5_NM = #{cate5Nm}
+		     , CATE_TYPE = #{cateType}
+		     , DISP_ORD = #{dispOrd}
+		     , FORMAL_GB = #{formalGb}
+		     , CONTENTS_LOC = #{contentsLoc}
+		     , DISP_YN = #{dispYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상위카테고리 단말여부 "N" 처리-->
+	<update id="updateUpperCategoryLeafNo" parameterType="Category">
+		/* TsaDisplay.updateUpperCategoryLeafNo */
+		<if test='selLvl == 2'>
+		UPDATE TB_CATE1
 		</if>
-		<if test='selLvl == "3"'>
-		  FROM TB_CATE2
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
+		<if test='selLvl == 3'>
+		UPDATE TB_CATE2
 		</if>
-		<if test='selLvl == "4"'>
-		  FROM TB_CATE3
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
+		<if test='selLvl == 4'>
+		UPDATE TB_CATE3
 		</if>
-		<if test='selLvl == "5"'>
-		  FROM TB_CATE4
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
-		   AND CATE3_NO = #{cate3No}
+		<if test='selLvl == 5'>
+		UPDATE TB_CATE4
 		</if>
-		<if test='selLvl == "6"'>
-		  FROM TB_CATE5
-		 WHERE SITE_CD = #{siteCd}
-		   AND CATE_GB = #{cateGb}
-		   AND CATE1_NO = #{cate1No}
-		   AND CATE2_NO = #{cate2No}
-		   AND CATE3_NO = #{cate3No}
-		   AND CATE4_NO = #{cate4No}
+		SET    LEAF_YN = 'N'
+		WHERE  SITE_CD = #{siteCd}
+		AND    CATE_GB = #{cateGb}
+		<if test='selLvl gte 2'>
+		AND    CATE1_NO = #{cate1No}
 		</if>
-		 ORDER BY SITE_CD, DISP_ORD
-		</otherwise>
-		</choose>
+		<if test='selLvl gte 3'>
+		AND    CATE2_NO = #{cate2No}
 		</if>
-	</select>
+		<if test='selLvl gte 4'>
+		AND    CATE3_NO = #{cate3No}
+		</if>
+		<if test='selLvl gte 5'>
+		AND    CATE4_NO = #{cate4No}
+		</if>
+		AND    LEAF_YN = 'Y'
+	</update>
+	
+	<!-- 카테고리4SRCH truncate -->
+	<delete id="truncateCategory4Srch">
+		/* TsaDisplay.truncateCategory4Srch */
+		TRUNCATE TABLE TB_CATE_4SRCH
+	</delete>
+	
+	<!-- 카테고리4SRCH 생성 -->
+	<insert id="createCategory4Srch">
+		/* TsaDisplay.createCategory4Srch */
+		INSERT INTO TB_CATE_4SRCH (
+		       SITE_CD
+		     , CATE_GB
+		     , LEAF_CATE_NO
+		     , CATE_TYPE
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE5_NO
+		     , CATE5_NM
+		     , FULL_CATE_NO
+		     , FULL_CATE_NM
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		)
+		SELECT SITE_CD
+		     , CATE_GB
+		     , LEAF_CATE_NO
+		     , CATE_TYPE
+		     , CATE1_NO
+		     , CATE1_NM
+		     , CATE2_NO
+		     , CATE2_NM
+		     , CATE3_NO
+		     , CATE3_NM
+		     , CATE4_NO
+		     , CATE4_NM
+		     , CATE5_NO
+		     , CATE5_NM
+		     , FULL_CATE_NO
+		     , FULL_CATE_NM
+		     , DISP_ORD
+		     , FORMAL_GB
+		     , CONTENTS_LOC
+		FROM   VW_CATE_4SRCH
+	</insert>
 	
 </mapper>

+ 80 - 79
style24.admin/src/main/resources/i18n/messages/message_ko_KR.properties

@@ -1,79 +1,80 @@
-## -----------------------------------------------------------------------------
-## Message properties
-## -----------------------------------------------------------------------------
-SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
-LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-##\uc8fc\ubb38
-ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
-ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
-ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
-ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-#\uc0ac\ubc29\ub137
-SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
-SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
-
-#\ubc30\uc1a1
-DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+## -----------------------------------------------------------------------------
+## Message properties
+## -----------------------------------------------------------------------------
+SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0010=\uc131\uacf5\uc801\uc73c\ub85c \uac31\uc2e0\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+
+LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
+LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+##\uc8fc\ubb38
+ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
+ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
+ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
+ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+#\uc0ac\ubc29\ub137
+SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
+SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
+
+#\ubc30\uc1a1
+DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.

+ 203 - 231
style24.admin/src/main/webapp/WEB-INF/views/display/CategoryForm.html

@@ -31,46 +31,31 @@
 				<table class="frmStyle" aria-describedby="검색조건">
 					<colgroup>
 						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
-						<col width="10%"/>
+						<col/>
 					</colgroup>
 					<tr>
-						<th>사이트</th>
+						<th>카테고리</th>
 						<td>
+							<input type="hidden" name="selLvl"/>
 							<select name="siteCd">
-								<option value="">[전체]</option>
+<!-- 								<option value="">[사이트]</option> -->
 								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-						</td>
-						<th>카테고리구분</th>
-						<td>
-							<select name="cateGb" id="selCate1" onchange="fnChangeSelect($(this).val(), 2);">
-								<option value="">[선택]</option>
+							<select name="cateGb" id="selCate1" onchange="fnChangeSearchCondition($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-						</td>
-						<th>대카테고리</th>
-						<td>
-							<select name="tcateNo" id="selCate2" onchange="fnChangeSelect($(this).val(), 3);">
-								<option value="">[선택]</option>
+							<select name="cate1No" id="selCate2" onchange="fnChangeSearchCondition($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
 							</select>
-						</td>
-						<th>중카테고리</th>
-						<td>
-							<select name="mcateNo" id="selCate3" onchange="fnChangeSelect($(this).val(), 4);">
-								<option value="">[선택]</option>
+							<select name="cate2No" id="selCate3" onchange="fnChangeSearchCondition($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
 							</select>
-						</td>
-						<th>소카테고리</th>
-						<td>
-							<select name="scateNo" id="selCate4" onchange="fnChangeSelect($(this).val(), 5);">
-								<option value="">[선택]</option>
+							<select name="cate3No" id="selCate4" onchange="fnChangeSearchCondition($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select name="cate4No" id="selCate5" onchange="fnChangeSearchCondition($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
 							</select>
 						</td>
 					</tr>
@@ -98,9 +83,9 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th>카테고리번호<i class="required" title="필수"></i></th>
+						<th>카테고리번호</th>
 						<td>
-							<input type="text" class="w200" name="cateNo" placeholder="자동생성" disabled="disabled" required="required" data-valid-name="카테고리번호"/>
+							<input type="text" class="w200" name="cateNo" placeholder="자동생성" readonly="readonly"/>
 						</td>
 						<th>카테고리명<i class="required" title="필수"></i></th>
 						<td class="infoTxt">
@@ -108,47 +93,52 @@
 						</td>
 						<th>카테고리유형<i class="required" title="필수"></i></th>
 						<td>
-							<select name="cateType" id="cateType" data-valid-name="카테고리유형">
+							<select name="cateType" data-valid-name="카테고리유형">
 								<option th:if="${cateTypeList}" th:each="oneData, status : ${cateTypeList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
 					</tr>
 					<tr>
-						<th>상위카테고리<i class="star"></i></th>
+						<th>상위카테고리<i class="required" title="필수"></i></th>
 						<td colspan="5">
-							<input name="selLvl" type="hidden"/>
-							<select name="siteCd" id="cateLvl" data-valid-name="사이트" onchange="fnChangeSelectCateLvl($(this).val(), 1);">
-								<option value="null">[선택]</option>
-								<option th:if="${siteCdList}" th:each="oneData, status : ${siteCdList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							<input type="hidden" name="selLvl"/>
+							<select name="siteCd" data-valid-name="사이트">
+<!-- 								<option value="">[사이트]</option> -->
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							<select name="cateGb" id="cateLvl1" data-valid-name="카테고리구분" onchange="fnChangeSelectCateLvl($(this).val(), 2);">
-								<option value="">[선택]</option>
+							<select name="cateGb" id="cateLvl1" data-valid-name="카테고리구분" onchange="fnChangeUpperCategory($(this).val(), 1);">
+								<option value="">[카테고리구분]</option>
+								<option th:if="${cateGbList}" th:each="oneData, status : ${cateGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
-							<select name="tcateCd" id="cateLvl2" data-valid-name="대카테고리" onchange="fnChangeSelectCateLvl($(this).val(), 3);">
-								<option value="">[선택]</option>
+							<select name="cate1No" id="cateLvl2" data-valid-name="카테고리1" onchange="fnChangeUpperCategory($(this).val(), 2);">
+								<option value="">[카테고리1]</option>
 							</select>
-							<select name="mcateCd" id="cateLvl3" data-valid-name="중카테고리" onchange="fnChangeSelectCateLvl($(this).val(), 4);">
-								<option value="">[선택]</option>
+							<select name="cate2No" id="cateLvl3" data-valid-name="카테고리2" onchange="fnChangeUpperCategory($(this).val(), 3);">
+								<option value="">[카테고리2]</option>
 							</select>
-							<select name="scateCd" id="cateLvl4" data-valid-name="소카테고리" onchange="fnChangeSelectCateLvl($(this).val(), 5);">
-								<option value="">[선택]</option>
+							<select name="cate3No" id="cateLvl4" data-valid-name="카테고리3" onchange="fnChangeUpperCategory($(this).val(), 4);">
+								<option value="">[카테고리3]</option>
+							</select>
+							<select name="cate4No" id="cateLvl5" data-valid-name="카테고리4" onchange="fnChangeUpperCategory($(this).val(), 5);">
+								<option value="">[카테고리4]</option>
 							</select>
 						</td>
 					</tr>
 					<tr>
 						<th>노출순서<i class="required" title="필수"></i></th>
 						<td>
-							<input type="text" class="w100" name="dispOrd" maxlength="5" required="required" data-valid-type="integer" data-valid-name="노출순서"/>
+							<input type="text" class="aR w100" name="dispOrd" maxlength="5" required="required" data-valid-type="integer" data-valid-name="노출순서"/>
 						</td>
 						<th>정상이월구분</th>
 						<td>
 							<select name="formalGb">
-								<option th:if="${formalList}" th:each="oneData, status : ${formalList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+								<option value="">[선택]</option>
+								<option th:if="${formalGbList}" th:each="oneData, status : ${formalGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
 						<th>컨텐츠위치</th>
 						<td>
-							<select name="contentsLoc" disabled="disabled" required="required" data-valid-name="컨텐츠위치">
+							<select name="contentsLoc">
 								<option value="">[선택]</option>
 								<option th:if="${contentsLocList}" th:each="oneData, status : ${contentsLocList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
@@ -176,7 +166,7 @@
 				<li class="right">
 					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
 					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-					<button type="button" class="btn btn-base btn-lg" id="btnRef4Srch" th:if="${sessionInfo.roleCd == '0000'}">4SRCH 갱신</button>
+					<button type="button" class="btn btn-base btn-lg" id="btnRefresh4Srch" th:if="${sessionInfo.roleCd == 'G001_0000'}">4SRCH 갱신</button>
 				</li>
 			</ul>
 			<!-- //버튼 배치 영역 -->
@@ -189,6 +179,8 @@
 	let siteList = gagajf.convertToArray([[${siteList}]]);
 	let cateGbList = gagajf.convertToArray([[${cateGbList}]]);
 	let cateTypeList = gagajf.convertToArray([[${cateTypeList}]]);
+	let formalGbList = gagajf.convertToArray([[${formalGbList}]]);
+	let conentsLocList = gagajf.convertToArray([[${conentsLocList}]]);
 
 	let columnDefs = [
 		{
@@ -197,7 +189,7 @@
 		},
 		{
 			headerName: "카테고리구분", field: "cateGb", width: 150, cellClass: 'text-center',
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(cateGbList, params.value); }
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(cateGbList, params.value); }
 		},
 		{headerName: "카테고리번호", field: "cateNo", width: 150, cellClass: 'text-center'},
 		{
@@ -208,12 +200,18 @@
 		},
 		{
 			headerName: "카테고리유형", field: "cateType", width: 150, cellClass: 'text-center',
-			valueFormatter: function (params) { gagaAgGrid.lookupValue(cateTypeList, params.value); }
+			cellRenderer: function (params) { gagaAgGrid.lookupValue(cateTypeList, params.value); }
 		},
 		{headerName: "말단여부", field: "leafYn", width: 80, cellClass: 'text-center'},
 		{headerName: "노출순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
-		{headerName: "정상이월구분", field: "formalGb", width: 150, cellClass: 'text-center'},
-		{headerName: "컨텐츠위치", field: "contentsLoc", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "정상이월구분", field: "formalGb", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(formalGbList, params.value); }
+		},
+		{
+			headerName: "컨텐츠위치", field: "contentsLoc", width: 200, cellClass: 'text-center',
+			cellRenderer: function (params) { return gagaAgGrid.lookupValue(conentsLocList, params.value); }
+		},
 		{headerName: "노출여부", field: "dispYn", width: 80, cellClass: 'text-center'},
 		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'}
 	];
@@ -226,164 +224,174 @@
 			return;
 		
 		$("#btnNew").click();
-		var formId = '#detailForm';
-		$(formId + " input[name=cateNo]").val(event.data.cateNo);
-		$(formId + " input[name=cateNm]").val(event.data.cateNm);
-		$(formId + " select[name=cateType]").val(event.data.cateType);
-		$(formId + " input[name=dispOrd]").val(event.data.dispOrd);
-		$(formId + " select[name=formalGb]").val(event.data.formalGb);
-		$(formId + " select[name=contentsLoc]").val(event.data.contentsLoc);
-		$(formId + " input:radio[name=dispYn]:input[value="+event.data.dispYn+"]").click();
-		$(formId + " input:radio[name=useYn]:input[value="+event.data.useYn+"]").click();
-		var selLvl = $("#selLvl").val();
-		$("#cateLvl").html($("#selCate").html());
-		$("#cateLvl").val($("#selCate").val());
-		for(var i=1; i<5; i++){
-			$("#cateLvl"+i).html($("#selCate"+i).html());
-			$("#cateLvl"+i).val($("#selCate"+i).val());
-			if(i>=selLvl){
-				$("#cateLvl"+i).hide();
-			}else{
-				$("#cateLvl"+i).show();
+		$('#detailForm input[name=siteCd]').val(event.data.siteCd);
+		$('#detailForm input[name=cateNo]').val(event.data.cateNo);
+		$('#detailForm input[name=cateNm]').val(event.data.cateNm);
+		$('#detailForm select[name=cateType]').val(event.data.cateType);
+		
+		// 상위카테고리
+		var selLvl = $("#searchForm input[name=selLvl]").val();
+		for (let i = 1; i <= 5; i++) {
+			$("#cateLvl" + i).html($("#selCate" + i).html());
+			$("#cateLvl" + i).val($("#selCate" + i).val());
+			if (i >= selLvl) {
+				$("#cateLvl" + i).hide();
+			} else {
+				$("#cateLvl" + i).show();
 			}
 		}
-		$(formId + " input[name=selLvl]").val(selLvl);
-		if(event.data.cateType=="20"){
-			$(formId + " select[name=contentsLoc]").val(event.data.contentsLoc);
-			$(formId + " select[name=contentsLoc]").prop('disabled', false);
-			$(formId + " select[name=contentsLoc]").removeClass('formControl');
+		$('#detailForm input[name=selLvl]').val(selLvl);
+		
+		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
+		$('#detailForm select[name=formalGb]').val(event.data.formalGb);
+		$('#detailForm select[name=contentsLoc]').val(event.data.contentsLoc);
+		
+		// 카테고리유형에 따른 컨텐츠위치 설정 변경
+		if (event.data.cateType == 'G031_10') {
+			$('#detailForm select[name=contentsLoc]').prop('disabled', true);
+		} else if (event.data.cateType == 'G031_20') {
+			$('#detailForm select[name=contentsLoc]').prop('disabled', false);
 		}
+		
+		$('#detailForm input:radio[name=dispYn]:input[value=' + event.data.dispYn + ']').click();
+		$('#detailForm input:radio[name=useYn]:input[value=' + event.data.useYn + ']').click();
 	}
 
-	var fnChangeSelect = function(val, selLvl){
-		if (val == '') {
+	/**
+	 * 검색폼의 카테고리 선택 시
+	 */
+	var fnChangeSearchCondition = function(val, selLvl) {
+		if (gagajf.isNull(val)) {
 			if (selLvl > 1) {
 				selLvl = selLvl - 1;
 			} else {
 				selLvl = 1;
 			}
 		}
-		$("#selLvl").val(selLvl);
+		$('#searchForm input[name=selLvl]').val(selLvl);
 		
 		// Fetch data
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnChangeCategory);
-	}
-	
-	var fnChangeCategory = function(data){
-		var selLvl = $("#selLvl").val();
-		var cd = '';
-		var nm = '';
-		var html = '<option value="">[선택]</option>';
-		for (var i = 1; i < 5; i++) {
-			if (i > selLvl) {
-				$("#selCate"+i).html(html);
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', function(data) {
+			let selLvl = Number($('#searchForm input[name=selLvl]').val()) + 1;
+			
+			for (let i = 2; i <= 5; i++) {
+				if (i >= selLvl) {
+					$('#selCate' + i).html('<option value="">[카테고리' + (i - 1) + ']</option>');
+				}
 			}
-		}
-		
-		for (var i = 0; i < data.length; i++) {
-			if (data[i].useYn == 'Y') {
-				if (selLvl == '1') {
-					cd = data[i].cateGb;
-					nm = gagaAgGrid.lookupValue(cateGbList, cd);
-				} else {
-					cd = data[i].cateCd;
-					nm = data[i].cateNm;
+			
+			let tag = '';
+			for (let i = 0; i < data.length; i++) {
+				if (data[i].useYn == 'Y') {
+					tag += '<option value="' + data[i].cateNo + '">[' + data[i].cateNo + '] ' + data[i].cateNm + '</option>';
 				}
-				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
 			}
-		}
-		$("#selCate" + selLvl).html(html);
-		$("#btnNew").click();
+			
+			$("#selCate" + selLvl).append(tag);
+			$("#btnNew").click();
+		});
 	}
 	
-	var fnChangeSelectCateLvl = function(val, selLvl){
-		if(val==''){
-			if(selLvl>1){
-				selLvl = selLvl - 1;
-			}else{
-				selLvl = '';
-			}
+	// 카테고리유형 변경 시
+	$('#detailForm select[name=cateType]').on('change', function() {
+		if ($(this).val() == 'G031_10') { // 상품분류카테고리
+			$("#detailForm select[name=contentsLoc]").prop('disabled', true);
+		} else if ($(this).val() == 'G031_20') { // 컨텐츠카테고리
+			$("#detailForm select[name=contentsLoc]").prop('disabled', false);
 		}
-		$("#detailForm input[name=selLvl]").val(selLvl);
-		gagajf.ajaxFormSubmit($('#searchForm').prop('action'), "#detailForm", fnChangeCateLvl);
-	}
+	});
 	
-	var fnChangeCateLvl = function(data){
-		var selLvl = $("#detailForm input[name=selLvl]").val();
-		var cd = '';
-		var nm = '';
-		var html = '<option value="">[선택]</option>';
-		for(var i=1; i<5; i++){
-			if(i>selLvl){
-				$("#cateLvl"+i).html(html);
+	// 등록/수정폼의 상위카테고리 선택 시
+	var fnChangeUpperCategory = function(val, selLvl) {
+		if (gagajf.isNull(val)) {
+			if (selLvl > 1) {
+				selLvl = selLvl - 1;
+			} else {
+				selLvl = 1;
 			}
 		}
-		for(var i=0; i<data.length; i++){
-			if(data[i].useYn=='Y'){
-				if(selLvl=='1'){
-					cd = data[i].cateGb;
-					nm = gagaAgGrid.lookupValue(cateGbList, cd);
-				}else{
-					cd = data[i].cateCd;
-					nm = data[i].cateNm;
+		$('#detailForm input[name=selLvl]').val(selLvl);
+		
+		gagajf.ajaxFormSubmit($('#searchForm').prop('action'), "#detailForm", function(data) {
+			let selLvl = Number($('#detailForm input[name=selLvl]').val()) + 1;
+			
+			for (let i = 2; i <= 5; i++) {
+				if (i >= selLvl) {
+					$('#cateLvl' + i).html('<option value="">[카테고리' + (i - 1) + ']</option>');
 				}
-				html += '<option value="'+cd+'">['+cd+'] '+nm+'</option>';
 			}
-		}
-		$("#cateLvl"+selLvl).html(html);
+			
+			let tag = '';
+			for (let i = 0; i < data.length; i++) {
+				if (data[i].useYn == 'Y') {
+					tag += '<option value="' + data[i].cateNo + '">[' + data[i].cateNo + '] ' + data[i].cateNm + '</option>';
+				}
+			}
+			
+			$("#cateLvl" + selLvl).append(tag);
+		});
 	}
 	
-	// 카테고리 저장/수정
+	// 신규
+	$('#btnNew').on('click', function(){
+		$("#detailForm")[0].reset();
+// 		$("#detailForm input[name=selLvl]").val('');
+		for (let i = 2; i <= 5; i++) {
+			$("#cateLvl" + i).show();
+		}
+	});
+	
+	// 저장
 	$('#btnSave').on('click', function() {
-		var formId = '#detailForm';
-		var cateCd = $(formId + " input[name=cateCd]").val();
-		var cateNm = $(formId + " input[name=cateNm]").val();
+		// 입력 값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
 		
-		var cateType = $(formId + " select[name=cateType]").val();
-		var dispOrd = $(formId + " input[name=dispOrd]").val();
-		var formalGb = $(formId + " select[name=formalGb]").val();
-		var contentsLoc = $(formId + " select[name=contentsLoc]").val();
-		var dispYn = $(formId + " input:radio[name=dispYn]:checked").val();
-		var useYn = $(formId + " input:radio[name=useYn]:checked").val();
-		var siteCd = $(formId + " select[name=siteCd]").val();
-		var cateGb = $(formId + " select[name=cateGb]").val();
-		var tcateCd = $(formId + " select[name=tcateCd]").val();
-		var mcateCd = $(formId + " select[name=mcateCd]").val();
-		var scateCd = $(formId + " select[name=scateCd]").val();
-		var dcateCd = $(formId + " select[name=dcateCd]").val();
-		var selLvl = Number($(formId + " input[name=selLvl]").val());
-		if(cateNm==''){
-			gagajf.alertMessage(formId + " input[name=cateNm]", 'input');
-			return;
-		}
-		if(cateType==''){
-			gagajf.alertMessage(formId + " select[name=cateType]", 'select');
-			return;
-		}
-		if(dispOrd==''){
-			gagajf.alertMessage(formId + " input[name=dispOrd]", 'input');
-			return;
-		}
-		if(siteCd==''){
-			gagajf.alertMessage(formId + " select[name=siteCd]", 'select');
-			return;
+		let selLvl = Number($('#detailForm input[name=selLvl]').val());
+		if (gagajf.isNull($('#detailForm select[name=cate1No]').val())) {
+			if (selLvl > 2) {
+				mcxDialog.alertC('카테고리1을 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate1No]').focus();
+					}
+				});
+				return;
+			}
 		}
-		var testSelLvl = $("#selLvl").val();
-		if(tcateCd==''){
-			if(testSelLvl>2){
-				gagajf.alertMessage(formId + " select[name=tcateCd]", 'select');
+		
+		if (gagajf.isNull($('#detailForm select[name=cate2No]').val())) {
+			if (selLvl > 3) {
+				mcxDialog.alertC('카테고리2를 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate2No]').focus();
+					}
+				});
 				return;
 			}
-		}		
-		if(mcateCd==''){
-			if(testSelLvl>3){
-				gagajf.alertMessage(formId + " select[name=mcateCd]", 'select');
+		}
+		
+		if (gagajf.isNull($('#detailForm select[name=cate3No]').val())) {
+			if (selLvl > 4) {
+				mcxDialog.alertC('카테고리3을 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate3No]').focus();
+					}
+				});
 				return;
 			}
 		}
-		if(scateCd==''){
-			if(testSelLvl>4){
-				gagajf.alertMessage(formId + " select[name=scateCd]", 'select');
+		
+		if (gagajf.isNull($('#detailForm select[name=cate4No]').val())) {
+			if (selLvl > 5) {
+				mcxDialog.alertC('카테고리4를 선택해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm select[name=cate4No]').focus();
+					}
+				});
 				return;
 			}
 		}
@@ -391,69 +399,33 @@
 		mcxDialog.confirm('저장하시겠습니까?', {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var data = {
-						formId : formId,
-						cateCd : cateCd,
-						cateNm : cateNm,
-						cateType : cateType,
-						dispOrd : dispOrd,
-						formalGb : formalGb,
-						contentsLoc : contentsLoc,
-						dispYn : dispYn,
-						useYn : useYn,
-						siteCd : siteCd,
-						cateGb : cateGb,
-						tcateCd : tcateCd,
-						mcateCd : mcateCd,
-						scateCd : scateCd,
-						dcateCd : dcateCd,
-						selLvl : selLvl
-				};
-				var jsonData = JSON.stringify(data);
-				gagajf.ajaxJsonSubmit($(formId).prop('action'), jsonData, fnSaveCallback);
+			sureBtnClick: function() {
+				$("#detailForm select[name=contentsLoc]").prop('disabled', false);
+				
+				var jsonData = JSON.stringify($('#detailForm').serializeObject());
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+				});
 			}
 		});
 	});
 	
-	$("#btnRef4Srch").on("click", function(){
-		var data = [];
-		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/display/category/refresh4srch', jsonData, fnSaveCallback);
-	});
-	
-	// 신규 버튼 클릭
-	$("#btnNew").on("click", function(){
-		$("#detailForm")[0].reset();
-		$("#detailForm input[name=selLvl]").val('');
-		for(var i=1; i<5; i++){
-			$("#cateLvl"+i).show();
-		}
-	});
-	
-	$("#cateType").on("change", function(){
-		if($(this).val()=='20'){
-			$("#detailForm select[name=contentsLoc]").prop('disabled', false);
-			$("#detailForm select[name=contentsLoc]").removeClass('formControl');
-		}else{
-			$("#detailForm select[name=contentsLoc]").prop('disabled', true);
-			$("#detailForm select[name=contentsLoc]").addClass('formControl');
-		}
+	// 카테고리 갱신
+	$("#btnRefresh4Srch").on("click", function() {
+		mcxDialog.confirm('갱신하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxJsonSubmit('/display/category/refresh', null);
+			}
+		});
 	});
 	
-	var fnSaveCallback = function() {
-		// Fetch data
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm', fnChangeCategory);
-		$("#btnNew").click();
-	}
-	
 	$(document).ready(function() {
 		// Create a agGrid
 		gagaAgGrid.createGrid('gridList', gridOptions);
 		
 		$("#detailForm select[name=contentsLoc]").prop('disabled', false);
-		gagajf.setDate('schStDate', 'schEdDate', 't');
-		fnChangeSelect($("#selCate").val(), 1);
 	});
 /*]]>*/
 </script>