flowchart LR
Home[๋ฉ์ธํ๋ฉด]
SideBar(์ฌ์ด๋๋ฐ)
Header(ํค๋)
Footer(ํธํฐ)
List(๊ธ ๋ชฉ๋ก)
Home --- Header
Home --- Footer
Home --- SideBar
Home --- List
Detail[๊ธ ์์ธ ํ๋ฉด]
TagList[ํ๊ทธ ๋ชฉ๋ก ํ๋ฉด]
Tag[ํ๊ทธ๋ณ ๊ธ ํ๋ฉด]
Category(์นดํ
๊ณ ๋ฆฌ๋ณ ๊ธ ๋ชฉ๋ก)
Header -.-> Chatbot --- ChatbotResult -.-> Detail
SideBar -.-> TagList -.-> Tag -.-> Detail
SideBar -.-> Category -.-> Detail
List -.-> Detail
graph LR
Input["์
๋ ฅ ๋ฉ์์ง ๋ชฉ๋ก - START"]
Output["์ถ๋ ฅ ๋ฉ์์ง ๋ชฉ๋ก - END"]
LLM((OpenAI API))
PostDB((Post DB))
IsFirst{๋ฉ์์ง๊ฐ ํ๋์ธ๊ฐ?}
System(์์คํ
๋ฉ์์ง ์ถ๊ฐ)
Response(LLM ์๋ต ๋ฉ์์ง ์ถ๊ฐ)
IsFunction{LLM ์๋ต์ด ํจ์์ธ๊ฐ?}
PostResult(์ฐธ๊ณ ํ ๊ธ ๋ฉ์์ง ์ถ๊ฐ)
PostListMetadata((๊ธ ๋ชฉ๋ก ๋ฉํ ์ ๋ณด))
Input --> IsFirst
IsFirst --> |YES|System --> LLM
IsFirst --> |NO|LLM
PostListMetadata -.-> System
LLM --> Response
Response --> IsFunction
IsFunction --> |YES| PostDB --> PostResult --> LLM
IsFunction --> |NO| Output
Next.JS 14
TypeScript v5
Open AI API
tailwind-css
,tailwind-merge
,class-variance-authority
tanstack/react-query
@uiw/react-md-editor
&@uiw/react-markdown-preview
Supabase
OpenAI API Context
- ๋ฉ์์ง ํ๋๋ ์๋ก๊ณ ์นจ์ ์ ์ฅ
- ๋ฉ์์ง ๋ชฉ๋ก ๋ ๋๋ง ์ฑํ
์ ํจ์ ๋ฐ๋ผ ๋ฉ์์ง ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํด์ ๋ ๋๋ง ํ๋๋ฐ ํ์ฉ
- ์ ์ฅ์ด ๋๋ค๋ฉด, ์ ์ ๋จ์๋ก ๋์ด์ผ ํ์ง ์์๊น? O
- ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ ๋์์ ๋ ์ ์ฅ๋์ด์ผ ํ ๊น? O
- ์๋ฒ์์ DB๋ก ๊ด๋ฆฌํด์ผ ํ ๊น? X
- ํด๋ผ์ด์ธํธ์์ ์ํ๋ก ๊ด๋ฆฌํด์ผ ํ ๊น? -> O
ํธ๋ฌ๋ธ์ํ
- ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋ง๋ค๋ ค๋ฉด ๋ฌด์์ ์ ๊ฒฝ์จ์ผ ํ ๊น?
- LCP
- CLS
- FID
- NextJS ์์ SSR SSG ISR ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ!!
- ํ
์คํธ ์ฝ๋๋ฅผ ์ ์์ฑํ๋ ค๋ฉด ๋ฌด์์ ์ ๊ฒฝ์จ์ผ ํ ๊น?
- ๋ฐ๋ณต๋๋ ์ผ์ ์๋ํ ํ๊ธฐ์ํด์ ํ ์คํธ ์ฝ๋ ์์ฑ
- ์์ฑํ ์ฝ๋๊ฐ ์ ๋์ํ๋์ง ํ ์คํธ
- ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด์ผํ๋ ํ ์คํธ๋ฅผ ์๋ํ
- ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ๊ฒฝ์จ์ผ ํ๋ ์ฝ๋๊ฐ ์ฆ๊ฐ
- NextJS์ ์ต์ ํ ๋ ์ธํ๋ผ๋ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์ผ ํ ๊น?
- SSR ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌํ ๋ ์ ์ ๋ฆฌ์์ค์ ๋์ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฆฌํด์ ๋ฐฐํฌ.
- CDN ์๋ฒ ์ค์ AWS CloudFront(Edge Function) CDN ์บ์๊ฐ ๋ง๋ฃ๋ ๋๋ง๋ค ๋์ ๋ฆฌ์์ค ์ฌ์ฉ ์์ฒญ
- ๋์ ๋ฆฌ์์ค Scaling, Rolling Update
- SSR ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌํ ๋ ์ ์ ๋ฆฌ์์ค์ ๋์ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฆฌํด์ ๋ฐฐํฌ.
- NextJS์ ๋ง๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ์๊ฒผ์๊น?
- client component, server components ์ ์ ํ ๋ถ๋ฆฌ
-
์ ์ ํ ์บ์ฑ์์
-
ํ๋ฆฝํจ๊ณผ(์:์ ๋ชฉ, ์นดํ ๊ณ ๋ฆฌ, ํ๊ทธ ๋ค:๋ณธ๋ฌธ)
-
๋นํ์(์์ฑ ์ ID,PWD ์ ๋ ฅ) ์์ฑํ ์ ์๊ฒ ๋๊ธ ๊ธฐ๋ฅ ๊ตฌํ (CRUD)
- ์์ , ์ญ์ ์ ์ ๋ ฅํ๋ ID,PWD ์ ๋ ฅ
-
๋ฐฉ๋ฌธ๋ก ๊ธฐ๋ฅ ๊ตฌํ (CR)
- ์์ฑ ์ ๋๋ค์๋ง ์์ฑ
- ์ญ์ , ์์ ๋ถ๊ฐ
-
์์ ๊ธฐ๋ฅ ๊ตฌํ ํ ์ค์๊ฐ ์ฑํ ๊ตฌํ
- ๊ธฐ๋ฅ ์ ๊ฑฐ ๋ฐ ๊ตฌ์กฐ ๊ฐ์ :
- ๊ธฐ์กด ํฌํธํด๋ฆฌ์ค, ๊ด๋ฆฌ์, ๋ฐฉ๋ช ๋ก, ์ธ์ฆ ๊ด๋ จ ๊ธฐ๋ฅ ๋ฐ ํ์ผ๋ค์ ์ ๊ฑฐํ์ฌ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ํํ์ต๋๋ค.
- ๋งํฌ๋ค์ด ์ฝํ
์ธ ๊ตฌ์กฐ๋ฅผ ์ฌ์ ๋นํ์ฌ
public/markdown
๋๋ ํ ๋ฆฌ ์๋์Archive
,Career
,Design
,Learning
,Personal
,Projects
์ ๊ฐ์ ์๋ก์ด ์นดํ ๊ณ ๋ฆฌ๋ณ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์ ํ์ต๋๋ค.
- E2E ํ
์คํธ ๊ฐํ:
- Cypress๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ ํ์ด์ง ๋ฐ ๊ธฐ๋ฅ์ ๋ํ E2E ํ ์คํธ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธ ๋ฐ ์ถ๊ฐํ์ต๋๋ค.
cypress/e2e/portfolio.cy.ts
ํ์ผ์ ์ ๊ฑฐํ์ต๋๋ค.cypress/e2e/about.cy.ts
๋ฐcypress/e2e/contact.cy.ts
ํ์ผ์ ์๋ก ์ถ๊ฐํ์ฌ About ํ์ด์ง์ Contact ํผ์ ๋์์ ํ ์คํธํฉ๋๋ค.cypress/e2e/home.cy.ts
,cypress/e2e/navigation.cy.ts
,cypress/e2e/blog.cy.ts
,cypress/e2e/search.cy.ts
ํ์ผ๋ค์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ์ ๊ธฐ๋ฅ์ ๋ง์ถฐ ์ ๋ฐ์ดํธํ์ต๋๋ค.
-
.env
ํ์ผ ์์ฑ ํ ์๋ ๋ณ์๋ค์ ์ค์ ํฉ๋๋ค:NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
NEXT_PUBLIC_OPENAI_API=
NEXT_PUBLIC_ORGANIZATION_API=
-
ํ๋ก์ ํธ ์์กด์ฑ ์ค์น:
pnpm install
-
๊ฐ๋ฐ ์๋ฒ ์คํ:
pnpm dev
-
Cypress E2E ํ ์คํธ ์คํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด
http://localhost:3000
์์ ์คํ ์ค์ธ ์ํ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.- Cypress ํ
์คํธ ๋ฌ๋ UI ์ด๊ธฐ (ํ
์คํธ ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น
์ฉ):
pnpm cypress:open
- ๋ชจ๋ E2E ํ
์คํธ ํค๋๋ฆฌ์ค ๋ชจ๋๋ก ์คํ (CI/CD ํ๊ฒฝ์ ์ ํฉ):
pnpm cypress:run
- ํน์ E2E ํ
์คํธ ํ์ผ ์คํ (์:
home.cy.ts
):(๋ค๋ฅธ ํ ์คํธ ํ์ผ๋ค๋pnpm cypress:run --spec 'cypress/e2e/home.cy.ts'
--spec
์ต์ ๋ค์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ์คํํ ์ ์์ต๋๋ค.)
- Cypress ํ
์คํธ ๋ฌ๋ UI ์ด๊ธฐ (ํ
์คํธ ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น
์ฉ):