it leader

예정 작업 목록

   - 메뉴 리스트 메뉴 아이콘 푯시

   - 파일 업로드 구현 ( 유저 프로필 )

   - 권한별 메뉴 리스트 업

 

작업목표

   - 유저 프로필 업로드 구현

   - 유저 권한별 메뉴 리스트업 

 

이슈

    - mysql 에서 JSON으로 저장된 내역의 파싱 작업

   - mysql 5.7 버전 이상에서 동작하며, json 관련 함수에 대한 숙지가 필요

   - json의 depth가 깊어질수록 쿼리의 작성의 복합도가 증가한다.

 

해결

/* 이와 같은 json data가 db에 저장되어 있다고 하면 쿼리에서 파싱해서 해당 조건을
만족하는 목록을 불러오기 위햇서는 json 관련 함수를 사용하여야 한다.

[
	{"auth_cd":"MSTR","auth_nm":"마스터관리자","c":"N","r":"Y","u":"N","d":"N"}
    ,{"auth_cd":"MNGR","auth_nm":"관리자","c":"N","r":"Y","u":"N","d":"N"}
    ,{"auth_cd":"USR","auth_nm":"일반사용자","c":"N","r":"Y","u":"N","d":"N"}
    ,{"auth_cd":"GST","auth_nm":"방문자","c":"N","r":"Y","u":"N","d":"N"}
]
*/

// json_extract(data , '$.탐색할 key' )
// ex) json_extract( data,'$.auth_cd')

// 그렇지만, 위와 같은 구조에서는 먼저 배열에서 몇번째 값을 가져올 것인지를 먼저정해야한다.
// parameter로 위의 json에서 몇번째 인덱스를 참조할 지를 받아와 동적으로 처리하였다.
// mybatis 에서 파라미터 값을 동적 처리하기 위해 CONCAT으로 문자열을 합쳐서 사용
// 쿼리는 아래와 같이 사용

SELECT
	Z.*
FROM
  (
    SELECT 
      ml.menu_nm
      , ml.menu_url
      , ml.menu_icon_url
      <if test=" idx != null and idx != ''">
      , json_extract(ml.auth_infos, CONCAT('$[',#{idx},']') ) as auth_info
      </if>
    FROM menu_list ml
    where
	    ml.use_yn = 'Y'
  )Z
WHERE
1=1 
AND json_extract(Z.auth_info, "$.r") = "Y"

회고

  싱글 파일에 대한 파일 업로드도 처리하였다. 생각보다 아직까지는 큰 이슈 없이 java 프레임웍에 비해 부족함은 없는것 같다.

  인터셉터도 간단하게 구현이 되어 로그인, 로그아웃, 세션 타임아웃 기능을 쉽게 구현할 수 있었다. 

  express-session 을 사용하여 세션 타임아웃 구현 하는 부분은 다른 글에서 다루도록 하겠다.

 

다음 작업 리스트

  - 헤더 쪽 유저 프로파일 부분, 세팅 부분 화면 구현

  - 권한별 버튼 보여주는 부분 구현

  - Docker image로 실 서버에 배포해보기

  - 관리자 페이지에서 어떤 기능을 더 추가할지 고민해보기

 

참고 사이트

코끼리를 냉장고에 넣는 방법 :: [MySQL] MySQL JSON 관련 함수 (tistory.com)

profile

it leader

@dev__pixui

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!