์ฒ์์ผ๋ก ์งํํด๋ณด๋ migration์ด๋ผ์ ์ด๋ป๊ฒ ์์ํ ์ง ๋ง๋งํด์ ๊ณํ์ ์ธ์๋ณด๊ธฐ๋ก ํ๋ค.
ํ์ฌ ์ฐ๋ฆฌ ํ์ด์ง๋ auth.xxx.com, learn.xxx.com, main.xxx.com, admin.xxx.com 4๊ฐ๋ก ์ด๋ค์ ธ์๋ค.
๊ฐ์ NavBar๋ฅผ ์ฌ์ฉํ๋ learn page์ main page๋ฅผ ํฉ์น๋ ค๊ณ ํ๋ค.
ํ์ง๋ง ํ์ฌ learn page๋ MUI๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ธํ ์ด์ง๋ง main page๋ ์ด๊ธฐ์ MUI๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ง ์์์ theme.ts๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ MUI๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํ์ด๋ค.
์ด๋ฒ์ ํ์๊ณผ code Review๋ฅผ ํ๋ฉฐ ๊นจ๋ฌ์ ๊ฒ์ด ์๋๋ฐ, ํด๋น ๋ถ๋ถ์ด main page์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์์ ์ ์ฉ๋์ง ์์๋ ๊ฒ ๊ฐ์์ ์ ์ฉํ๋ คํ๋ค
"ํจ์ ํ๋์ ํ๋์ ๋์์ด ์ด๋ค์ง ์ ์๋๋ก ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์์" ๋ผ๋ review๊ฐ ์์๋ค.
ํด๋น review๋ฅผ ๋ณด๊ณ ๊ฐ๋จํ๊ฒ refactoring์ ์งํํด ๋ดค๋๋ฐ ์๊ฐ๋ณด๋ค ์์ฃผ ๋ง์กฑ์ค๋ฌ์ ๋ค.
before
const Detail_Study = () => {
const [curTapId, setCurTapId] = useState(0);
const handleClickTap = (id: number) => {
if (id === 1 || id === 0) setCurTapId(id);
};
return (
<>
<Layout>
<DetailHeadContainer>
<StudyImg />
<HeadRightBox>
<SeperateHeartBtn>
<StudyName>...</StudyName>
<HeartBtn />
</SeperateHeartBtn>
<TeacherName>...</TeacherName>
<StudyTag study_tag={study_detail_tag} />
<SummaryStudy>...</SummaryStudy>
<StudyDeadLine>...</StudyDeadLine>
<Link href="/apply_math">
<HeadBottomBtn disabled>...</HeadBottomBtn>
</Link>
<div
style={{
display: 'flex',
justifyContent: 'flex-end',
}}
>
<a
href="http://pf.kakao.com/_yKHxnxj/chat"
target="_blank"
rel="noreferrer"
>
<div style={{ display: 'flex', alignItems: 'center' }}>
<KakaotalkContent>...</KakaotalkContent>
<Image/>
</div>
</a>
</div>
</HeadRightBox>
</DetailHeadContainer>
<TabContainer>
<TabTitleContainer>
{TAB_INFO.map((item) => {
return (
<TabTitleBox
active={curTapId === item.id}
first_tab={item.id === 0}
key={item.id}
onClick={() => handleClickTap(item.id)}
>
{item.title}
</TabTitleBox>
);
})}
</TabTitleContainer>
<TapContentsContainer>
{TAB_INFO.map((item) => {
if (curTapId === item.id) {
return item.contents;
}
})}
</TapContentsContainer>
</TabContainer>
</Layout>
</>
);
after
const Detail_Study = ({ study }: DetailProps) => {
return (
<Layout>
<DetailHeadContainer>
<StudyImg imageSrc={study.img} />
<Head study={study} />
</DetailHeadContainer>
<DetailStudyTab study={study} />
</Layout>
);
};
function Head({ study }: DetailProps) {
return (
<HeadRightBox>...</HeadRightBox>
);
}
function DetailStudyTab({ study }: DetailProps) {
...
return (
<TabContainer>...</TabContainer>
);
}
before ์ฝ๋๋ Detail_Study component์ ๋ชจ๋ ๋ก์ง์ด ๋ค์ด๊ฐ ์๋ค. ํ์ง๋ง Detail_Study ์์ ์๋ ๋ก์ง์ ๋๋ ๋ณด๋ฉด Head์ Tab
์ผ๋ก ๋๋ ์ ์์๋ค. ๊ทธ๋์ Head์ DetailStudyTab์ ๋ฐ๋ก ํจ์๋ก ๋ง๋ ๋ค Detail_Study component์์ ๋ถ๋ฆฌ์์ผฐ๋ค.
์ด๋ ๊ฒ ํ์ ๋, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ํด๋น component๋ฅผ ๋ดค์๋ ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ํ์คํ๊ฒ ์ ์ ์์ ๊ฒ ๊ฐ์๋ค. ๋ํ detail_study์์ ์์ ์ฌํญ์ด ๋ฐ์ํ์ ๋, Head๋ฅผ ๊ณ ์ณ์ผํ๋ฉด Head ํจ์์ ๊ฐ๊ณ , Tab์ ์์ ํด์ผํ๋ฉด DetailStudyTab์ ๊ฐ์ ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ refactoring์ ๋ฉด์์๋ ๋งค์ฐ ์ข์ ๊ฒ ๊ฐ์๋ค.
๋ํ component์ ํจ์์ ๊ตฌ๋ถ์ ์ํด์ component๋ arrow function์ผ๋ก ์์ฑํ๊ณ , ํจ์๋ ์ผ๋ฐ function์ ํตํด ์ ์๋ฅผ ๋ด๋ ธ๋ค.
// before
โโโ components
โ โโโ Header.tsx
โ โโโ Footer.tsx
โ โโโ TabStudyIntroduce.tsx
โ โโโ TabBookIntroduce.tsx
โ โโโ Tag.tsx
โโโ page
โ โโโ mainPage.tsx
โ โโโ detailStudyPage.tsx
โโโ run
// after
โโโ components
โ โโโ Header.tsx
โ โโโ Footer.tsx
โ โโโ Tag.tsx
โโโ page
โ โโโ mainPage
โ โ โโโ index.tsx
โ โโโ detailStudyPage
โ โโโ index.tsx
โ โโโ TabStudyIntroduce.tsx
| โโโ TabBookIntroduce.tsx
โโโ style
โ โโโ components
โ โ โโโ HeaderStyled.tsx
โ โ โโโ FooterStyled.tsx
โ โ โโโ TagStyled.tsx
โ โโโ page
โ โโโ mainPage
โ โ โโโ MainPageStyled.tsx
โ โโโ detailStudyPage
โ โโโ DetailStudyPageStyled.tsx
โ โโโ TabStudyIntroduceStyled.tsx
| โโโ TabBookIntroduceStyled.tsx
โโโ run