본문 바로가기

[Spring] 유저별로 메뉴 다르게 보이기

곰곰킴 2021. 6. 29.

개요

유저 종류 별로 웹 페이지의 메뉴 및 페이지가 다르게 보이도록 Spring 기반의 백엔드로 구축하는 법에 대해 알아보자. 데이터 구축부터 mapper 설정까지 알아보자.

구현 절차

1. 데이터 구축

데이터 베이스 구축은 해당 게시물을 참조한다.

2021.06.28 - [Database] - [Database] 유저별로 메뉴 다르게 보이기

 

[Database] 유저별로 메뉴 다르게 보이기

개요 유저 별로 사이트의 메뉴가 다르게 나오기 위해 데이터베이스를 구축한다. 해당 프로그램에선 2 depth의 메뉴 리스트를 만들 예정이다. 구현 테이블은 2개가 필요하다. 1. 메뉴 테이블 2. 유저

gomgomkim.tistory.com

 

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 사용법

 

[Spring] MyBatis resultMap collection 사용법

개요 mybatis에서 테이블 간의 1:N 관계를 select 할 때 resultMap의 collection을 활용하여 서브쿼리 형식으로 데이터를 가져올 수 있다. 서브 쿼리를 직접 구현하지 않아도 되는 점에서 편리했다. 배달대

gomgomkim.tistory.com

 <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);

댓글