๐ซ CGW
๐ 2022.11.28~ 12.9
๐ CGW Goal
- ์๋งค ๊ทธ ์ ๋, CGW
- ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๊ฐํธํ ์์ฝ ํ์ด์ง
- ๊ฐ๋
์ฑ์ ๋์ธ UI
- ์ง๋ API ๊ฐ๊น์ด ์ํ๊ด ์๋ด
- ์์
๋ก๊ทธ์ธ, ์์
๊ฒฐ์ ๋ฅผ ํ์ฉํ ๊ตฌ๋งค ํ๋ค ๋ฎ์ถ๊ธฐ
๐ผ DEMO
๐โโ๏ธ Team CGW
FE
๊ณฝ์ข
๋ฒ, ๋ฐ์ง์, ์ด๋ค๋น, ์ดํ์
BE
๊นํ์, ์์ฐฝํ, ์กฐ์์
๐ CGW Features
- ๐ต
์ข
๋ฒ FE
- ์ข์ ์ ํ
- ๐ต
์ง์ FE
- ์์
๋ก๊ทธ์ธ& ์ง๋ API Map ๊ธฐ๋ฅ
- ๐ต
๋ค๋น FE
- ์ํ ์๋งค, ์ํ ๊ฒ์ ๐โโ๏ธ
- ๐ต
ํ์ FE
- ๊ฒฐ์ , ์๋งค๋ด์ญ
- ๐ข
ํ์ BE
- ์๋งคํ์ด์ง API, AWS
- ๐ข
์ฐฝํ BE
- ์นด์นด์ค๊ฒฐ์ API, ์ฃผ๋ฌธ API
- ๐ข
์์ BE
- ์นด์นด์ค๋ก๊ทธ์ธ API, ์๋งคํ์ด์ง API
Notion
, Trello
, Git
, Slack
๐ CGW Engineering Stack
- ๐ป BE:
JavaScript
, Node.js
, AWS
, MySql
- ๐ป FE:
JavaScript
, React
, Styled-components
๐ฉโ๐ป DB Modeling
๐ ๊ตฌํ ๊ธฐ๋ฅ
- ์ํ ์๋งค, ์ํ ๊ฒ์ ๐โโ๏ธ
- ์ข์ ์ ํ
- ์์
๋ก๊ทธ์ธ& ์ง๋ API Map ๊ธฐ๋ฅ
- ์นด์นด์คํก ๊ฒฐ์ , ์๋งค๋ด์ญ
๐ฅณ ๋์ ์ ์ํํธ
-
๐ซ ์ํ ์๋งค

- ๋ค์ ๊ณ ๋ฅด๊ธฐ ๊ธฐ๋ฅ

-
๐ ์ํ ๊ฒ์
๐ช ์์ ํํธ๋ฅผ ๋ด๋นํ๊ฒ ๋ ์ด์
- ๋ฐ์ง๋๊ฐ ๋๊ณ , ์์ UI๋ฅผ ๊ฐ์ ํ์ฌ
์๋งค์จ ์์น
๋ชฉ์
- ๋ธ๋๋ ์ปฌ๋ฌ๋ฅผ ์ฌ์ฉํ ๋ธ๋๋ฉ์ ํตํ
๊ธ์ ์ ์ธ ์๋น์ค ๊ฒฝํ
- ์ํ ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ์ฌ์ด ์ํ ์์น ๋ฐ
์ดํ์จ ๊ฐ์
- ์ด๋ ต๊ณ , ๋ณต์กํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ์ ์ด์ ์ด ์์๊ธฐ์ ๋์ ํ์์ต๋๋ค.
๐ ๋๋ฅผ ์ฑ์ฅํ๊ฒ ํ ์ฝ๋ ๋ค์ฌ๋ค๋ณด๊ธฐ
๐ Nesting Map
{movieData?.map((movie, index) => (
<PlacePickTextSeoul key={index}>
<PlaceTextBox key={movie.region_id}>
<PlacePickP>๐{movie.name}</PlacePickP>
</PlaceTextBox>
<PlacePickButtonContainer>
<Pick>
{movie.location.map(lo => {
return (
<>
<Input
type="radio"
name="place"
id={lo.branch_id}
defaultValue={lo.branch_name}
onChange={onChangeData}
/>
<Label htmlFor={lo.branch_id}>{lo.branch_name}</Label>
</>
);
})}
- ์ค์ฒฉ map์ ์ฌ์ฉํ์ฌ ๋ฒํผ์ ๋ฐ๋ฅด๊ฒ ๋ ๋ํ๋ค.
- ์์ ๊ณผ์
- Mock data์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ์ด ๋ ๋
- ์ค์ฒฉ ๋งต์ ํ์ฉํ์ฌ ๊ฐ์ฒด์์ ๊ฐ์ฒด ๋ฐ์ดํฐ (branch)๋ฅผ ๋ ๋
- ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง ์ง์ ์ ๋ฐ์ดํฐ๋ 1๊ฐ์ด์ง๋ง, UI๋ 2๊ฐ ์ด๊ธฐ์ ์ง์ ์ด ๋ ๋ฒ ๋ ๋ ๋จ
๐ช Before
๐ After (๋ด๊ฐ ์ํ๋ ๋ ๋ ๋ชจ์ต)
๐ซ ์ค์ฒฉ ์ผํญ์ฐ์ฐ์
Step 3 ๋ฌธ๊ตฌ๋ฅผ ์ฃผ๋ชฉ!
- ์ฒซ๋ฒ์งธ ์ผํญ ์ฐ์ฐ์
- ์กฐ๊ฑด:
์ํ๊ด
์ด ์ ํ ๋์๋ค๋ฉด
true
์ผ ๋ ํด๋น ์ผ์์ ๋ํ ์ํ ์๊ฐ์ UI๋ก ๊ทธ๋ ค๋ด๊ณ
- โจ
true
์ด์ง๋ง, ํด๋น ์ํ ์๊ฐ์ด ์๋ค๋ฉด ์ํ๊ฐ ๋งค์ง ๋์์ต๋๋ค
๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋์ด๋ค
false
๋ผ๋ฉด ์ํ๋ฅผ ๋จผ์ ์ ํํด ์ฃผ์ธ์!
๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋์ด๋ค
- ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฑํํ ์ด์ ๐ ๋น์นธ์ ์ค๋ฅ๋ก ๋ณด์ธ๋ค! 12/2
- ์ค์ ์ํ ์ฌ์ดํธ ์ฒ๋ผ ์ํ, ์๊ฐ, ์ผ์๋ฅผ ๋๋ฅผ ๋ ๋ง๋ค ์ ์ฐํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ข๊ฒ ์ง๋ง, ๋์ด๋๊ฐ ๋์์ UI๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ทธ๋ ค์ฃผ๋ ๊ฒ์ผ๋ก ์งํํ๋ค.
- ๋์ด๋ ์กฐ์ ๊ณผ ์ ์ ์๊ฒ ์ฐ๋ฆฌ๊ฐ ์ํ๋ flow๋ก ์งํ ํ ์ ์์ด์ ๊ฝค ๋ฟ๋ฏํ๋ค.
- ๐ ์ฌ์ค ์์ ๊ธฐ๋ฅ์ ๋๋ก๋ ์ดํดํ์ง๋ง, ์ฝ๋๋ก ๊ตฌํํ์ง ๋ชปํด์ ๋ต๋ตํ ๋ถ๋ถ์ด ์์๋ค.
- ํ๋์ฉ ๋ฏ์ด๋ณด๊ณ , ๋๊ธฐ์๊ฒ ๋ง์ ๋์์ ์ป์ด ์ฑ๊ณตํ๋ค! ๐
<TimePickContainer>
{day ? (
<TimePick>
{timeFilter.length !== 0 ? (
timeFilter.map((movieTime, i) => {
return (
<React.Fragment key={i}>
{timeFilter[i].time.map((detailTime, index) => {
return (
<React.Fragment key={index}>
<TimeRadio
type="radio"
name="time"
id={detailTime.time}
defaultValue={detailTime.time}
onChange={onChangeData}
/>
<TimeLabel htmlFor={detailTime.time}>
{detailTime.time}
</TimeLabel>
</React.Fragment>
);
})}
</React.Fragment>
);
})
) : (
<TimePickReadyBox>
<TimePickReady>๐ฅฒ ๋งค์ง ๋์์ด์!</TimePickReady>
</TimePickReadyBox>
)}
</TimePick>
) : (
<TimePickReadyBox>
<TimePickReady>๐ ๋ ์ง๋ฅผ ๋จผ์ ์ ํด์ฃผ์ธ์!</TimePickReady>
</TimePickReadyBox>
)}
</TimePickContainer>
- ์ํ์๊ฐ์ด ์์ ๊ฒฝ์ฐ์ ์ฝ๋๋ฅผ ์๋ฟ์ผ๋ก ๋์ธ ์ ์์์ง๋ง, ์ค์ฒฉ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ ์ ์ฝ๋๋ก ๋ฉ์ธ์ง๋ฅผ ๋ ๋๋ง ํ์!
- ํ๋์ ํจ์ ์์ ์ฒ๋ฆฌํด์ผํ ๋ฐ์ดํฐ๋ ํจ์๊ฐ ์๋ค๋ฉด ๋๋ฆฌ๊ฒ ์ฒ๋ฆฌ๋๋ค.
fetch
๊ฐ ์งํํ๋ ๋น๋๊ธฐ์ ํน์ฑ์ ์ฃผ๋ง์ ๊ณต๋ถ!
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋๊ธฐ์ ์ธ์ด์ด๋ค
- ๋ธ๋ผ์ฐ์ ์์ง์์ ์๋ ํ ๋๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ ๋๋ค.
๐ ์ด๊ธฐํ ๋ฒํผ ๊ธฐ๋ฅ ์์
const deleteObj = () => {
setSelectList({ place: "", day: "", time: "" });
};
const deleteObj = () => {
delete selectList.place;
delete selectList.day;
delete selectList.time;
};
- ๐
delete
๋ฉ์๋๋ Key
& Value
๋ฅผ ์ง์ด๋ค. == null
- ๊ทธ๋ฌํ์ฌ after ์ฝ๋๋ก ๋ฆฌํฉํ ๋ง
- ์ ์ง์ฌ์ง ์ฝ๋๋ ๋ฌผ ํ๋ฅด๋ฏ ๊ธฐ์กด ๊ธฐ๋ฅ๋ค๊ณผ ์ ์๋ํ๋ค
- ๋ฆฌํฉํ ๋ง ํ ์ฝ๋๋ ์ด๊ธฐ๊ฐ(true)์ผ๋ก ๋์๊ฐ๊ธฐ์ uesEffect๋ฅผ ์ฌ์ฉ ํ ํ์๋ ์๋ค!
๐ ํ๊ณ :
- ๐ ์ข์๋ ๊ฒ(
L
iked)
- ๋ ๋ ํ ๋๊ธฐ๋ค๊ณผ ํจ๊ป ์์ฑํ๋ ์ฝ๋
- ์ด๋ ต์ง๋ง 1์ฐจ ํ๋ก์ ํธ ๋ ๋ณด๋ค ์ฌํ ๋ ๋ ๋ฒจ์ ํ๋ก์ ํธ (ํํฐ๋ง& ๋์ ๋ผ์ฐํ
)
- ๋งค์ผ ์์นจ ์ ๊ฐ, ํ์๋ค์ด ๋ฏธ๋ฆฌ ์์ฑํ ์คํ ๋์
ํ
ํ๋ฆฟ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ผ๋ฆฌ ์คํ ๋์
์ ์งํ ํ ๊ฒ
- ์ ์์ผ ๊ฐ๋ฐ์ ์ํ ํธ๋ ๋ก ์ฌ์ฉ ๋ฐ ํ์ฉ
- ๊พธ์คํ ๊ธฐ๋ก์ ํตํด ์ด์ ๋ ์ดํดํ์ง ๋ชปํ๋ ์ฝ๋๋ฅผ ์ค๋์ ์์ฑํด๋ณด๊ณ ์ดํดํ๋ ๊ฐ๋ฐ์๊ฐ ๋์๋ค.
- ๋์ ์๋ ๋์
- ์๋ฌ์ฐฝ ๋ง๋๊ณ ์ค์ค๋ก ํด๊ฒฐ ํ๊ธฐ
- ๐ ๋ฐฐ์ด ๊ฒ(
L
earned)
- ๋ง์ด ๋์ด์ง๊ณ ์๋ฌ์ฐฝ์ ๋ง๋๊ณ ํด๊ฒฐํ๋ฉด์ ์ฑ์ฅํ๋ค.
- ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ํตํ์ฌ ๋ ์ข์ ์ฝ๋๋ ์์ ์ด ๋์ด๋ ๋ฌผ ํ๋ฅด๋ฏ์ด ์์ฐ์ค๋ฝ๊ฒ ์๋ํ๋ ๊ฒ
- ๐ฆ ๋ถ์กฑํ๋ ๊ฒ(
L
acked)
- ์๋ฌ ๋์ฒ๋ฒ์ด ์์ง ๋ฏธ์ํ๊ณ , console.log๋ฅผ ํ์ฉํ ๋๋ฒ๊น
์๋ จ๋๊ฐ ๋ฎ์
- ๋๋ฐ ์ํฉ(e.g. ์ ๋ฌํด์ผํ ๋ฐ์ดํฐ ํ์
์ด ๋ฐ๋์ด์ผํ๋ค๊ฑฐ๋ ๋๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ)์์ ๋ธ๋ฝ์ปค๋ฅผ ๋ง์ด ๋ง๋ฌ๋ค.
- ์๋ฅผ ๋ค๋ฉด, ๋ด๊ฐ ๋ฐ์ดํฐ ํ์
์ ์ ์ฒดํ๋๋ฐ ๋ง์ ๋ฆฌ์์ค๊ฐ ๋ค๊ณ ๋นํจ์จ ์ ์ด๋ผ๋ ํ๋จ์ด ๋ด๋ ค์ง๋ค๋ฉด, ๋ฐฑ์๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์ฒญํด๋ ๋๋ค๋ ์
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ฒฝํ๊ฒ ํธ๋ค๋ง ๋ชปํ ์ .
- ์ฒ์์ด๊ณ , ๊ธฐํ ๋จ๊ณ์์ ์๋ฒฝํ๋ค ์๊ฐํ ๋ถ๋ถ์์๋ ๋ณ์๊ฐ ๋ ์๊ฒผ๊ธฐ์ ์์๋ก ๋
ผ์ํด๋ณด๊ณ ๋ณ์์ ํ๋ค๋ฆฌ์ง ์๋ ๋ง์๊ฐ์ง
์ ๊ฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ ๋ชจ๋๊ฐ ์ด๋ ค์ด ๊ฒ์ด ๋ง๊ณ , ๊ณ ๋ฏผ์ด ๊น์ด์ง ๋๋ฉด ํ์์ด๋ ๋ฉํ ๋๊ณผ ์๊ฒฌ์ ๋๋ ๋ณด๋๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์ด๊ฑด ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์์ฑํฉ๋๋ค..
์ฆ ํผ์ ๊น๊ฒ ๊ณ ๋ฏผํ๊ณ ์์ง ๋ง๊ธฐ! 12/7 ์คํ ๋์
๋ฏธํ
-๋-
- ๐ฏ ๋ฐ๋ผ๋ ๊ฒ(
L
onged for)
- ์ฒ์๋ถํฐ ์๋ฒฝํ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฒ์ ์ด์คํ์ง ๋ง ๊ฒ, ๋๋ ๋ชจ๋ฅด๊ฒ ์ฃผ๋ ์คํธ๋ ์ค๊ฐ ๋์ด ์์์ด ๋จ์ด์ง ์ ์๋ค.
๐ณ ์์ผ๋ก์ ๋ชฉํ
- ๋ฐฑ์๋์ ํต์ ์ ์ํ์ฌ
ERD
์์ฑ๋ฒ๊ณผ ์ฝ๋ ๋ฒ ํ์ต ํ ๊ฒ
- ์ด๊ธฐ ๊ธฐํ๋จ๊ณ์์ ๋ฐ์ดํฐ ์ก์์ ๋ฐฉ์์ ๋ ๊ผผ๊ผผํ ๊ธฐํ
- e.g. ์ธ์ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ์ด๋ ํ ๋ฐ์ดํฐ ํ์
์ผ๋ก ์ ๋ฌ ๋ฐ์์ง ๋ฑ๋ฑ
- ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ํตํ ๋ณต์ต ๋ฐ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ
- ๋ด ์ฝ๋๋ฅผ ์ง์ธ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋์!
E.O.D