
WEB URL: ํค์ฆ์ธ์ปดํผ๋ ์ฌ์ดํธ
์์ฑ์: ๊นํ๊ฒธ
FE & BE ๋ก์ปฌํ๊ฒฝ ์คํ ๋ฐฉ๋ฒ
- ํ๋ก์ ํธ ์๊ฐ
- ํต์ฌ ๊ธฐ๋ฅ
- ์คํ ๋ฐฉ๋ฒ
- ERD
- ์์คํ ์ํคํ ์ฒ
- ์ต์ ํํ ์ฌํญ
- ํ๋ฉด ๊ตฌ์ฑ
- ๊ฐ๋ฐ ๊ธฐ๊ฐ
- ํ & ์๋น์ค ์๊ฐ
- ํ์ ์๊ฐ
- ๊ธฐ์ ์คํ
์ฌ๋ด ์ด๋ฆฐ์ด์ง์ ์ง์๋ค์๊ฒ ์ค์ํ ๋ณต์ง ์์ค์ ๋๋ค. ํ์ง๋ง ์์๊ฐ ๋ง์ ๋ชจ๋ ์ง์์ ์๋ ๊ฐ ์ด๋ฆฐ์ด์ง์ ์ด์ฉํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ ์ง์๋ค ์ฌ์ด์์ ๋ถ๋ง์ ์ผ์ผํค๊ณ , ๊ณต์ ์ฑ๊ณผ ํฌ๋ช ์ฑ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ฒ ๋ง๋ญ๋๋ค.
โ ๊ทธ๋์ ์ ํฌ Cloviderํ์ ๊ณต์ ํ ๊ฐ์ค์น ์ ์ฉํ๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋น์ฒจ ํ๋ฅ ์ ๊ณตํ์ฌ ๊ณต์ ํ๊ณ ํฌ๋ช ํ ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
๊ณต์ ์ฑ ํ๋ณด: ๊ทผ์๋ ์, ์ฌ๋ด ๋ถ๋ถ, ๋ค์๋ ๊ฐ์ ๋ฑ ์ฌ๋ฌ ํ๋นํ ๊ฐ์ค์น๋ฅผ ํตํด ์ถ์ฒจ์ ์งํํฉ๋๋ค.
ํฌ๋ช ์ฑ ํ๋ณด: ์ ์ฒญํ ์ด๋ฆฐ์ด์ง ๋ชจ์ง์ ๋น์ฒจ ํ๋ฅ ์ ๊ณต๊ฐํ์ฌ ์ถ์ฒจ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ํฌ๋ช ํ๊ฒ ํด ์ ๋ขฐ์ฑ์ ํ๋ณดํฉ๋๋ค.
ํจ์จ์ฑ ํฅ์: ์์์ ์ผ๋ก ์งํ๋๋ ์ถ์ฒจ ๊ณผ์ ์ ์๊ฐ์ด ๋ง์ด ์์๋๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ฅผ ์๋ํํ์ฌ ํจ์จ์ฑ์ ๋์ ๋๋ค.
๋์ผ์ดํ ํฌ์ธ ๋ด๋ถ์ ๊ณต์ ํ๊ณ ํฌ๋ช ํ ์ฌ๋ด ์ด๋ฆฐ์ด์ง ์ธ์ ๋ฐฐ์ ์ ์ํด ์ด๋ฆฐ์ด์ง ๋ชจ์ง๊ณผ ์ถ์ฒจ์ ์๋ํํ ์๋น์ค์ ๋๋ค.
- 1๊ฐ์ ์ ์ฒญ์๋ก ์ฌ๋ฌ ๊ฐ์ ์ฌ๋ด ์ด๋ฆฐ์ด์ง ์ถ์ฒจ ํตํฉ ์ ์ฒญ
- ์ง์ํ ์ถ์ฒจ ํ์คํ ๋ฆฌ ์กฐํ, ๋น์ฒจ ํ๋ฅ ์กฐํ
- ๊ณต์ง์ฌํญ ์กฐํ, ์ง์์๋ต ์์ฑ
- ์ฌ๋ด ์ด๋ฆฐ์ด์ง ์ ๋ณด ์กฐํ
- ๊ด๋ฆฌ์ ๋์๋ณด๋ ์กฐํ (์๋น์ค ํต๊ณ ์ ๋ณด)
- ์ฌ๋ด ์ด๋ฆฐ์ด์ง ๋ชจ์ง ์์ฑ ๋ฐ ์ ์ฒญํํฉ ๊ด๋ฆฌ
- ์ฌ๋ด ์ด๋ฆฐ์ด์ง ์ถ์ฒจ ์งํ & ๊ฒฐ๊ณผ ๊ด๋ฆฌ
- Google SMTP๋ฅผ ํตํ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ถ์ฒจ ๊ฒฐ๊ณผ ์ ์ก
- ๊ณต์ง์ฌํญ, ์ง์์๋ต ๊ด๋ฆฌ
- ์ฌ๋ด ์ด๋ฆฐ์ด์ง ์ ๋ณด ๊ด๋ฆฌ

- ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ํฐ Editor์ ์ง์ฐ๋ก๋ฉ์ ์ ์ฉํด ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋๋ JS ํฌ๊ธฐ๋ฅผ ์ต์ ํ ํ์ต๋๋ค.
unpacked size
3.5MB -> 0MB
๋ก ๊ฐ์ํ ์ ์์์ต๋๋ค.
import dynamic from 'next/dynamic'
const BlockNoteEditor = dynamic(() => import('./BlockNoteEditor'), {
ssr: false,
loading: () => <LoadingSpinner />,
})
useCallback
,useMemo
๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ต๋๋ค.- ์ฑ๋ฅ์ด ์ข์ง ์์ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์พ์ ํ UX๋ฅผ ์ ๊ณตํ ์ ์๋ ํ๊ฒฝ์ ๊ตฌ์ถํ์ต๋๋ค.
export default function useCreateQuery() {
const searchParams = useSearchParams()
const createQueryString = useCallback(
(name: string, value: string) => {
const params = new URLSearchParams(searchParams.toString())
params.set(name, value)
return params.toString()
},
[searchParams],
)
return createQueryString
}
package.json
์์ ์๋์ ๊ฐ์ด ์ ์ฉํ์ฌ ํธ๋ฆฌ์ ฐ์ดํน์ ์ ์ฉํ์ต๋๋ค.- ๋ถํ์ํ๊ฒ ๋ค์ด๋ก๋๋๋ ํจํค์ง๋ฅผ ์ญ์ ํด, ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋๋ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ 25% ๊ฐ์ํ์ต๋๋ค.
"sideEffects": false
- NextJs๋ฅผ ํ์ฉํ ์ต์ ํ๋ฅผ ์ํํ์ฌ, JS ๋ค์ด๋ก๋๋ก ์ธํ UI blocking ํ์์ ์ต์ํํ์ต๋๋ค.
display: swap
์ค์ ์ ํตํด ์ ์ ๋ ํฐํธ๊ฐ ๋ค์ด๋ก๋๋๋ ๋์ ๋นํ๋ฉด์ ๋ณด๊ณ ์์ง ์์๋ ๋ฉ๋๋ค.- ์น ์ฑ๋ฅ์งํ ์ค FCP, TTI๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
const Pretendard = localFont({
src: './fonts/PretendardVariable.woff2',
display: 'swap',
weight: '45 920',
})
framer-motion
์transform
๊ธฐ๋ฐ์ ์ ๋๋ฉ์ด์ ์ผ๋ก reflow, repaint๋ฅผ ์ต์ํํฉ๋๋ค.- GPU ๊ฐ์์ ์ฌ์ฉํ๋ฏ๋ก, ์น ์ฑ๋ฅ์ ์ ํดํ์ง ์๊ณ ๊ณ ์ฌ์์ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ์ต๋๋ค.
<motion.div
initial={{ y: 0 }}
animate={{ y: [0, -20, 0] }}
transition={{
duration: 2,
ease: 'easeInOut',
repeat: Infinity,
repeatType: 'loop',
}}
>
useDeferredValue
๋ฅผ ์ฌ์ฉํด ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ, UI ๋ ๋๋ง๋ณด๋ค ๊ฒ์์ด ์ ๋ ฅ์ด ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ํ์ต๋๋ค.ms
๋ช ์์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ ํํ์ต๋๋ค.
const [searchInput, setSearchInput] = useState<string>('')
const deferredSearchInput = useDeferredValue(searchInput)
3. Redis ์บ์ฑ
์ ํตํ ํ์ฌ ์งํ ์ค์ธ ๋ชจ์ง ์ ๋ณด, ์ฌ์ฉ์ ์ ๋ณด ์กฐํ ์๋ ๊ฐ์ ๋ฐ ์ต์ ํ
4. ๋น๋๊ธฐ ํต์
์ ํ์ฉํ ๊ด๋ฆฌ์ ๋ชจ์ง ๊ฒฐ๊ณผ ์ด๋ฉ์ผ ์ ์ก(SMTP) ๊ธฐ๋ฅ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
6. Aws Lambda๋ฅผ ํตํ ๋ค์ ์ฌ์ฉ์์ ๊ฐ์ค์น ๊ธฐ๋ฐ ๋น์ฒจ ํ๋ฅ ์๊ณ ๋ฆฌ์ฆ ์ฒ๋ฆฌ
-> ์๋ ๊ฐ์


2. Java ์ ํ๋ฆฌ์ผ์ด์
- JRE ์ด๋ฏธ์ง
๋น๋๋ฅผ ํตํ ๋ณด์์ฑ ๊ฐํ ๋ฐ ์ด๋ฏธ์ง 2.5๋ฐฐ ๊ฒฝ๋ํ


์์ ๊ธฐ๊ฐ | ํ๋ก์ธ์ค ๋จ๊ณ | ์์ ๋ด์ญ | ์ฐ์ถ๋ฌผ |
---|---|---|---|
24.07.01 ~ 07.14 | ์๋น์ค ๊ธฐํ | ๐ ์๊ตฌ์ฌํญ ๋์ถ, ์ ์, ๊ฒํ ๐ ํ๋ก์ ํธ ๋ชฉํ ์ค์ , ์๋น์ค ๋๋ฉ์ธ ์กฐ์ฌ |
์๊ตฌ์ฌํญ ์ ์์, WBS, ์ฉ์ด ์ฌ์ |
24.07.12 ~ 07.21 | ์ค๊ณ ๋จ๊ณ | ๐ UI/UX ์ค๊ณ, ๋ฉ๋ด ๊ตฌ์กฐ๋, ์
๋ฌด ํ๋ฆ๋ ๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ, ํ ์ด๋ธ ๋ช ์ธ์ ๐ ์ธํฐํ์ด์ค ์ค๊ณ, ์์คํ ์ํคํ ์ฒ ์ค๊ณ ๊ธฐ์ ์คํ ์ ์ |
ํ๋ฉด ์ค๊ณ์, ๋ฉ๋ด ๊ตฌ์กฐ๋, ์
๋ฌด ํ๋ฆ๋ ERD, ํ ์ด๋ธ ๋ช ์ธ์, ์ธํฐํ์ด์ค ์ค๊ณ์ ์์คํ ์ํคํ ์ฒ, ์ํํธ์จ์ด ๊ตฌ์ฑ๋ |
24.07.22 ~ 08.16 | ๊ตฌํ ๋จ๊ณ | ๐ ๊ณตํต ์ปดํฌ๋ํธ ์ค๊ณ ๋ฐ ์ฝ๋ ๊ฐ๋ฐ, UI ์ค๊ณ ๋ฐ ๊ฐ๋ฐ ๐ Request, Response DTO ์ค๊ณ ๋ฐ ๊ฐ๋ฐ ๐ Restful API ๊ฐ๋ฐ, Infra ๊ตฌ์ถ |
ํ๋ก์ ํธ ์ฝ๋, ๋์ปค ์ด๋ฏธ์ง, ์ธํ๋ผ ํ๊ฒฝ |
24.08.11 ~ 08.17 | ํ ์คํธ ๋จ๊ณ | ๐ ๋จ์ ํ
์คํธ ๐ ๋ธ๋ผ์ฐ์ ์๋ ํ ์คํธ, Lighthouse ๋ถ์ JMeter ์ฑ๋ฅ ํ ์คํธ |
ํตํฉ ํ ์คํธ ๋ณด๊ณ ์ |
24.08.17 ~ 08.23 | ์ข ๋ฃ | ์ฌ์ฉ์ ๋ฐ ๊ด๋ฆฌ์ ํ๋ฉด ๋ฐ๋ชจ ์์ ํ ์คํธ ์๋๋ฆฌ์ค ์์ฑ ๐ ํ๋ก์ ํธ ํ๊ณ ์งํ ๐ ์ข ๋ฃ ๋ณด๊ณ ์ ์์ฑ ๋ฐ ๋ฐํ ์ค๋น |
ํ๊ณ ๋ก, ๋ฐ๋ชจ์์ ๋ฐํ์๋ฃ, ์ข ๋ฃ ๋ณด๊ณ ์ |
Team: Clovider | Service: KIC |
---|---|
![]() |
![]() |
No.1 | No.2 | No.3 |
---|---|---|
๊นํ๊ฒธ | ๊ถ๋ฏผ์ฐ | ์ ์คํฌ |
PM, BE | PL, BE | BE |
kylo-dev | MINUUUUUUUUUUUU | sungsil0624 |
No.4 | No.5 | No.6 |
---|---|---|
์ ํฌ์ฐฌ | ์ด์ฃผ์ | ๊น๊ด์ผ |
BE, Infra | BE, Infra | BE |
anselmo228 | leejuae | KIM-KWAN-IL |
No.1 | No.2 | No.3 |
---|---|---|
๊น์ฑ๋ฏผ | ๊ณต์์ | ์์ฉ์ค |
PL, FE | FE | FE |
Collection50 | yeyounging | mango0422 |
