
[근황]
프로젝트의 기능 구현도 마무리 되어가고 인턴 생활의 끝이 다가오면서 남은 연차를 소진하여 일본으로 2박3일 여행을 다녀왔다. 자유로운 회사 분위기 덕분에 눈치 안 보고 제대로 푹 쉬고 왔다! 인턴을 시작하고 월급을 받아 별다른 것을 사지는 않고 항상 모아두고 있었는데, 모아둔 돈으로 이번에 여행 다녀오며 먹을 것과 옷 사는 것에 탕진해서 다시 통장 잔고는 텅장으로 돌아왔다. 그래도 인턴쉽 기간 동안 주말에도 쉼 없이 공부를 해왔는데 덕분에 잠시 개발은 멈추고 확실히 리프레시 할 수 있었다.

[관리자 별로 메뉴 권한 부여하기]
관리자 페이지 리뉴얼 프로젝트 개발을 하면서 중요한 기능 중 하나가 바로 관리자별로 각각 다른 메뉴 접근 권한을 부여하는 것이었다. 메뉴와 관리자 모델은 이미 생성이 되어있는 상태이므로, 두 모델 간의 관계를 어떻게 정의를 할 것인지가 중요했다. 우선 DB 관계를 정의하기 전 요구사항 먼저 파악하는 것이 중요했다.
기능의 요구사항은 다음과 같았다.
1. 관리자의 권한에 따라 접근할 수 있는 메뉴가 다르다.
2. 하나의 관리자가 여러개 의 메뉴에 대해 접근 권한을 가질 수 있으며, 한 메뉴에 대한 접근 권한을
여러 명이 가질 수 있다.
관리자가 다수의 메뉴에 접근할 수 있으며 반대로 하나의 메뉴에 여러 사용자가 접근 가능함을 고려하면 M:N의 관계로 표현하는 것이 적절해 보였다. 이를 구현하기 위해선 맵핑 테이블이 필요했는데 이를 위해 UserMenuPermission 모델을 생성하였다. 이 모델은 각각의 사용자와 메뉴를 연결해 주어 메뉴 접근 권한을 관리자별로 부여할 수 있게 해준다. 이런 방식을 이용하면 사용자나 메뉴가 추가/변경/삭제 되더라도 UserMenuPermission을 업데이트 함으로써 쉽게 권한을 조정할 수 있게 된다.


그렇다면 관리자 별로 메뉴 권한을 부여한 뒤 이것을 어떻게 접근 제어할까?
이 문제는 DRF(Django Rest Framework)의 Permissions을 활용함으로써 간단히 해결할 수 있었다. DRF의 권한 시스템은 view가 시작되기 전에 먼저 요청의 권한 여부를 확인하며 해당 접근 권한이 있으면 요청의 접근을 허용한다. 이는 API의 다른 부분들을 사용자에 따라 접근을 허용할지 거부할지 결정하는 기능을 제공한다. DRF에서 기본적으로 제공하는 Permissions들이 있지만 기본 기능만으로는 부족한 감이 있었다. 따라서 우리 프로젝트의 요구 사항에 맞게 Permissions를 커스텀하여 구현하였다.















