권한에 대한 고민을 함.
지금은 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연결로 수정필요함.
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;
}