๐ LinkAV Beta ๋ฆด๋ฆฌ์ฆ ๐
์๋ก
๐ linkav.net
์ด์ ์ Springboot์ Next.js ๊ธ์์ ํ์คํ์ ๊ฐ๋ฐํ ๊ฒฝํ์ ์ ์์๋๋ฐ
ํด๋น ํ๋ก์ ํธ์ ๋ํ ์๊ฐ์ด๋ค.
์ต์ํ์ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ถ ์ํ๋ผ ์ด๋ผํ๊ณ ๋ณด์๊ฒ์์ ์ ์์ผ๋
๊ทธ๋๋ ์ด๋ฐ ๋ ๊ธ์ ๋จ๊ฒจ๋๋ฉด ๋์ค์ ๋ค์ ๋ดค์ ๋ ์ฌ๋ฐ์ด์
์๊ธฐ๋ง์กฑ๋ฐ + ์๊ฐ์ฉ๋ฐ ๊ฐ์ฑ์ผ๋ก๋ค๊ฐ ๊ธ์ ์ ์ด๋ณด๋ ค๊ณ ํ๋ค.
LinkAV (Link Archive Vault) ๋ ์ด๋ค ์๋น์ค?
LinkAV๋ ๋งํฌ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ์๋น์ค์ด๋ค.
์ฝ์์์ ๋๋ฌ๋๋ฏ์ด (Vault๋ hasicorp์ vault์์ ๋ฐ์๋ค)
๋ธ๋ผ์ฐ์ ์์ ํ์คํ ๋ฆฌ๋ ๋ถ๋งํฌ๋ก ๊ด๋ฆฌํ๊ณ ์ถ์ง์์ url๋ค์
- web์์๋ ๋์๋ณด๋
chrome-extension์์๋ ๋จ์ถํค + ํ์(์ค๋น ์ค์ด๋ค โโ)
์์ ๊ฐ์ ๋ฐฉ์๋ค๋ก ํธ๋ฆฌํ๊ณ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
๋ ์ค๋ช
์ด ํ์์์ ๊ฒ ๊ฐ๋ค.
๋ง๋ณด๋ค๋ ๋์ผ๋ก ๋ณด๋ ๊ฒ ์ฝ๊ณ ๋น ๋ฅด๋ค.
์ง๋ฉด ์๊ฐ
Landing Page

๋๋ฉํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ดค๋ค.
์ฐธ๊ณ ํ ๋์์ธ์ ์๋์ ๊ฐ๋ค.
ํค๋์์ญ์ ๊ฒฝ์ฐ ์ผ๋จ Dashboard ๋๋ฉ์ธ์์๋ ๊ณต์ ๊ฐ ๋๋ค.
stickyํ๊ฒ ๋ง๋ค์ง๋ ๊ณ ๋ ค์ค์ด๋ค.
ํค๋์์ญ ์ค๋ฅธ์ชฝ์ ์์นํ AccountBox ์์ญ์
Login๊ณผ Signup์ ๋๋ฌ๋ด์ ๋ถ๋ฆฌํ๋ค.
๊ฒ์์ ํด๋ณธ ๊ฒฐ๊ณผ DropdownMenu๋ก ์ฒ๋ฆฌํ๊ฑฐ๋
๊ทธ๋ฅ ๋ฒํผ์ ํ๊ฐ๋ง ๋๊ณ ๋ฆฌ๋ค์ด๋ ์
๋ ๊ณณ์์ Tabs๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์๋ ์์๋ค.
์ถํ์ ๊ณ ๋ฏผํด๋ณผ ์ง์ ์ธ ๊ฒ ๊ฐ๋ค.
๋ณด๋ค์ํผ ๊ธฐ๋ฅ์ด Dashboard ํ๋๋ฟ์ด๋ผ ํค๋๊ฐ ํํ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํ๋์ฉ ์ฑ์๋๊ฐ ์๊ฐ์ด๋ค.
Sign In & Sign Up


Landing Page์ AccountBox์์ Sign In๊ณผ Sign Up์ ๋๋ฅด๋ฉด
์์ ๊ฐ์ ์นด๋๋ทฐ๊ฐ ๋ํ๋๋ค. main์์ญ๋ง ๊ต์ฒด๋๋ ๊ฒ์ด๋ค.
์ฌ๋ฌ ์๋ฌ ํธ๋ค๋ง์ ๋ํ Toast์
zod validation error๋ก ์์ฑ๋๋ FormMessage ๋ฑ
์ธ๋ถ์ ์ธ ์ฌํญ๋ค์ ์๋ตํ๋ค.
Sing In๊ณผ Sing Up์ ์ฐจ์ด๊ฐ ์ ๊ตฌ๋ณ๋์ง ์์์
์ด ์ง์ ๋ ๊ฐ์ ํด์ผํ ์ฌํญ์ธ๋ฏ ํ๋ค.
Dashboard

์ด๋ ๊ฒ ์ค๊ณํ ์ฃผ์ ๋ชฉ์ ์ ๋ค์๊ณผ ๊ฐ๋ค
- ์ฝ๊ฒ URL์ ์ถ๊ฐ / ์์ / ์ญ์ ํ ์ ์์ด์ผ ํ๋ค
- ์ถ๊ฐํ URL์ ์ฝ๊ฒ ํด๋ฆญํ ์ ์์ด์ผ ํ๋ค
- ๊ฐ URL์ category๊ฐ ์ง์ ๊ฐ๋ฅํด์ผ ํ๋ค
- ์ง์ ๋ category๋ ๊ฐ URL ์นด๋๋ณ๋ก ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ผ ํ๋ค
Video Card

Table๊ณผ Grid Card ๋ทฐ ์ฌ์ด์์ ๊ฐ๋ฑ์ด ์ข ์์์ผ๋
ํด๋ฆญํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ผ ํ๋ค๋ ์๊ฐ ๋๋ฌธ์
ํ์๋ก ๊ฒฐ์ ํ๋ค.
์์ ์ฌ์ง์ ์นด๋ ์ ์ค๋ฅธ์ชฝ ์๋จ์
DotsVertical ์์ด์ฝ์ ๋๋ ์ ๋ ๋ํ๋๋ ๋ทฐ์ด๋ค.
์ง๊ด์ ์ผ๋ก ์์ ํ๊ณ ์ญ์ ํ ์ ์๋๋ก ์นด๋ ์์ชฝ์ ๋ฐฐ์นํ๋ค.
Video Update & Delete Dialog


์ง๊ด์ ์ผ๋ก Update์ Delete๋ฅผ ํ ์ ์๋ค.
Update์ ๊ฒฝ์ฐ ์นด๋๊ฐ ๊ฐ์ง๊ณ ์๋ state๋ค์
input์ defaultValue๋ก ๋ฃ์ด์ฃผ๋ ๋์์ด ๊ตฌํ๋์ด ์๋ค.
Add Link

๋์๋ณด๋ ์ผ์ชฝ ์๋จ์ Add Link ๋ฒํผ์ ๋๋ฅด๋ฉด
์์ ๊ฐ์ Dialog๋ฅผ ๋ง๋ค์ด ์ค๋ค. Update Dialog์ ๊ฑฐ์ ์ ์ฌํ๋ค.
Category



๋์๋ณด๋ ์ผ์ชฝ ์๋จ์ Edit Category ๋ฒํผ์ ๋๋ฅด๋ฉด
Category๋ฅผ ๋ง๋ค๊ณ , ์์ ํ๊ณ , ์ญ์ ํ ์ ์๋ Dialog๋ฅผ ๋ณด์ฌ์ค๋ค.
๋ด๋ถ๋ Tabs๋ก ๊ตฌํํด๋ดค๋ค.
Avatar

Login ์ดํ session์ด ์กด์ฌํ๊ฒ ๋๋ฉด ์์ ๊ฐ์ Avatar๊ฐ ๋ํ๋๋ค.
ํด๋ฆญํ๋ฉด DropdownMenu๊ฐ ๋ํ๋๋ฉฐ ๋ค์ํ ์ ํธ์ ์ ๊ณตํ ์๊ฐ์ด๋ค.
ํ์ฌ๋ Log out๋ง ๊ตฌํ์ด ๋์ด์๋ค.
Filter & Pagination
์์ง ๊ตฌํ์ด ๋์ง ์์๋ค. ์ด์ ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
1. api ๋์์ธ์ ๊ฒฐํจ

์ผ๋จ ๋ณด๋ค์ํผ api ๋์์ธ์ด ์ข์ง ์๋ค.
- versioning์ด ๋์ด์์ง ์๋ค
- ์ด๋ค ๊ฒ์ param์ผ๋ก, ์ด๋ค ๊ฒ์ dto๋ก ์ฒ๋ฆฌํ๋ค
- ์ ํํ๋ ๋ช ํํ ์ปจ๋ฒค์ ๋ฐ ๊ธฐ์ค์ ์๊ฑฐํ ํ๋จ์ ํ์ง ์์๋ค
- ํํฐ์ ํ์ด์ง์ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํ๋์ด ์์ง ์๋ค
- ETC
- GlobalExceptionHandler ๋ฐ ControllerAdvice์ ๋ํด
validation (@Valid) ํ๋ก์ฐ๊ฐ ์ ๋๋ก ์กํ์์ง ์๋ค
- GlobalExceptionHandler ๋ฐ ControllerAdvice์ ๋ํด
์์ ๊ฐ์ ๋ฌธ์ ๋ค์ด ์๋๋ฐ ์ด๋ค์ ๊ธฐ๋ฅ ์ถ๊ฐ ์ ์
๋จผ์ ๋ฆฌํฉํ ๋ง ํ๋ฉด์ ์ก์๋ด๊ณ ์ถ์๋ค.
2. ์ ํ๋์ด์ผ ํ๋ ๋ฆฌํฉํ ๋ง๋ค
๋น๋จ Controller ๋ฌธ์ ๋ง์ ๋น์ฐํ ์๋๋ค.
์ด๋ฒ์ ๋ฆฌํฉํ ๋ง์ ํ๋ฉฐ Mapstruct์ QueryDSL์ ๋์
ํ๊ณ
์ด์ ๋ง์ถฐ์ Service, Repository ๋ํ ์์ ์ ํด์ผํ๋ค.
- entity์์ lazyloading๊ณผ ๊ด๋ จํ N+1 ๋ฌธ์
- QueryDSL ๋ ๋ฒจ์์ Projection์ ํด์ service๋ก ๋ณด๋ด๊ธฐ
- ํ์ฌ๋ ์ด๋ค ๊ฒ์ entity๋ฅผ ๊ทธ๋๋ก ๋ฆฌํดํ๊ณ ์ด๋ค ๊ฒ์ dto๋ก ๋ฆฌํดํ๋ค
- ์ ์ ๋ถ์ด๋๋ dto๋ค์ inner class๋ก ๋ฆฌํฉํ ๋ง
- dto์ ๋ํ naming convention์ ์ก์์ฃผ๊ธฐ
์ด๋ฐ ๊ฒ๋ค์ด ๋จผ์ ์ ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
๋๋จธ์ง ํ๊ธฐ
FE์ ์ข๋ ๊น๋ํ ๊ตฌ์กฐ๋ฅผ ..
์ด๋ฒ ๋ฆด๋ฆฌ์ฆ๋ฅผ ํ๋ฉฐ ์กฐ๊ธ ๋ cleanํ ์ํคํ
์ณ๋ฅผ
FE์์ ์ ์งํ๋๋ก ๋ฆฌํฉํ ๋ง ํ๋ค.
BE์ Category๋ผ๋ ์๋ก์ด Entity๊ฐ ์ถ๊ฐ๋๋ฉด์
FE์ชฝ์์ ๋ ๋ฆฌ๋ service, dto, zod์ schema ๋ค๋ ๊ฐ์ด ์์ ํด์ผ ํ๊ณ
๊ฒธ์ฌ๊ฒธ์ฌ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
eza๋ก Tree๋ฅผ ๊ธ์ด์ ๋ดค๋ค.
โฏ eza -T -L 2 -I "node_modules|docs|scripts|README.md|*.js|*.json|*.yaml|*.mjs|*.ts|*.tsx|*.css"
.
โโโ app
โ โโโ api
โ โโโ dashboard
โ โโโ signin
โ โโโ signup
โโโ components
โ โโโ auth
โ โโโ common
โ โโโ dashboard
โ โโโ ui
โโโ dto
โโโ hook
โโโ lib
โโโ public
โ โโโ images
โโโ service
โโโ state
โโโ styles
โโโ test
โ โโโ e2e
โ โโโ integration
โ โโโ unit
โโโ types
ํ ์คํธ์ ๋ํ์ฌ
BE ์์
์ ํด๋๊ณ FE์์ ์์
์ ํ๋ค๋ณด๋
์ด์ฉ ์ ์์ด ์์ํ์ง ๋ชปํ api ์ค๊ณ๋ค๊ณผ ์์ธ ์ฒ๋ฆฌ๋ค์ด ์ถ๊ฐ๋๋ค.
๋ฟ๋ง ์๋๋ผ ์ด๋ฌ๋ ๊ณผ์ ์์ ๋์ณค๋ ์ค์ ์ง์ ๋ค์ด ๋ฐ๊ฒฌ๋๊ณ
์ด์ ์์ ์ ํ๋ค๋ณด๋ ํ
์คํธ ์ฝ๋๋ค์ด ๋ง์ด ๊นจ์ง๊ฒ ๋์๋ค.

์ด ๊ธ ์๋ก ์์ ์ธ๊ธํ
ํ
์คํธ ํ๋ก์ฐ๋ ๋ถ์ฑ๋ก ๋จ๊ฒ ๋์๋ค.
์๋๋ฉด ํ
์คํธ ์์ฑ๋ง๊ณ ๋ ํด๋ด์ผ ํ๋๊ฒ ์ฐ๋๋ฏธ๋ก ์์ฌ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ง ๋ ๋น๋ถ๊ฐ ci์์
./gradlew clean build -x test
๋ฅผ ํ์ง์์๊น..
๋ฌผ๋ก domain -> repository -> service -> controller ํ๋ฆ์ผ๋ก
unit / integration ํ
์คํ
ํ๋ ๋ฐฉ์๊ณผ ํ๋ฆ์ ํ์ตํ ๊ฒ์
์ข์ ์์ฐ์ผ๋ก ๋จ์ ๊ฒ์์ ๋ถ๋ช
ํ๋ค.
mock์ ํด๋๊ฐ๋ฉฐ stub ๊ฐ์ฒด๋ฅผ ์
์
ํด์
ํ
์คํธ๊ฐ ์คํจํ๋ ์ผ์ด์ค๋ฅผ ์์ฑํด
์ฑ๊ณตํ๊ฒ๋ ์ฝ๋๋ฅผ ์ง๋ด๊ฐ๋ ๊ณผ์ ์ ํฅ๋ฏธ๋ก์ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ๋์์ด ๋์๋ค.
๋์์ ์ด๋ฐ์ ์๋ฏธ์์ด ์ง๋ฒ๋ฆฐ ํ
์คํธ์ฝ๋๋ค ๋ํ ๋ง์๋ค.
๊ทธ๋์ ์๊ฐ์ ์ด๋์ ๋ ๋ ๋ ค๋จน์ ๊ฒ ๋ํ ์ฌ์ค์ด๋ค.
Storybook์ ๋์ ํ์
์ถ๊ฐ๋ก ๊ธ์ ์ฐ๋ฉด์ ๋๋๊ฑด๋ฐ storybook์ ๋์ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
ํ์ฌ ๋๋ฉ์ธ์ด 1๊ฐ๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ง์ง ์์์ ๋คํ์ด์ง
์ปดํฌ๋ํธ๊ฐ ํจ์ฌ ๋ง์์ง๊ณ ํ๋ก์ฐ๊ฐ ๋ค์ํด์ง๋ฉด
๋ต์ด ์์ ๊ฒ ๊ฐ๊ณ ์์ผ๋ก ํฌ์คํ
์ด ๋ถ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
(Figma๋ก ๊ด๋ฆฌ์ค์ด์ง๋ ์๊ธฐ์ ๋์ฑ ๊ทธ๋ ๋ค.)
๋ง๋ฌด๋ฆฌ
์ฌ์ค ์ด ์๋น์ค์ ์ง์ง ํต์ฌ์ chrome-extension์ ์๋ค.
chrome-extension๋ง์ด ํด์ค ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ด ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
์์ํ ๋ ์น์ ๋จผ์ ํ๋กํ ํ์ดํ ํด์ mvp๋ฅผ ๋ฌ์ฑํ๋ ๊ฑธ ๋ชฉํ๋ก ์ก์์๊ณ ,
์ด์ ๊ทธ ๋ชฉํ๊น์ง task๋ 3๊ฐ๊ฐ ๋จ์๋ค.
- Filter, OrderBy, Pagination
- OAuth ๋ก๊ทธ์ธ ๋ฐฉ์ ์ถ๊ฐ
- Rate Limit
๋ฌ์ฑ ํ์ ์ต์คํ ์ ๊ฐ๋ฐ์ ๋ค์ ๊ฐ์ํ ํด๋ณด๋ ค๊ณ ํ๋ค.