광고를 보여줄 모달창을 만들었다.
구현하면서 내가 어떤 생각을 하면서 만들었는지 기록해보려고 한다.
광고 전용 모달창은 1일간 다시보지 않기 라는 기능이 있었기때문에 만료일이 필요했고 사용자가 브라우저를 이탈해도 유지되어 있어야했다.
하지만 생각해야 할 점이 하나있었다.
쿠키는 http요청을 보냈을 때 서버에 같이 전달된다.
서버에 부하올수도 있나?아직 서버에 부하가 올 정도로 모달창이 많지않기때문에 쿠키를 우선순위로 두었다.
직접 구현해야한다.만료일을 내가 직접 구현해야한다.
내가 만료일을 직접 구현해야한다는 것에 대해 내가 하는 사이드프로젝트에서는 굳이 라는 생각이 들었다.
export default function Home() {
const [open, setOpen] = useState(false);
const modalCookie = getCookie('ad-modal');
useEffect(() => {
setOpen(!modalCookie);
}, []);
return (
<main className={styles.main}>
<Banner />
<MainIntroduce />
{open && <AdvertisementModal setOpen={setOpen} />}
</main>
);
}
'use client';
import React, { useState } from 'react';
import classNamees from 'classnames/bind';
import Image from 'next/image';
import { setCookie } from 'cookies-next';
import styles from './index.module.scss';
type Props = {
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
};
const AdvertisementModal = ({ setOpen }: Props) => {
const cx = classNamees.bind(styles);
const oneDayInMillis = 24 * 60 * 60 * 1000;
const handleGetModalCookie = () => {
setOpen(false);
setCookie('ad-modal', true, {
expires: new Date(Date.now() + oneDayInMillis),
});
};
const handleModalClose = () => {
setOpen(false);
};
return (
<div className={cx('wrapper')}>
<div className={cx('image')}>
<Image
fill
src="https://images.unsplash.com/photo-1607083206869-4c7672e72a8a?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
alt=""
/>
</div>
<div className={cx('buttons')}>
<button
onClick={handleGetModalCookie}
className={cx('button-oneDay')}
type="button"
>
1일간 다시 보지 않기
</button>
<button
onClick={handleModalClose}
className={cx('button-close')}
type="button"
>
닫기
</button>
</div>
</div>
);
};
export default AdvertisementModal;
사용자가 메인페이지 진입 -> 쿠키의 유무 확인 -> 쿠키가 있다면 광고 x
사용자가 메인페이지 진입 -> 쿠키의 유무 확인 -> 쿠키가 없다면 광고 o
-> 닫기를 눌렀다면 그냥 모달창 닫기
-> 1일간 보지 않기를 눌렀다면 모달창을 닫으면서 쿠키 생성
Next.js로 프로젝트를 했는데 ssr의 장점을 못 살리고 있다.
얼른 성장해서 Next의 이점을 잘 활용해봐야 겠다.