우리가 자주 사용하는 웹사이트에서는 권한에 따른 분기가 존재한다.
쿠팡 웹사이트를 예시로 들어보자.
이를 어떻게 사용하는가?
자바스크립트의 클로저는 다음 포스팅에 자세하게 다뤄보고,
일단 HOC를 이용한 로그인 유무를 확인해보겠다.
사용법 또한 크게 어렵지 않다.
먼저 공통 컴포넌트에 HOC 컴포넌트를 만들어준다.
import { useRouter } from "next/router";
import { useEffect } from "react";
// @ts-ignore
const withAuth = (Component) => (props) => {
const router = useRouter();
// 권한분기 로직 추가
useEffect(() => {
if (!localStorage.getItem("accessToken")) {
alert("로그인을 먼저 해야함");
router.push("/logins/login");
}
}, []);
return <Component {...props} />;
};
export default withAuth;
위 코드와 같이 useEffect
를 이용하여 렌더가 될때 조건을 걸어 로그인 여부를 확인을 해주는 코드를 작성한다.
import { gql, useQuery } from "@apollo/client";
import withAuth from "../../src/commons/componets/commons/hocs/withAuth";
export const FETCH_USER_LOGGED_IN = gql`
query fetchUserLoggedIn {
fetchUserLoggedIn {
email
name
}
}
`;
function MyPage() {
const { data } = useQuery(FETCH_USER_LOGGED_IN);
return (
<div>
<div>{data?.fetchUserLoggedIn.name}님 어서오세요</div>
<div>여기는 마이페이지 입니다.</div>
</div>
);
}
export default withAuth(MyPage);
그리고 위와 같이 컴포넌트를 export
해줄때 withAuth
에 매개변수로 렌더가 되는 컴포넌트를 넣어주게 되면 된다.
이를 실행하게 되면 먼저 withAuth
컴포넌트가 먼저 실행이 되고 로그인 여부를 검증을 하게 된후 로그인 토큰이 있다면 들어갈 수 있게 되고 없다면 조건에 걸려 강제로 로그인 페이지로 들어가게 된다.