โ๐ป ํ๊ณ
์ธํ๋ฐ ๋ง์ฐ์ ์ด๋ฒคํธ ๋๋ถ์ ๋จ๋ 1,000์์ ํจ๋น๋์ ์๋ฐ์คํฌ๋ฆฝํธ, ๋นํธ์ฝ์ธ, ๋์ปค ๋ฑ ๋ค์ํ ๊ฐ์๋ฅผ ์ธ์ด ๋ด์๋ค.
๋๋ถ์ ๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์๋ฉ ๋์ด๋ฌ๊ณ , ๋ณต์ต๋ ํ ๊ฒธ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ํํธ๋ฅผ ๋ค์ ๋ฃ๊ณ ์์๋๋ฐ…
๋ฌธ์ ๋, ๋จธ๋ฆฟ์์ ์จ์ข ์ผ “์ค๋ 30๋ถ ํ๋ก์ ํธ๋ ๋ญ ํ์ง?” ์ด ์๊ฐ๋ง ๋งด๋์๋ค๋ ๊ฑฐ๋ค.
์ด์ ๋ง ์์ํ๋๋ฐ, ๋ฒ์จ๋ถํฐ ๋ฐฑ์๋๊ฐ ์์ด์ ํ์ฅํ๊ธฐ ๋ง๋งํ๋ค๋ ์๊ฐ์ด ๋ค๊ณ ,
‘ํน์ ์์ฌ์ผ์ผ๋ก ๋๋๋ ๊ฑฐ ์๋?’ ํ๋ ๋ถ์ํจ๋ ์ค์ณค๋ค.
๊ทธ๋๋ ๋ง์์ ๋ค์ก์๋ค.
“์ฌ์ํ ๊ฑฐ๋ผ๋ ํด๋ณด์. ๊ฒฐ๊ตญ์ ๋๋ ํ์คํ ๊ฐ๋ฐ์๊ฐ ๋ชฉํ์์”
๊ทธ๋ ๋ค๋ฉด ๋ฐฑ์๋๋ ์ธ์ ๊ฐ๋ ๋ถ๋ชํ์ผ ํ ๋ถ๋ถ์ด๋ค.
์ฐ์ ๋จธ๋ฆฟ์์ ์ค์ณ ์ง๋๊ฐ ๊ธฐ๋ฅ ์์ด๋์ด ๋ช ๊ฐ์ง๊ฐ ์์๋ค.
์๋ฅผ ๋ค๋ฉด, ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ, ์ฌ๋๋ค์๊ฒ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ ์์ ๋ฐฉ๋ช ๋ก,
๊ทธ๋ฆฌ๊ณ ์นด๋ ํํ์ ์น์ ์ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ๋ ๋๋งํ๋ ๊ธฐ๋ฅ ๊ฐ์ ๊ฒ๋ค์ด๋ค.
๋ฒ์ธ๋ก, ์์ฆ์ ์ต๊ด์ ๋ง๋ค๊ฒ ๋ค๋ ๋ง์์ผ๋ก
1์ผ 1๋ฉด์ ์ง๋ฌธ ํ์ต, 1์ผ 1์ฝ๋ฉํ ์คํธ ๋ฌธ์ ํ์ด ๊ฐ์ ๊ฑธ ์กฐ๊ธ์ฉ ์ถ๊ฐํด๋ดค๋ค.
์์งํ ๋งํ๋ฉด… ํ ๊ฒ ๋๋ฌด ๋ง์์ง๋ ๋๋์ด ๋ค๊ธด ํ๋ค.
๊ทธ๋๋ ์ง๊ธ์ “์ผ๋จ ํด๋ณด์”๋ ์์ธ๊ฐ ๋ ์ค์ํ๋๊น, ๋ฌด๋ฆฌํ์ง ์๋ ์ ์์ ๋์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
์ด ๊ธ์ ์ฐ๋ ์ง๊ธ๋, ํํธ์ผ๋ก๋ “์ค๋์ ๊ทธ๋ฅ ์คํตํ ๊น?” ํ๋ ์ ํน์ด ์ด์ง ์ค์ณค๋ค.
(์์ฌ์ด์ผ์ ์๋ผ...)์์ง ํ๋ก์ ํธ ์ด๋ฐ์ด๋ผ๋ ๊ฑธ ํ๊ณ ์ผ์์๋ผ๋
“์์ฃผ ์ฌ์ํ ๊ฑฐ๋ผ๋ ํด๋ณด์.”๋ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค.
๊ทธ๋์ ์ค๋์ 30๋ถ ํ๋ก์ ํธ๋ ๋ฐฉ๋ช ๋ก ๋ง๋ค๊ธฐ๋ก ์ ํ๋ค.
๊ฑฐ์ฐฝํ ๊ธฐ๋ฅ์ ์๋์ง๋ง, ์์๋ก๋ผ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ ์ฐฝ๊ตฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ๋ค.
“์ด๋ฐ ๊ธฐ๋ฅ ์ถ๊ฐ๋๋ฉด ์ข๊ฒ ์ด์.”
“์ด ๊ธฐ๋ฅ ๋ญ๊ฐ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ ๊ฐ์์.”
“์ด๋ฐ ์์ด๋์ด๋ ์ด๋จ๊น์?”
์ด๋ฐ ๋ฉ์์ง๋ค์ ๊ฐ๋ณ๊ฒ ๋จ๊ธธ ์ ์๋ ๊ณต๊ฐ์ด ์๋ค๋ฉด,
๊ธฐํ?์ถ๊ฐ๊ธฐ๋ฅ์ ์๊ฐํ๋๊ฑด ์กฐ๊ธ ๋ ์ ์์ง ์์๊น?
์… ๊ทธ๋ฐ๋ฐ ๋ฌธ๋ ํ์ค์ ์ธ ๋ฌธ์ ๊ฐ ํ๋ ๋ ์ฌ๋๋ค.
๋ฐฑ์๋๊ฐ ์๋๋ฐ, ์ฌ๋๋ค์ ํผ๋๋ฐฑ ๋ฐ์ดํฐ๋ฅผ ๋๋์ฒด ์ด๋์ ์ ์ฅํ์ง?
์ฐพ์๋ณด๋ Firebase, Supabase ๊ฐ์ BaaS(Backend as a Service)๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง ์์งํ ๋งํ๋ฉด… ์จ๋ณธ ์ ๋ ์๊ณ , ์ ํํ ๋์ ์๋ฆฌ๋ ์์ง ์ ๋ชจ๋ฅธ๋ค.
๊ทธ๋์ ์ค๋์ ์์ฌ๋ด์ง ์๊ณ UI๋ง ๋จผ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
๋ด์ผ์ Firebase์ Supabase ์ค ํ๋๋ฅผ ์ ํํด์
๊ณต์ ๋ฌธ์๋ ์ฝ๊ณ , ๊ฐ๋จํ ์ฐ๊ฒฐ๋ถํฐ ์๋ํด๋ณผ ๊ณํ์ด๋ค.
(๊ทธ๋๋ ์ค๋ UI ๋ง๋ ๊ฑฐ๋๊น ํ๋ก์ ํธ ํ ๊ฑฐ ๋ง์ ใ )
๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฆฌ ์๊ฐํด๋ ํ๊ณ ์ฐ๋ ๋ฐ๋ง 10๋ถ ์ด์์ ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฐ ํ๊ณ ๊ธ๋ฟ ์๋๋ผ, ํ๋ก์ ํธ์์ ๋ฐฐ์ด์ ๋ ์ ๋ฆฌ ํด์ผํ๋๊น..
“30๋ถ ํ๋ก์ ํธ”๋ฅผ “45๋ถ ํ๋ก์ ํธ”๋ก ์น๊ฒฉ(?)์์ผ์ผ ํ๋...

๐ ์ ๋ฆฌ
Flexbox
- Flexbox๋ CSS์์ 1์ฐจ์(๊ฐ๋ก or ์ธ๋ก) ๋ฐฉํฅ์ผ๋ก ์์ดํ ๋ค์ ์ ๋ ฌํ๊ณ ๋ฐฐ์นํ๊ธฐ ์ํ ๋ ์ด์์ ์์คํ
- ๊ธฐ์กด์ float, position, inline-block ๋ฑ์ผ๋ก๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ต๋ ์ ๋ ฌ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅ
์ฉ์ด ์ ๋ฆฌ
| ์ฉ์ด | ์ค๋ช |
| Main Axis | ํ๋ ์ค ์์ดํ ์ด ์ ๋ ฌ๋๋ ์ฃผ ์ถ (row or column) |
| Cross Axis | ์ฃผ ์ถ์ ์์ง์ธ ์ถ (row๋ฉด ์ธ๋ก, column์ด๋ฉด ๊ฐ๋ก) |
| Flex Container | display: flex๊ฐ ์ ์ฉ๋ ๋ถ๋ชจ ์์ |
| Flex Items | ์ปจํ ์ด๋์ ์ง๊ณ ์์ ์์๋ค |
Flex Container ์์ฑ
1. display: flex / inline-flex
.container {
display: flex;
/* ๋๋ inline-flex */
}
- flex: ๋ธ๋ก ์์์ฒ๋ผ ๋์
- inline-flex: ์ธ๋ผ์ธ ์์์ฒ๋ผ ๋์
2. flex-direction: ์ฃผ ์ถ ๋ฐฉํฅ ์ค์
.container {
flex-direction: row;
}
3. justify-content: Main Axis ์ ๋ ฌ (๊ฐ๋ก ์ ๋ ฌ or ์ธ๋ก ์ ๋ ฌ)
| ๊ฐ | ์ ๋ ฌ ๋ฐฉ์ |
| flex-start | ์์์ ์ ๋ ฌ (๊ธฐ๋ณธ๊ฐ) |
| flex-end | ๋์ ์ ๋ ฌ |
| center | ๊ฐ์ด๋ฐ ์ ๋ ฌ |
| space-between | ์ ๋ ์ ๋ ฌ + ์ฌ์ด ๊ท ๋ฑ |
| space-around | ์์ชฝ ์ฌ๋ฐฑ + ์ฌ์ด ์ฌ๋ฐฑ |
| space-evenly | ์ฌ๋ฐฑ์ ์์ ํ ๊ท ๋ฑ ๋ถ๋ฐฐ |
.container {
justify-content: space-between;
}
4. align-items: Cross Axis ์ ๋ ฌ (์ธ๋ก ์ ๋ ฌ or ๊ฐ๋ก ์ ๋ ฌ)
| ๊ฐ | ์ค๋ช |
| stretch | (๊ธฐ๋ณธ๊ฐ) ๊ต์ฐจ์ถ ์ ์ฒด ๋๋ฆฌ๊ธฐ |
| flex-start | ๊ต์ฐจ์ถ ์์์ ์ ๋ ฌ |
| flex-end | ๊ต์ฐจ์ถ ๋์ ์ ๋ ฌ |
| center | ๊ต์ฐจ์ถ ๊ฐ์ด๋ฐ ์ ๋ ฌ |
| baseline | ํ ์คํธ ๊ธฐ์ค์ ์ ๋ ฌ |
5. align-content: ์ฌ๋ฌ ์ค์ ๊ต์ฐจ์ถ ์ ๋ ฌ (์ค๋ฐ๊ฟ๋ ๊ฒฝ์ฐ๋ง ์ ์ฉ)
- align-items๋ ํ ์ค์ ๋ํด
- align-content๋ ์ฌ๋ฌ ์ค์ ๋ํด
6. flex-wrap: ๋์น ๋ ์ค๋ฐ๊ฟ ์ฌ๋ถ
| ๊ฐ | ์ค๋ช |
| nowrap | ์ค๋ฐ๊ฟ ์ ํจ (๊ธฐ๋ณธ๊ฐ) |
| wrap | ๋์น๋ฉด ๋ค์ ์ค๋ก ๊ฐ |
| wrap-reverse | ๋ค์ ์ค๋ก ๊ฐ๋, ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก |
.container {
flex-wrap: wrap;
}
7. gap: ์์ดํ ๊ฐ ๊ฐ๊ฒฉ
- gap์ Flexbox์์๋ ์ฌ์ฉ ๊ฐ๋ฅ (Grid์์๋!)
.container {
display: flex;
gap: 16px;
}
Flex Item ์์ฑ
1. flex-grow: ๋จ์ ๊ณต๊ฐ์ ๋น์จ
- ๊ธฐ๋ณธ๊ฐ: 0 (๋จ์ ๊ณต๊ฐ ์ ์)
- flex-grow: 1 → ๋จ๋ ๊ณต๊ฐ์ ์ฑ์
- ๋น์จ ๋จ์ ๊ฐ๋ฅ (flex-grow: 2๋ 1์ 2๋ฐฐ)
2. flex-shrink: ๊ณต๊ฐ ๋ถ์กฑํ ๋ ์ค์ด๋๋ ๋น์จ
- ๊ธฐ๋ณธ๊ฐ: 1 → ์ค์ด๋ฆ
- 0 → ์ค์ด๋ค์ง ์์
3. flex-basis: ๊ธฐ๋ณธ ํฌ๊ธฐ ์ค์
- ๊ธฐ๋ณธ๊ฐ: auto (๋ด์ฉ ๊ธฐ๋ฐ)
- flex-basis: 200px → ๊ธฐ๋ณธ์ ์ผ๋ก 200px ํ๋ณดํ๋ ค๊ณ ํจ
4. flex: shorthand ์์ฑ
.item {
flex: 1 0 auto; /* grow shrink basis */
}
- flex: 1 → flex-grow: 1, flex-shrink: 1, flex-basis: 0
- ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์์ฑ!
5. align-self: ๊ฐ๋ณ ์์ดํ ์ ๊ต์ฐจ์ถ ์ ๋ ฌ ์ค์
- align-items๋ ์ ์ฒด ์์ดํ ์ ๋ ฌ
- align-self๋ ํด๋น ์์ดํ ๋ง ์ ๋ ฌ
.item {
align-self: flex-end;
}
์ค๋ฌด์์ ๋ง์ด ์ฐ๋ ํจํด
1. ์ธ๋ก ์ค์ ์ ๋ ฌ
.container {
display: flex;
align-items: center;
}
2. ๊ฐ๋ก + ์ธ๋ก ์์ ์ ์ค์
.container {
display: flex;
justify-content: center;
align-items: center;
}
3. ์ค๋ฅธ์ชฝ ์ ๋ ฌ + ์๋ ์ ๋ ฌ
.container {
display: flex;
justify-content: flex-end;
align-items: flex-end;
}
โ ๏ธ Flexbox ์ฃผ์ํ ์
| ์ํฉ | ์์ธ | ํด๊ฒฐ |
| ์์ดํ ์ด ๋์น๊ฑฐ๋ ๊นจ์ง | flex-wrap: nowrap (๊ธฐ๋ณธ๊ฐ) ๋๋ฌธ | flex-wrap: wrap ์ถ๊ฐ |
| ํ ์คํธ๊ฐ ๊นจ์ง๊ฑฐ๋ ์ค์ด๋ฆ | flex-shrink: 1๋ก ์ธํด ์ค์ด๋ฆ | flex-shrink: 0 ์ฌ์ฉ |
| ์์ดํ ๊ฐ๊ฒฉ ํ์ | margin ๋์ gap ์ฌ์ฉ ๊ณ ๋ ค | gap ์ฌ์ฉ ๊ณ ๋ ค |
์ ๋ฆฌ
| ์์ฑ | ์ค๋ช |
| display: flex | ํ๋ ์ค ์ปจํ ์ด๋ ์ง์ |
| flex-direction | ์ฃผ ์ถ ๋ฐฉํฅ ์ง์ |
| justify-content | ์ฃผ ์ถ ์ ๋ ฌ |
| align-items | ๊ต์ฐจ ์ถ ์ ๋ ฌ |
| flex-wrap | ์ค๋ฐ๊ฟ ์ฌ๋ถ ์ค์ |
| gap | ๊ฐ๊ฒฉ ์ค์ |
| flex | grow/shrink/basis ํ ๋ฒ์ ์ง์ |
| align-self | ๊ฐ๋ณ ์ ๋ ฌ |
- Flexbox๋ 1์ฐจ์ ๋ ์ด์์(๊ฐ๋ก or ์ธ๋ก)์ ์ต์ ํ๋ ๋๊ตฌ
- ๐ฆ ์ปดํฌ๋ํธ ๊ฐ ์ ๋ ฌ, ๋ฒํผ ๋ฐฐ์น, ์นด๋ ๋ ์ด์์, ๋ก๊ทธ์ธ ํผ ๋ฑ
- ํ์ ์์ Flexbox๋ง์ผ๋ก๋ ๋๋ถ๋ถ์ ๋ ์ด์์์ ํด๊ฒฐ
'๐ Project > [30๋ถ] 1์ผ 30๋ถ ๊ฐ๋ฐ ๋ฐ ํ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| โฐ [Ver2] 30๋ถ? ๊ฐ๋ฐ ๋ฐ ํ๊ณ - ์์ด์ดํ๋ ์ ์ด์ ์์ฑ (0) | 2025.04.27 |
|---|---|
| โฐ [Ver2] 30๋ถ ๊ฐ๋ฐ ๋ฐ ํ๊ณ - ํ๋ก์ ํธ ๊ธฐํ ๋ฐฉํฅ (0) | 2025.04.24 |
| โฐ [Ver1] 30๋ถ ๊ฐ๋ฐ ๋ฐ ํ๊ณ - ์กฐ๊ฑด๋ถ ๋ ๋๋ง (0) | 2025.04.09 |
| โฐ [Ver1] 30๋ถ ๊ฐ๋ฐ ๋ฐ ํ๊ณ - Firebase, Supabase (0) | 2025.04.03 |
| โฐ [Ver1] 30๋ถ ๊ฐ๋ฐ ๋ฐ ํ๊ณ - ์๋งจํฑํ๊ทธ, react-router-dom (0) | 2025.04.01 |