์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ(7) ๋ฉ”๋‰ด

2023. 3. 28. 16:42ใ†Spring

๋ฉ”๋‰ด ๊ธฐ๋Šฅ ๊ตฌํ˜„.

๊ด€๋ฆฌ์ž ๋ฉ”๋‰ด๋Š” ๋ฉ”์ธ ๋ฉ”๋‰ด์™€ ์„œ๋ธŒ ๋ฉ”๋‰ด 2๊ฐ€์ง€.

๋ฉ”๋‰ด ํ…Œ์ด๋ธ”, ์„œ๋ธŒ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ” ์ƒ์„ฑ

๋ฉ”๋‰ด๋Š” ๋”ฐ๋กœ insert ๊ธฐ๋Šฅ ํ•˜์ง€ ์•Š๊ณ  db์— ๋ฐ์ดํ„ฐ ๋„ฃ๊ณ  ์‹œ์ž‘

--๊ด€๋ฆฌ์ž ๋ฉ”๋‰ด ์ •๋ณด(์ƒ๋‹จ ๋ฉ”๋‰ด)
CREATE TABLE ADMIN_MENU (
    MENU_CODE VARCHAR2(20) CONSTRAINT MENU_PK PRIMARY KEY
    , MENU_NAME VARCHAR2(50) NOT NULL
    , MENU_URL VARCHAR2(100)
);

DELETE ADMIN_MENU;
INSERT INTO ADMIN_MENU VALUES('MENU_001', '์ƒํ’ˆ๊ด€๋ฆฌ', '/cateManage');
INSERT INTO ADMIN_MENU VALUES('MENU_002', 'ํšŒ์›๊ด€๋ฆฌ', '/memberManage');
INSERT INTO ADMIN_MENU VALUES('MENU_003', '์ฃผ๋ฌธ๊ด€๋ฆฌ', '/orderManage');

--์„œ๋ธŒ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ”
CREATE TABLE ADMIN_SUB_MENU (
    SUB_MENU_CODE VARCHAR2(20) CONSTRAINT SUB_MENU_PK PRIMARY KEY
    , SUB_MENU_NAME VARCHAR2(50) NOT NULL
    , SUB_MENU_URL VARCHAR2(100)
    , MENU_CODE VARCHAR2(20) CONSTRAINT MENU_FK
        REFERENCES ADMIN_MENU (MENU_CODE) ON DELETE CASCADE NOT NULL
);

INSERT INTO ADMIN_SUB_MENU VALUES ('SUB_MENU_001', '์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ', '/cateManage', 'MENU_001');
INSERT INTO ADMIN_SUB_MENU VALUES ('SUB_MENU_002', '์ƒํ’ˆ ๋“ฑ๋ก', '/regItem', 'MENU_001');
INSERT INTO ADMIN_SUB_MENU VALUES ('SUB_MENU_003', '์ƒํ’ˆ ์žฌ๊ณ ', '/stockManage', 'MENU_001');
INSERT INTO ADMIN_SUB_MENU VALUES ('SUB_MENU_004', '์ƒํ’ˆ ์ˆ˜์ •', '/updateItem', 'MENU_001');

db์— ๋„ฃ์€ menu ๋ฐ์ดํ„ฐ header.html์—์„œ ์กฐํšŒ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.

 

๋ฉ”์ธ ๋ฉ”๋‰ด ์กฐํšŒ ์ฟผ๋ฆฌ ์ž‘์„ฑ

	<!-- ๋ฉ”์ธ ๋ฉ”๋‰ด -->
	<select id="getAdminMenuList" resultMap="adminMenu">
		SELECT MENU_CODE
			, MENU_NAME
			, MENU_URL
		FROM ADMIN_MENU
		
	</select>

AdminService ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

	//๋ฉ”์ธ๋ฉ”๋‰ด ์กฐํšŒ
	List<AdminMenuVO> getAdminMenuList();

AdminServiceImpl ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

	//๋ฉ”์ธ ๋ฉ”๋‰ด 
	@Override
	public List<AdminMenuVO> getAdminMenuList() {
		return sqlSession.selectList("adminMapper.getAdminMenuList");
	}

 

AdminController ์ž‘์„ฑ

๋ฉ”๋‰ด ๋ชฉ๋ก์€ ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ์˜ฌ ๋•Œ ์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก๊ณผ ๊ฐ™์ด ์กฐํšŒ๋˜๋ฉด ๋จ.

	//์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/cateManage")
	public String cateManage(Model model) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("cateList", adminService.getCateListForAdmin());
		
		return "content/admin/cate_manage";
	}

header.html์— ์กฐํšŒํ•œ ๋ฉ”๋‰ด ๋ฆฌ์ŠคํŠธ ๋ฟŒ๋ ค์ฃผ๊ธฐ.

๋ฉ”๋‰ด ๋ชฉ๋ก์€ ๊ด€๋ฆฌ์ž์™€ ์ผ๋ฐ˜ํšŒ์›์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ ธ์•ผ ๋จ.

ํ˜„์žฌ ์ƒํƒœ ์ƒํ’ˆ๋ชฉ๋กํŽ˜์ด์ง€์— ์˜ค๋ฉด ์ผ๋ฐ˜ํšŒ์›์ด ๋ณด๋Š” ๋ฉ”๋‰ด๊ฐ€ ์กฐํšŒ๋˜๋Š” ์ƒํ™ฉ.

์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์™€ ๊ถŒํ•œ ์ •๋ณด์— ๋”ฐ๋ผ ๋ฉ”๋‰ด ๋‹ค๋ฅด๊ฒŒ ์กฐํšŒ๋˜๊ฒŒ ์„ค์ •.

<!-- ๋กœ๊ทธ์ธ X -->
<th:block th:if="${session.loginInfo == null}">
	<th:block th:each="category : ${categoryList}">
		<li class="nav-item">
			<a class="nav-link">[[${category.cateName}]]</a> 
		</li>
	</th:block>
</th:block>
							
<th:block th:unless="${session.loginInfo == null}">
	<!-- ๋กœ๊ทธ์ธ O, ์ผ๋ฐ˜ํšŒ์› -->
	<th:block th:if="${session.loginInfo.memRole =='USER'}">
		<th:block th:each="category : ${categoryList}">
			<li class="nav-item">
				<a class="nav-link">[[${category.cateName}]]</a> 
			</li>
		</th:block>
	</th:block>
	<!-- ๋กœ๊ทธ์ธ O, ๊ด€๋ฆฌ์ž -->
	<th:block th:if="${session.loginInfo.memRole =='ADMIN'}">
		<th:block th:each="adminMenu : ${adminMenuList}">
			<li class="nav-item">
				<a class="nav-link">[[${adminMenu.menuName}]]</a> 
			</li>
		</th:block>
	</th:block>
</th:block>

 

์„œ๋ธŒ ๋ฉ”๋‰ด๋„ ๋™์ผํ•˜๊ฒŒ ์ž‘์—….

 

์กฐํšŒ ์ฟผ๋ฆฌ

 

AdminService ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

 

AdminServiceImpl ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

 

์„œ๋ธŒ๋ฉ”๋‰ด๋Š” admin_side.html์— ๋ณด์—ฌ์ค˜์•ผ ํ•จ. ๊ฐ™์ด ํ™”๋ฉด์ด ์—ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ  ๊ฐ€๋Šฅ

 

html์— ๋ฟŒ๋ ค์ฃผ๊ธฐ

 

 

๊ฐ ์„œ๋ธŒ ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ ํŽ˜์ด์ง€ ์ด๋™

์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค html ์ƒ์„ฑ

์„œ๋ธŒ ๋ฉ”๋‰ด ํด๋ฆญํ•˜๋ฉด ๊ฐ๊ฐ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค aํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์คŒ

ํŽ˜์ด์ง€ ์ด๋™์€ ์กฐํšŒ๋œ subMenuUrl ๋ฐ์ดํ„ฐ ์ด์šฉ

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<th:block th:fragment="adminSideFragment">
	<div class="row">
		<div class="col">    <!-- active -->
			<div class="list-group"> <!-- ๋ฉ”๋‰ด์˜ ์ƒํ’ˆ ๊ด€๋ฆฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ  -->
				<th:bolck th:each="subMenu : ${subMenuList}">
					<a th:href="@{'/admin' + ${subMenu.subMenuUrl}}" class="list-group-item list-group-item-action">
						[[${subMenu.subMenuName}]]
					</a>
				</th:bolck>
			</div>
		</div>
	</div>
</th:block>	
</html>

๊ฐ๊ฐ์˜ ์„œ๋ธŒ๋ฉ”๋‰ด๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•ด๋„ ๋ฉ”๋‰ด์™€ ์„œ๋ธŒ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ ๋˜์–ด์•ผ ํ•จ.

ํ•ด๋‹น ํŽ˜์ด์ง€ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์œ„ ๋‘ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•ด์•ผ ๋จ.

	//์ƒํ’ˆ ๋“ฑ๋ก ํŽ˜์ด์ง€
	@GetMapping("/regItem")
	public String regItemForm(Model model) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/reg_item";
	}
	
	//์ƒํ’ˆ ์žฌ๊ณ  ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/stockManage")
	public String stockManage(Model model) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/stock_manage";
	}
	
	//์ƒํ’ˆ ์ˆ˜์ • ํŽ˜์ด์ง€
	@GetMapping("/updateItem")
	public String updateItem(Model model) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/update_item";
	}

 

 

๋‚ด๊ฐ€ ํด๋ฆญํ•œ ์„œ๋ธŒ ๋ฉ”๋‰ด์˜ class์— active ์†์„ฑ์„ ์ค˜์•ผ ํด๋ฆญํ•œ ๋ฉ”๋‰ด ์ƒ‰์ฃผ๊ธฐ

์–ด๋–ค ์„œ๋ธŒ ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

> subMenuCode (PK)๋กœ ํŒ๋‹จ ๊ฐ€๋Šฅ!

ํ•ด๋‹น ์„œ๋ธŒ ๋ฉ”๋‰ด์˜ url์„ ํ†ตํ•ด Controller๋กœ ์ด๋™ํ•  ๋•Œ ํ•ด๋‹น ์„œ๋ธŒ ๋ฉ”๋‰ด์˜ subMenuCode ๊ฐ’ ๊ฐ€์ ธ๊ฐ€์•ผ ๋จ.

<th:bolck th:each="subMenu : ${subMenuList}">
	<a th:href="@{'/admin' + ${subMenu.subMenuUrl}(subMenuCode=${subMenu.subMenuCode})}" class="list-group-item list-group-item-action">
		[[${subMenu.subMenuName}]]
	</a>
</th:bolck>

AdminController์—์„œ ๋ชจ๋“  ์„œ๋ธŒ ๋ฉ”๋‰ด ์ปจํŠธ๋กค๋Ÿฌ๋“ค์— subMenuCode ๊ฐ’ ๋ฐ›์•„์ฃผ๊ธฐ.

์ปค๋งจ๋“œ ๊ฐ์ฒด ์‚ฌ์šฉ subMenuCode ๋ฐ›์•„์คŒ > html๋กœ ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด(์ž๋™ ๋„˜์–ด๊ฐ)

ํ•ด๋‹น ์„œ๋ธŒ ๋ฉ”๋‰ด ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๊ฐ™์ด ์—ด๋ฆฌ๋Š” admin_side.html์—์„œ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๊ฐ€๋Šฅ

//์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/cateManage")
	public String cateManage(Model model, AdminSubMenuVO adminSubMenuVO) {
		
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		//์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("cateList", adminService.getCateListForAdmin());
		
		return "content/admin/cate_manage";
	}

//์ƒํ’ˆ ๋“ฑ๋ก ํŽ˜์ด์ง€						
	@GetMapping("/regItem")					
	public String regItemForm(Model model, AdminSubMenuVO adminSubMenuVO) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/reg_item";
	}
	
	//์ƒํ’ˆ ์žฌ๊ณ  ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/stockManage")
	public String stockManage(Model model, AdminSubMenuVO adminSubMenuVO) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/stock_manage";
	}
	
	//์ƒํ’ˆ ์ˆ˜์ • ํŽ˜์ด์ง€
	@GetMapping("/updateItem")
	public String updateItem(Model model, AdminSubMenuVO adminSubMenuVO) {
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		
		return "content/admin/update_item";
	}

admin_side.html์—์„œ subMenuCode ๋ฐ›์•„์คŒ.

์„œ๋ธŒ ๋ฉ”๋‰ด ์ด๋™ ์‹œ ํด๋ฆญํ•œ ์„œ๋ธŒ ๋ฉ”๋‰ด๊ฐ€ ๊ฐ€์ง„  subMenuCode์™€

์ปจํŠธ๋กค๋Ÿฌ์—์„œ admin_side.html๋กœ ์ „๋‹ฌํ•œ subMenuCode๊ฐ€ ๊ฐ™์œผ๋ฉด active ํด๋ž˜์Šค ์†์„ฑ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

th:classappend ์†์„ฑ ์‚ฌ์šฉ(๊ธฐ์กด class ์†์„ฑ์— ์กฐ๊ฑด์— ๋”ฐ๋ผ ์†์„ฑ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">


<th:block th:fragment="adminSideFragment">
	<div class="row">
		<div class="col">    <!-- active -->
			<div class="list-group"> <!-- ๋ฉ”๋‰ด์˜ ์ƒํ’ˆ ๊ด€๋ฆฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ  -->
				<th:bolck th:each="subMenu : ${subMenuList}">
					<a th:href="@{'/admin' + ${subMenu.subMenuUrl}(subMenuCode=${subMenu.subMenuCode})}" 
					class="list-group-item list-group-item-action" 
					th:classappend="${subMenu.subMenuCode == adminSubMenuVO.subMenuCode ? 'active' : ''}">
						<!-- ์„œ๋ธŒ ๋ฉ”๋‰ด๊ฐ€ ๊ฐ€์ง„ ๋ฉ”๋‰ด์ฝ”๋“œ == Controller์—์„œ ๊ฐ€์ ธ์˜จ ๋ฉ”๋‰ด ์ฝ”๋“œ -->
						[[${subMenu.subMenuName}]]
					</a>
				</th:bolck>
			</div>
		</div>
	</div>
</th:block>
</html>

 

๋ฌธ์ œ์ 

๊ด€๋ฆฌ์ž๋กœ ๋กœ๊ทธ์ธํ•ด์„œ ์ฒซ ํŽ˜์ด์ง€์ธ ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ active ์†์„ฑ ์ ์šฉ ์•ˆ ๋จ.

๋กœ๊ทธ์ธํ•˜๋ฉด ์ธ๋ฑ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ฐ€๋Š”๋ฐ ์ธ๋ฑ์Šค ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋กœ ์˜ฌ ๋•Œ๋Š” subMenuCode ๋ฐ์ดํ„ฐ ์•ˆ ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—.

์„œ๋ธŒ ๋ฉ”๋‰ด ์ฝ”๋“œ null์ผ ๋•Œ๋Š” ๊ฐ•์ œ๋กœ ๋ฉ”๋‰ด ์ฝ”๋“œ ๋„ฃ์–ด์คŒ.

	//์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/cateManage")
	public String cateManage(Model model, AdminSubMenuVO adminSubMenuVO) {
		//์ธ๋ฑ์Šค ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์˜ฌ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒ ๋ฉ”๋‰ด ์ฝ”๋“œ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ.
		if(adminSubMenuVO.getSubMenuCode() == null) {
			adminSubMenuVO.setSubMenuCode("SUB_MENU_001");
		}
		
		//๋ฉ”์ธ(์ƒ๋‹จ) ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("adminMenuList", adminService.getAdminMenuList());
		//์„œ๋ธŒ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("subMenuList", adminService.getSubMenuList());
		
		//์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํšŒ
		model.addAttribute("cateList", adminService.getCateListForAdmin());
		
		return "content/admin/cate_manage";
	}

 

ํ˜„์žฌ ์ƒํƒœ

AdminController์—์„œ ์„œ๋ธŒ ๋ฉ”๋‰ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋ฉ”๋‰ด๋“ค์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฉ”๋‰ด๋“ค์„ ์กฐํšŒํ•˜๊ณ  ์žˆ์Œ.

์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์œ„ํ•ด ์›๋ž˜ ํ•ด๋‹น Controller์˜ ์ฃผ๊ธฐ๋Šฅ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ์ผ๋“ค์„ ํ•˜๊ณ  ์žˆ์Œ (์ „์ฒ˜๋ฆฌ, ํ›„์ฒ˜๋ฆฌ)

์ „์ฒ˜๋ฆฌ ํ›„์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๋นผ์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ 

๊ทธ๋•Œ AOP, intercepter, filter ๋“ฑ์„ ์‚ฌ์šฉ.

 

 

Intercepter ์‚ฌ์šฉ

์ธํ„ฐ์…‰ํ„ฐ ํด๋ž˜์Šค MenuIntercepter ์ƒ์„ฑ

HandlerInterceptor๋ฅผ ๊ตฌํ˜„

postHandle ์˜ค๋ฒ„๋ผ์ด๋”ฉ

๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์„ ์œ„ํ•ด AdminService ์˜์กด์„ฑ ์ฃผ์ž…

๋ฐ์ดํ„ฐ ๋ณด๋‚ด๋ฉด์„œ ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ ๋ฉ”์†Œ๋“œ ์‹คํ–‰.

 

 

์–ธ์ œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰, ์–ด๋””์„œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ํ•  ์ง€ ์„ค์ •.

์„ค์ • ํด๋ž˜์Šค IntercepterConfig ์ƒ์„ฑ (์„ค์ • ํŒŒ์ผ)

WebMvcConfigurer๋ฅผ ๊ตฌํ˜„

@Configuration ์–ด๋…ธํ…Œ์ด์…˜ ๋ถ™์—ฌ์„œ ์„ค์ • ํŒŒ์ผ์ž„์„ ์ธ์‹, ๊ฐ์ฒด ์ƒ์„ฑ

์˜ค๋ฒ„๋ผ์ด๋”ฉ

package com.study.shop.intercepter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class IntercepterConfig implements WebMvcConfigurer{

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
								//์•„๋ž˜ ๊ฐ์ฒด ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ ์‹คํ–‰
		registry.addInterceptor(getMenuIntercepter())
				.addPathPatterns("/admin/cateManage") //์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
				.addPathPatterns("/admin/regItem") //์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
				.addPathPatterns("/admin/stockManage") //์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
				.addPathPatterns("/admin/updateItem"); //์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	}
	
		//@Bean : ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ, ๋ฆฌํ„ด๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ (ํ”„๋กœ์ ํŠธ run๊ณผ ๋™์‹œ์—)
		@Bean    //๋งŒ๋“  ์ธํ„ฐ์…‰ํ„ฐ ํด๋ž˜์Šค
		public MenuIntercepter getMenuIntercepter() {
			return new MenuIntercepter();  //์ƒˆ๋กœ์šด ๋ฉ”๋‰ด ์ธํ„ฐ์…‰ํ„ฐ ๋งŒ๋“ค์–ด์„œ ๋ฆฌํ„ดํ•ด์คŒ
			
		}
}

Controller์—์„œ ๋ฉ”๋‰ด ์กฐํšŒ ๋ฉ”์†Œ๋“œ ๋‹ค ์‚ญ์ œํ•ด์ฃผ๊ธฐ. ์ด์ œ๋Š” ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ๋‹ค ํ•จ.

 

 

๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋กœ ์ด๋™๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ธฐ๋Šฅ ์ธํ„ฐ์…‰ํ„ฐ๋กœ ์ถ”๊ฐ€

์ ‘์† ๊ถŒํ•œ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€ ์ด๋™ ๋ชปํ•˜๊ฒŒ ์„ค์ •ํ•  ์ธํ„ฐ์…‰ํ„ฐ AuthoIntercepter ์ƒ์„ฑ

HandlerInterceptor ๊ตฌํ˜„

preHandle() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

package com.study.shop.intercepter;

import org.springframework.web.servlet.HandlerInterceptor;

import com.study.shop.member.vo.MemberVO;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

public class AuthoIntercepter implements HandlerInterceptor{
	
	//๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘๊ทผ์„ ๋ง‰๋Š” ๊ธฐ๋Šฅ
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		HttpSession session = request.getSession();
		MemberVO loginInfo = (MemberVO)session.getAttribute("loginInfo");
		
				//null์ด๋ฉด true
		boolean condition1 = loginInfo == null;
				//๊ด€๋ฆฌ์žX๋ฉด true
		boolean condition2 = loginInfo != null && loginInfo.getMemRole().equals("USER");
		
		
		if(condition1 || condition2) {
			response.sendRedirect("/");
			return false;
		}
		
		return true;
	}
	
	

}

IntercepterConfig ์ž‘์—…

package com.study.shop.intercepter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class IntercepterConfig implements WebMvcConfigurer{

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
							
		
					//์•„๋ž˜์˜ ๊ฐ์ฒด ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ ์‹คํ–‰
		registry.addInterceptor(getMenuIntercepter())
				.order(2)
				.addPathPatterns("/admin/cateManage") //์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
				.addPathPatterns("/admin/regItem") 
				.addPathPatterns("/admin/stockManage") 
				.addPathPatterns("/admin/updateItem"); 
		
		//ajax ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ์—๋Š” ์ธํ„ฐ์…‰ํ„ฐ ์ œ์™ธ ์‹œ์ผœ์•ผ ํ•จ.(ajax ๊ฐ™์ด ์“ฐ๋ฉด ์ถฉ๋Œ)
		registry.addInterceptor(getaAuthoIntercepter())
				.order(1) //์ธํ„ฐ์…‰ํ„ฐ ์ค‘ ์ฒซ๋ฒˆ์งธ๋กœ ์‹คํ–‰(์ˆœ์„œ ์ง€์ •)
				.addPathPatterns("/admin/**") //๊ด€๋ฆฌ์ž ๊ด€๋ จ ํŽ˜์ด์ง€ ๋“ค์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค
				.excludePathPatterns("/admin/*Ajax"); //*Ajax๋กœ ๋๋‚˜๋Š” ์ด๋™๊ฒฝ๋กœ ์ œ์™ธ
	}
	

		//@Bean : ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ, ๋ฆฌํ„ด๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ (ํ”„๋กœ์ ํŠธ run๊ณผ ๋™์‹œ์—)
		@Bean    //๋งŒ๋“  ์ธํ„ฐ์…‰ํ„ฐ ํด๋ž˜์Šค
		public MenuIntercepter getMenuIntercepter() {
			return new MenuIntercepter();  //์ƒˆ๋กœ์šด ๋ฉ”๋‰ด ์ธํ„ฐ์…‰ํ„ฐ ๋งŒ๋“ค์–ด์„œ ๋ฆฌํ„ดํ•ด์คŒ
			
		}
		
		@Bean
		public AuthoIntercepter getaAuthoIntercepter() {
			return new AuthoIntercepter();
		}

}

**์ฃผ์˜์‚ฌํ•ญ

ajax์™€ intercepter ๊ฐ™์ด ์“ฐ์ง€ ๋ง๊ธฐ! ์ถฉ๋Œ๋ผ์„œ ์˜ค๋ฅ˜ ์ƒ๊น€.

ajax ์“ฐ๋Š” ๊ณณ์€ intercepter ์ œ์™ธ ์‹œํ‚ค๊ธฐ.

js์—์„œ ์ด๋™๊ฒฝ๋กœ /admin์ธ ๊ณณ์ธ๋ฐ ajax ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ์ด๋™ ๊ฒฝ๋กœ ๋งˆ์ง€๋ง‰์— Ajax ๋ถ™์—ฌ์ฃผ๊ธฐ

 

 

โ€ป ์„œ๋ธŒ ๋ฉ”๋‰ด ์ˆ˜์ •

DB์—์„œ 'SUB_MENU_004' ์‚ญ์ œ

DELETE ADMIN_SUB_MENU WHERE SUB_MENU_CODE = 'SUB_MENU_004';

'SUB_MENU_003'์„ ์ˆ˜์ • 

์ด์ „ ์„œ๋ธŒ ๋ฉ”๋‰ด์˜€๋˜ ์žฌ๊ณ  ๊ด€๋ฆฌ(๋ฉ”๋‰ด003)์™€ ์ƒํ’ˆ ์ •๋ณด ์ˆ˜์ •(๋ฉ”๋‰ด004) ๋ฉ”๋‰ด๋ฅผ 'SUB_MENU_003'์ธ ์ƒํ’ˆ๊ด€๋ฆฌ๋กœ ํ•ฉ์นจ.

UPDATE ADMIN_SUB_MENU
SET 
SUB_MENU_NAME = '์ƒํ’ˆ ๊ด€๋ฆฌ'
, SUB_MENU_URL = '/itemManage'
WHERE SUB_MENU_CODE = 'SUB_MENU_003';

 

์ด์ „ ์ž‘์„ฑํ•œ updateItem Controller ์ง€์›Œ์ฃผ๊ณ  update_item.html๋„ ์‚ญ์ œ

stock_manage.html์„ item_manage.html๋กœ ์ˆ˜์ •

์ƒํ’ˆ ์žฌ๊ณ  controller๋ฅผ ์ƒํ’ˆ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ controller๋กœ ์ˆ˜์ •.

	//์ƒํ’ˆ ๊ด€๋ฆฌ ํŽ˜์ด์ง€
	@GetMapping("/itemManage")
	public String stockManage(Model model, AdminSubMenuVO adminSubMenuVO) {
		
		return "content/admin/item_manage";
	}