Skip to content

๐Ÿ“† ์ผ์ •๊ด€๋ฆฌ ์›น ์„œ๋น„์Šค

Notifications You must be signed in to change notification settings

dee0518/Next_doWork

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Next_doWork


์†Œ๊ฐœ

doWork๋Š” ํ˜‘์—…์„ ์œ„ํ•ด ์Šค์ผ€์ฅด์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋กœ ๋งจ ์ฒ˜์Œ React๋กœ๋งŒ ๊ฐœ๋ฐœ๋˜์–ด์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์ฐจ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•ด๋‚˜๊ฐ€๊ณ  ์ง„์งœ ์„œ๋น„์Šค๋ฅผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ docs์™€ ์†Œ๊ฐœ ์›นํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ฐ€ ๋Š๊ปด๊ณ  SEO ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด SSR ๋ฐฉ์‹์˜ Next.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋˜ํ•œ CSR๊ณผ SSR์„ ์œ ๋™์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SEO๊ฐ€ ํ•„์š”์—†๋Š” ์„œ๋น„์Šค ๋ถ€๋ถ„์—์„œ๋Š” CSR๋กœ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค.


๊ธฐํš

  • ๋ธŒ๋ ˆ์ธ ์Šคํ† ๋ฐ

doWorkBrain

  • Process Flow

doWorkFlow


์ฃผ์š” ๊ธฐ๋Šฅ


Folder Structure

๐Ÿ“ Next_doWork/
โ”œโ”€โ”€ ๐Ÿ“ public/
|    โ””โ”€โ”€ ๐Ÿ“ images/
โ”œโ”€โ”€ ๐Ÿ“ src/
|    โ”œโ”€โ”€ ๐Ÿ“ components/
|    โ”œโ”€โ”€ ๐Ÿ“ constants/
|    โ”œโ”€โ”€ ๐Ÿ“ lib/
|    โ”œโ”€โ”€ ๐Ÿ“ database/
|    โ”œโ”€โ”€ ๐Ÿ“ hooks/
|    โ”œโ”€โ”€ ๐Ÿ“ pages/
|    โ”œโ”€โ”€ ๐Ÿ“ redux/
|    โ”œโ”€โ”€ ๐Ÿ“ styles/
|    โ”œโ”€โ”€ ๐Ÿ“ types/
|    โ””โ”€โ”€ ๐Ÿ“ utils/
โ”œโ”€โ”€ โš™๏ธ ts.confing.json
โ”œโ”€โ”€ โš™๏ธ next.confing.js
โ””โ”€โ”€ ๐Ÿ“ฆ package.json

Issue & Solve === ๋ฐฐ์šด์ 

  1. Portal ์ƒ์„ฑ์‹œ document is not defined๋ฌธ์ œ
  • ์›์ธ
    1. Next.js๋Š” SSR๋กœ pre-rendering๋˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ์˜ document๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ.
    2. pre-rendering๋œ React tree์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ Renderingํ•˜๋Š” ๋™์•ˆ Rendering๋œ React tree๊ณผ mismatch๋๊ธฐ ๋•Œ๋ฌธ.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : DOM mount๋œ ์ดํ›„์— useEffect๋กœ element ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ” createPortalํ•˜๋„๋ก ํ•จ.
    ๐Ÿงท ํ•ด๋‹น ๋ฌธ์ œ ๋ธ”๋กœ๊ทธ๊ฐ€๊ธฐ

  1. Typescript Generic ์ ์šฉ
  • ์›์ธ : ์ œ๋„ค๋ฆญ extends ํ•˜๋Š” ํƒ€์ž…์— id๊ฐ€ ์—†์–ด ํ•ด๋‹น ํ‚ค๋ฅผ ๋ชป ์ฐพ์Œ (์ œ์•ฝ์กฐ๊ฑด์„ ์ƒ์†์œผ๋กœ ์ž˜๋ชป ์ดํ•ด)
  • ํ•ด๊ฒฐ : ์ œ๋„ค๋ฆญ extends๋ฅผ ์ ์ ˆํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๊ฒƒ์œผ๋กœ ํƒ€์ž… ์ง€์ •.
    ๐Ÿงท ํ•ด๋‹น ๋ฌธ์ œ ๋ธ”๋กœ๊ทธ๊ฐ€๊ธฐ

  1. Next-auth ๋ฐ MongoDB
  • Next-auth๋ฅผ ์“ด ์ด์œ  Next.js์—์„œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋˜ํ•œ JWT๋ฅผ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค์— ์ €์žฅํ•ด์ฃผ๋Š” ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ์ฒดํฌํ•˜๊ธฐ๊ฐ€ ๊ฐ„ํŽธํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ธ์ฆ ๋ฐฉ์‹ JWT์™€ OAuth์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ง›๋ณด๊ธฐ ์ •๋„๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ Next-auth๋ฅผ ์“ฐ๋ฉด์„œ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•ด์•ผํ•˜๋Š”์ง€๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๊ณ  ์ด์— ๋Œ€ํ•ด ๋ธ”๋กœ๊ทธ๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค.
    ๐Ÿงท ์ธ์ฆ ๋ฐฉ์‹๊ด€๋ จ ๋‚ด์šฉ ๋ธ”๋กœ๊ทธ๊ฐ€๊ธฐ
  • Next-auth & MongDB ์—ฐ๊ฒฐ
    ๐Ÿงท ํ•ด๋‹น ๋ฌธ์ œ ๋ธ”๋กœ๊ทธ๊ฐ€๊ธฐ

  1. ํƒ€์ž„๋ผ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๊ณ ๋ฏผ : view๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ๊ฒƒ์ธ๊ฐ€.

  • ๋ฐฉ์•ˆ : ํ•˜๋ฃจ์”ฉ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ vs ์ฃผ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ

    1. 1 ๋ฒˆ์งธ ๋ฐฉ์•ˆ์˜ ๊ฒฝ์šฐ ์ผ์ž๋งˆ๋‹ค ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ 2 ๋ฒˆ์งธ ์ฃผ๋งˆ๋‹ค ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ๋ฐฐ์—ด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    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;
 }

ํšŒ๊ณ 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํšŒ๊ณ ๋ก์—์„œ ๐Ÿ‘‰์—ฌ๊ธฐ

About

๐Ÿ“† ์ผ์ •๊ด€๋ฆฌ ์›น ์„œ๋น„์Šค

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages