doWork๋ ํ์ ์ ์ํด ์ค์ผ์ฅด์ ๊ด๋ฆฌํ ์ ์๋ ์๋น์ค๋ก ๋งจ ์ฒ์ React๋ก๋ง ๊ฐ๋ฐ๋์ด์์๋ค. ํ์ง๋ง ์ ์ฐจ ์๋น์ค๋ฅผ ํ์ฅํด๋๊ฐ๊ณ ์ง์ง ์๋น์ค๋ฅผ ํ๋ค๋ ์๊ฐ์ผ๋ก docs์ ์๊ฐ ์นํ์ด์ง๊ฐ ํ์ํ๋ค๊ฐ ๋๊ปด๊ณ SEO ์ต์ ํ๋ฅผ ์ํด SSR ๋ฐฉ์์ Next.js๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค. ๋ํ CSR๊ณผ SSR์ ์ ๋์ ์ผ๋ก ์ ํํ์ฌ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ SEO๊ฐ ํ์์๋ ์๋น์ค ๋ถ๋ถ์์๋ CSR๋ก ๊ฐ๋ฐํ๊ณ ์ ํ๋ค.
- ๋ธ๋ ์ธ ์คํ ๋ฐ
- Process Flow
- ๋์์ธ : doWork Figma
- BDD : doWork BDD ๋ฌธ์
๐ Next_doWork/
โโโ ๐ public/
| โโโ ๐ images/
โโโ ๐ src/
| โโโ ๐ components/
| โโโ ๐ constants/
| โโโ ๐ lib/
| โโโ ๐ database/
| โโโ ๐ hooks/
| โโโ ๐ pages/
| โโโ ๐ redux/
| โโโ ๐ styles/
| โโโ ๐ types/
| โโโ ๐ utils/
โโโ โ๏ธ ts.confing.json
โโโ โ๏ธ next.confing.js
โโโ ๐ฆ package.json
- Portal ์์ฑ์
document is not defined
๋ฌธ์
- ์์ธ
- Next.js๋ SSR๋ก pre-rendering๋๋ฉด์ ํด๋ผ์ด์ธํธ์ document๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ.
- pre-rendering๋ React tree์ ๋ธ๋ผ์ฐ์ ์์ Renderingํ๋ ๋์ Rendering๋ React tree๊ณผ mismatch๋๊ธฐ ๋๋ฌธ.
- ํด๊ฒฐ ๋ฐฉ๋ฒ : DOM mount๋ ์ดํ์ useEffect๋ก element ์ํ๋ฅผ ๋ฐ๊ฟ createPortalํ๋๋ก ํจ.
๐งท ํด๋น ๋ฌธ์ ๋ธ๋ก๊ทธ๊ฐ๊ธฐ
- Typescript Generic ์ ์ฉ
- ์์ธ : ์ ๋ค๋ฆญ extends ํ๋ ํ์ ์ id๊ฐ ์์ด ํด๋น ํค๋ฅผ ๋ชป ์ฐพ์ (์ ์ฝ์กฐ๊ฑด์ ์์์ผ๋ก ์๋ชป ์ดํด)
- ํด๊ฒฐ : ์ ๋ค๋ฆญ extends๋ฅผ ์ ์ ํ๊ณ ๋ช
ํํ ๊ฒ์ผ๋ก ํ์
์ง์ .
๐งท ํด๋น ๋ฌธ์ ๋ธ๋ก๊ทธ๊ฐ๊ธฐ
- Next-auth ๋ฐ MongoDB
- Next-auth๋ฅผ ์ด ์ด์ Next.js์์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์๊ฒ ํด์ค๋ค. ๋ํ JWT๋ฅผ ๋ฐ๊ธํ์ฌ ์๋์ผ๋ก ์ฟ ํค์ ์ ์ฅํด์ฃผ๋ ๋ก๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ธ์ ์ฒดํฌํ๊ธฐ๊ฐ ๊ฐํธํ์ฌ ์ฌ์ฉํ๊ฒ ๋์๋ค.
- ์ธ์ฆ ๋ฐฉ์
JWT์ OAuth์ ๊ดํ ๋ด์ฉ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ง๋ณด๊ธฐ ์ ๋๋ก๋ง ์๊ณ ์์๋ค. ํ์ง๋ง Next-auth๋ฅผ ์ฐ๋ฉด์ ์ด๋ค ์์ผ๋ก ๋์ํด์ผํ๋์ง๋ฅผ ์ ํ์๊ฐ ์์๊ณ ์ด์ ๋ํด ๋ธ๋ก๊ทธ๋ก ์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ค.
๐งท ์ธ์ฆ ๋ฐฉ์๊ด๋ จ ๋ด์ฉ ๋ธ๋ก๊ทธ๊ฐ๊ธฐ - Next-auth & MongDB ์ฐ๊ฒฐ
๐งท ํด๋น ๋ฌธ์ ๋ธ๋ก๊ทธ๊ฐ๊ธฐ
- ํ์๋ผ์ธ ๊ธฐ๋ฅ ๊ตฌํ
-
๊ณ ๋ฏผ : view๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ๊ฒ์ธ๊ฐ.
-
๋ฐฉ์ : ํ๋ฃจ์ฉ ๋ฐ์ดํฐ ๊ตฌ์ฑ vs ์ฃผ๋ง๋ค ๋ฐ์ดํฐ ๊ตฌ์ฑ
- 1 ๋ฒ์งธ ๋ฐฉ์์ ๊ฒฝ์ฐ ์ผ์๋ง๋ค ๋ฐฐ์ด์ ์์ฑํ๋ค ๋ณด๋ 2 ๋ฒ์งธ ์ฃผ๋ง๋ค ๋ฐฐ์ด์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ง์ ๋ฐฐ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์์ด์ผ ํ๋ค.
- top ์์น๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ํ์ฌ ๊ฐ์ top๊ฐ์ ๊ฐ์ง ์ผ์ ์ด ์๋์ง ํ์ธ์ ํด์ผํ๋ค. ์ด ๋ 2๋ฒ์งธ ๋ฐฉ์์ ํด๋น ์ฃผ์ ๋ฐฐ์ด๋ง ์ฒดํฌ๋ฅผ ํ๋ฉด ๋์ง๋ง 1๋ฒ์งธ ๋ฐฉ์์ ๋ชจ๋ ์ผ์ง๋ฅผ ์ฒดํฌํด์ผ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
-
์ฑํ : ์ ์ ๋ฐฐ์ด์ ์ฒดํฌํ์ฌ ๋ณต์ก๋๊ฐ ์ค ๊ฒ์ด๋ผ ์์๋๋ 2๋ฒ์งธ ๋ฐฉ์์ ์ ํ.
-
๊ตฌํ
- view๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด left, top, width๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํ์.
- ์ด์ ๊ฐ ์ผ์ ์ด ์ฃผ๋ง๋ค ์์ํ๋ start์ ๋๋๋ end๋ฅผ ๊ตฌํ์ฌ ์ ์ฅ. => left๋ start๊ฐ ๋๊ณ width๋ end - start๋ก ๊ตฌํ ์ ์์.
- top์ ํ ๋ ์ง์ ์ด 5๊ฐ์ ์ผ์ ์ ๋ณด์ฌ์ค ์ ์์ผ๋ฏ๋ก ํด๋น ์ฃผ์ top์ด ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋์ง ํ์ธํ์ฌ standard ๋ฐฐ์ด์์ ์ ๊ฑฐ. ๊ทธ ํ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์์๊ฐ ํด๋น ์ผ์ ์ top์ ์์น๊ฐ ๋จ.
while (gapDay >= 0 && startWeekIdx < timeTable.length) {
const start = isStarted ? fDay : 0;
const end = isStarted ? (fDay + gapDay > 6 ? 6 : fDay + gapDay) : gapDay < 7 ? gapDay : 6;
const standard = [0, 1, 2, 3, 4];
timeTable[startWeekIdx].forEach(t => {
if (!(t.start > end || t.end < start)) standard.splice(standard.indexOf(t.top), 1);
});
const top = standard[0] === undefined ? 5 : standard[0];
if (top === 5) moreTop = true;
timeTable[startWeekIdx] = [...timeTable[startWeekIdx], { _id, type: status, top, start, end, title }];
startWeekIdx += 1;
gapDay -= isStarted ? 7 - fDay : 7;
}
์์ธํ ๋ด์ฉ์ ํ๊ณ ๋ก์์ ๐์ฌ๊ธฐ