[PWA] (35)Admin테이블이 따로 필요한가?

Kimmy·2025년 6월 20일

PWA_PROJECT

목록 보기
47/47

Admin테이블이 필요한지?

권한에 대한 고민을 함.
지금은 user테이블에서 role컬럼을 추가하고, 회원가입시, USER/ADMIN을 구분하는 구조인데. 다른사람들이 한 프로젝트를 참고하니 ADMIN 테이블이 따로 있어서, 이처럼 해야하는지 사례들을 찾아보았다.

🔚 결론먼저

지금 구조(User + role)로 충분히 강력하게 권한을 분기할 수 있고, 대부분의 경우에는 Admin 테이블을 따로 만들 필요는 없다.

Unless,
-운영자/가게주인의 고유한 속성이 많고 일반 사용자와 데이터가 겹치지 않을 때
-인증 및 접근 로직이 복잡하게 달라져야 할 때
-가게주인과 시스템 관리자의 역할이 엄청나게 다르고 분리된 데이터 흐름이 필요할 때

관리자의 역할이 주로, 예약 승인, 리뷰 삭제, 이벤트 등록 — 정도라면 지금처럼 User 모델 + role enum을 세분화하는 방식으로 충분히 구현 가능하고, 효율적이다.

🔍 필요없는 이유

✅ 1. 권한 체크는 role 기반으로 분기

if (user.role === 'MANAGER') {
  // 예약 승인 가능
}

MANAGER(가게주인)인 경우에만 예약을 승인하도록 하기. 데이터 모델을 굳이 나눌 필요 없이, 서비스 로직에서 역할만 구분하면 충분히 관리 가능함.

✅ 2. 가게주인 ↔ 매장 연관은 User - Shop 관계로 해결

model Shop {
  ...
  ownerId Int
  owner   User @relation(fields: [ownerId], references: [id])
}

이렇게 하면 shop.ownerId === user.id인지 확인만 해도 "이 유저가 이 매장의 주인인가?" 판단할 수 있음.

✅ 3. 삭제, 등록 등의 기능도 권한 체크만 하면 됨

리뷰 삭제: if (user.role === 'MANAGER' || user.role === 'ADMIN')

이벤트 등록: if (user.role === 'MANAGER')

프론트엔드와 백엔드에서 이 role만 잘 확인하면 실제 기능 제한은 어렵지 않게 구현할 수 있음.

마이페이지에 내정보 출력하기

로그인했는데도, 마이페이지 접속시 '로그인이 필요한 서비스입니다.'라는 문구출력되는중

localStorage 에서 db연결로 수정필요함.

Console Error

React has detected a change in the order of Hooks called by MyPage. This will lead to bugs and errors if not fixed.
Previous render Next render

이 에러는 "Hooks의 호출 순서가 변경되었다"는 의미.
즉, 조건문(if, for, return 등) 안에서 useEffect, useState 등 훅을 호출하면 이런 문제 발생.

해결방법

모든 훅(useState, useEffect 등)은 컴포넌트 최상단에서, 조건문 밖에서만 호출해야함.
조건부 렌더링은 훅 아래에서 처리해야 함.

// 1. 모든 훅 선언
const [checkingLogin, setCheckingLogin] = useState(true);
// ...다른 useState, useEffect 등...

useEffect(() => {
  // ...로직...
}, []);

// 2. 훅 선언 이후에 조건부 렌더링
if (checkingLogin) return null; <-- 이 코드가 useEffect보다 위에 있으면 에러 발생


// 3. 나머지 렌더링 코드
return (
  // ...
);

useEffect가 총 3번 있었는데, 순서대로, 내정보/포인트/예약현황 에서 쓰이는 것들이었다. 그런데, 내가 지금 수정하고있는 부분은 내정보 이므로, 해당하는 useEffect 뒤에 바로 if (checkingLogin) return null; 이 코드를 넣었더니, 그뒤 나머지 2개의 useEffect 때문에 영향이 갔던것 같다. 서버 인증용으로 하나만 남기고 다른건 지우려고 했는데, 해당 파트는 다른 팀원들이 수정하는 부분이라 일단 꼭 필요한 내정보외에는 손대지 않았다.

임시방편 코드
alert랑, router.push 부분만 주석처리했더니, 마이페이지에 로그인한 유저 정보 출력은 된다.

  // 예약관련 
  useEffect(() => {
    const user = JSON.parse(localStorage.getItem("currentUser"));
    if (!user) {
      // alert("로그인이 필요한 서비스입니다222.");
      // router.push("/");
      return;
    }
profile
바리바리 개바리 🌼

0개의 댓글