[Spring] 유저별로 메뉴 다르게 보이기
개요
유저 종류 별로 웹 페이지의 메뉴 및 페이지가 다르게 보이도록 Spring 기반의 백엔드로 구축하는 법에 대해 알아보자. 데이터 구축부터 mapper 설정까지 알아보자.
구현 절차
1. 데이터 구축
데이터 베이스 구축은 해당 게시물을 참조한다.
2021.06.28 - [Database] - [Database] 유저별로 메뉴 다르게 보이기
Spring을 활용하여 구축한 데이터베이스를 활용하여
프런트에 유저별 접근 가능한 메뉴 정보를 줄 것이다.
2. mapper java, mapper xml, data
생성Mybatis generator를 활용하여 Menu에 관한 mapper java, mapper xml, data를 생성한다.
3. 데이터를 다룰 DTO를 생성한다.
유저 정보, Menu 정보, 서브메뉴 정보를 담는다.
@Data
public class AdminAuthMenuResponse {
private Integer idx;
private Integer adminUserIdx;
private String name;
private String nameKr;
private String path;
private Integer parentIdx;
private Byte auth;
private List<Menu> subMenu;
}
4. Mapper.java에 사용할 메서드를 정의한다.
파라미터로 유저 idx를 넘겨 해당 유저가 사용 가능한 메뉴를 리턴할 메서드이다.
List<AdminAuthMenuResponse> getAllAdminAuthMenu(Integer idx);
5. Mapper.xml에 쿼리를 작성한다.
5-1. 리턴할 결과 데이터를 담을 resultMap을 생성한다.
collection을 통해 서브메뉴를 불러올 예정이다.
메뉴 IDX와 유저 IDX를 파라미터로 넘겨 해당 메뉴의 서브메뉴 중 유저가 사용 가능한 메뉴를 불러온다.
서브 쿼리는 3-3 참고
collection 작성법은 해당 게시글 참고
2021.06.18 - [Spring] - [Spring] MyBatis resultMap collection 사용법
<resultMap id="AdminAuthMenuMap" type="[경로].AdminAuthMenuResponse">
<id column="IDX" jdbcType="INTEGER" property="idx" />
<id column="ADMIN_USER_IDX" jdbcType="INTEGER" property="adminUserIdx" />
<result column="NAME" jdbcType="VARCHAR" property="name" />
<result column="NAME_KR" jdbcType="VARCHAR" property="nameKr" />
<result column="PATH" jdbcType="VARCHAR" property="path" />
<result column="PARENT_IDX" jdbcType="INTEGER" property="parentIdx" />
<result column="AUTH" jdbcType="TINYINT" property="auth" />
<collection property="subMenu" column="{idx=IDX, adminUserIdx=ADMIN_USER_IDX}" javaType="java.util.ArrayList" select="selectSubMenu"
ofType="[경로].Menu"/>
</resultMap>
5-2. Mapper.java에 정의된 메서드 이름으로 SQL 구문을 구현한다.
<select id="getAllAdminAuthMenu" parameterType="java.lang.Integer" resultMap="AdminAuthMenuMap">
select M.IDX, M.`NAME`, M.NAME_KR, M.PATH, M.PARENT_IDX, AUA.AUTH, AUA.ADMIN_USER_IDX
from admin_user_auth AUA
join menu M on AUA.MENU_IDX = M.IDX
where AUA.ADMIN_USER_IDX = #{adminUserIdx,jdbcType=INTEGER} AND AUA.AUTH = 1 AND M.PARENT_IDX = 0
</select>
5-2-1. 유저와 메뉴 테이블을 JOIN 하여 유저별 사용 가능 메뉴를 부른다.
5-2-2. 유저 IDX를 파라미터로 받아 유저별로 불러온다.
5-2-3. AUTH = 1을 통해 사용 가능한 메뉴만 불러온다.
5-2-4. PARENT_IDX = 0을 통해 루트 메뉴만 불러온다.
5-3. 서브 메뉴를 불러올 서브 쿼리를 작성한다. collection에 선언한 함수명으로 이름을 지정한다.
메뉴 테이블의 SELF JOIN을 통해 파라미터로 받은 메뉴의 서브 메뉴를 불러온다.
<select id="selectSubMenu" parameterType="java.util.Map" resultMap="BaseResultMap">
select m2.IDX, m2.NAME, m2.NAME_KR, m2.PATH, m2.PARENT_IDX
from admin_user_auth aua
inner join menu m on aua.MENU_IDX = m.IDX
inner join menu m2 on m.IDX = m2.PARENT_IDX
where m.IDX = #{idx}
and aua.ADMIN_USER_IDX = #{adminUserIdx}
and aua.AUTH = 1
</select>
6. 유저 클래스 세팅
Service.java에서 작성한 mapper 호출 후 유저 별 사용 가능 테이블 정보를 받아서 유저 클래스에 세팅 해준다. (유저 관련 데이터 및 메서드는 다른 분야라 해당 게시글에서는 생략)
List<AdminAuthMenuResponse> userMenuAuthes = menuMapper.getAllAdminAuthMenu(authenticationToken.getAdminUser().getIdx());
adminUser.setAdminAuth(userMenuAuthes);
'Spring' 카테고리의 다른 글
[Spring] Failed to determine a suitable driver class 오류 해결 방법 (0) | 2022.12.02 |
---|---|
[Spring] GET과 POST의 차이점 (0) | 2021.08.19 |
[Spring] Mybatis collections 파라미터 여러개 사용 시 주의점 (2) | 2021.06.28 |
[Spring] MyBatis resultMap collection 사용법 (0) | 2021.06.18 |
[Spring] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 오류 (0) | 2021.04.14 |
댓글