Skip to content

Conversation

@cskime
Copy link
Collaborator

@cskime cskime commented Sep 4, 2025

요구사항

기본

  • 네모 박스 안의 화면을 TypeScript로 마이그레이션해 주세요.

심화

  • any타입을 최소한으로 써주세요

주요 변경사항

  • 기존 프로젝트를 TypeScript를 사용할 수 있도록 설정합니다.
  • Onboarding, login, signup page를 TypeScript를 사용해서 구현합니다.
  • 이 page를 구현하기 위해 필요한 .js.jsx 파일을 .ts.tsx로 변환합니다.

스크린샷

Onboarding

Desktop Tablet Mobile
onboard-desktop onboard-tablet onboard-mobile

Login

Desktop Tablet Mobile
login-desktop login-tablet login-mobile

Signup

Desktop Tablet Mobile
signup-desktop signup-tablet signup-mobile

멘토에게

  • 함수 컴포넌트의 반환 타입은 따로 명시하지 않아도 JSX.Element로 추론될 것 같은데요. 현업에서는 반환타입을 JSX.Element로 명시하는 편인지, 아니면 추론되게 놔두는 편인지 궁금합니다.
  • 제가 사용했던 Swift 언어는 타입 추론이 성능에 영향을 줘서 일부러 타입 추론 기능을 사용하지 않기도 했었는데요. TypeScript를 사용할 때 타입을 명시하지 않고 타입 추론을 많이 사용하면 성능 저하가 일어날 수 있는지 궁금합니다.
  • enum 은 JS 변환 시 tree shaking이 되지 않아 성능상 좋지 않다는 글을 봤는데요. 대신 union type을 활용하라고 해서 이번 미션에서는 enum 을 사용하지 않으려고 해 보았습니다. 그런데, 개인적으로는 enum 문법을 더 선호하는데요. 현업에서는 enum을 많이 사용하나요?
  • package.json, vite.config.ts, tsconfig.json 등 소스 코드 외에 프로젝트 설정과 관련된 내용을 효과적으로 공부하는 방법이 있을까요? 지금은 강의에서 자세하게 알려주지 않기도 하고, 구글링하면서 공부해봐도 약간 뜬구름 잡는 느낌입니다.

@cskime cskime requested a review from kiJu2 September 4, 2025 14:07
@cskime cskime added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Sep 4, 2025
@cskime cskime changed the base branch from main to React-김참솔 September 4, 2025 14:08
@cskime cskime self-assigned this Sep 4, 2025
@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

스프리트 미션 하시느라 수고 많으셨어요.
학습에 도움 되실 수 있게 꼼꼼히 리뷰 하도록 해보겠습니다. 😊

@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

함수 컴포넌트의 반환 타입은 따로 명시하지 않아도 JSX.Element로 추론될 것 같은데요. 현업에서는 반환타입을 JSX.Element로 명시하는 편인지, 아니면 추론되게 놔두는 편인지 궁금합니다.

맞습니다 ! 제 경험에서는 따로 명시하는 곳은 못본 것 같네요 😉

@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

제가 사용했던 Swift 언어는 타입 추론이 성능에 영향을 줘서 일부러 타입 추론 기능을 사용하지 않기도 했었는데요. TypeScript를 사용할 때 타입을 명시하지 않고 타입 추론을 많이 사용하면 성능 저하가 일어날 수 있는지 궁금합니다.

오잉 ? 스위프트는 어떻게 동작하길래 성능에 영향을 주는지는 잘 모르겠습니다.
예상하기로 아마도 런타임에도 '타입'에 영향을 받기에 성능에도 영향을 끼치나보군요?

다만, 자바스크립트는 인터프리터이며, 타입스크립트의 경우 자바스크립트로 트랜스파일링을 해주는 언어 모델입니다.
따라서 타입스크립트로 산출된 코드가 타입이 없는 자바스크립트로 변환되므로 런타임 중 성능에 영향을 끼칠 것은 없을 것으로 보여요.

영향이 있다면 트랜스파일링 과정의 성능에 영향이 있을 수는 있겠으나 타입 별로 서로 다른 저수준 메모리 제어를 해주는 C, C++과 같은 언어처럼 다루진 않으므로 성능 상 영향이 클지는 잘 모르겠습니다. (해당 답변은 주관적 견해입니다 !)

@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

enum 은 JS 변환 시 tree shaking이 되지 않아 성능상 좋지 않다는 글을 봤는데요. 대신 union type을 활용하라고 해서 이번 미션에서는 enum 을 사용하지 않으려고 해 보았습니다. 그런데, 개인적으로는 enum 문법을 더 선호하는데요. 현업에서는 enum을 많이 사용하나요?

참고 : https://engineering.linecorp.com/ko/blog/typescript-enum-tree-shaking

음 저의 경우에는 혼자 개발할 때 아티클에서 소개한 방식대로 고정된 타입과 변수가 필요할 때(= enum이 필요할 때) as consttypeof를 사용했었는데요.
그런데 요새는 그냥 enum을 사용합니다. 편하니까요. 주로 사용하는 ORM도 기본적으로 enum을 사용하기도 하여 그냥 사용합니다 😉

저의 경험만 들어간 것 같아 다른 현직 개발자한테도 물어봤는데 굳이 enum을 사용하지 말자 ! 하는 제약은 없다고 하네요

@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

package.json, vite.config.ts, tsconfig.json 등 소스 코드 외에 프로젝트 설정과 관련된 내용을 효과적으로 공부하는 방법이 있을까요? 지금은 강의에서 자세하게 알려주지 않기도 하고, 구글링하면서 공부해봐도 약간 뜬구름 잡는 느낌입니다.

음 ~~ "프로젝트 설정과 관련된 내용을 효과적으로 공부하는 방법"이라면 역시 개인 프로젝트를 진행하는 방법이 제일 효과적이지 않을까 싶습니다 !
단위적으로 깊게 공부하는 것 보다는 하나의 프로젝트를 개발해보시고 그에 따라 필요한 제품 관리 스킬을 학습해보시는게 어떨까 싶습니다 !

Comment on lines +1 to +14
const Breakpoint = {
tablet: 1199,
mobile: 767,
} as const;

const MediaQueryBreakpoint = {
tablet: `(max-width: ${Breakpoint.tablet}px)`,
mobile: `(max-width: ${Breakpoint.mobile}px)`,
} as const;

type MediaQueryBreakpoint =
(typeof MediaQueryBreakpoint)[keyof typeof MediaQueryBreakpoint];

export { MediaQueryBreakpoint };
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호. 여기가 트리쉐이킹 이슈 때문에 enum을 쓰지 않았던 부분인가 보군요? 👏

평소에 여러 아티클을 읽으시나보군요. 훌륭합니다. 언제나 귀를 열어두시는 모습을 보면 다각적으로 성장하시는 모습이 느껴집니다 👍

Comment on lines +18 to +25
<Route
path="/"
element={
<OnboardingLayout>
<OnboardingPage />
</OnboardingLayout>
}
/>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

크으 ~ 레이아웃을 잘 배치시켜놨네요.

이 전에 children안에 레이아웃을 공통적으로 배치하셨었는데, react-router-dom에서 권장하는 방식으로 레이아웃으로 변경하셨군요 👍👍👍

import defaultImg from "../../assets/profile-default.svg";

const StyledAvatar = styled.div`
const StyledAvatar = styled.div<{ $size: number }>`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㄷㄷㄷ... 타입 제네릭도 바로 적용해버리시는 클라스.. 👍👍

Comment on lines +46 to +50
interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {
size?: ButtonSize;
shape?: ButtonShape;
children: React.ReactNode;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

크으..... 정말 멋집니다 참솔님 👍

공통 컴포넌트인 버튼에 타입을 기존에 리액트에 정의된 HTML 속성 타입들을 확장하여 만드시다니..
정말 훌륭하고 멋진 방법입니다. 이는 현업에서도 유효한 방법이예요. 👏👏

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 컴포넌트와 타입 파일을 구분해놓다니 흥미롭네요.

컴포넌트 내부에 해당 코드가 있어도 될 것 같은데, 따로 분리하셨다는 것은 파일의 목적에 따른 분리를 하고 싶으셔서 그런거겠죠? 😉
그렇다면, social-login.types.ts와 같이 정의해볼 수도 있겠어요.

그리고 같은 파일 내에 타입 선언과 컴포넌트가 함께있다면 어떤 단점과 장점이 있는지도 생각해보면 좋을 것 같아요. 😊

제 사견으로는.
컴포넌트와 타입이 함께 있다면 높은 응집도가 될 것으로 보입니다 ! 만약 다른 컴포넌트나 페이지, 레이아웃에서 해당 타입을 참조할 일이 있다면 그 때 파일을 분리하셔도 좋지 않을까 사료되네요. 😉

응집도: 응집도는 모듈의 독립성을 나타내는 개념

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 파일도 분리가 되어 있군요 !

같은 개념을 다루는 데에 있어서 하나의 파일에서 관리하셔도 무방할 것으로 보여요. 😊
앞선 피드백에 이어서 만약 타입 파일을 따로 분리하시고자 하신다면 form-social.types.tsx로 통합하여 분리하실 수도 있겠어요.

Comment on lines +13 to +20
function breakText(text: string): JSX.Element {
const elements = text.split("\n").map((value) => (
<span key={value} style={{ display: "inline-block" }}>
{value}
</span>
));
return <>{elements}</>;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 함수는 컴포넌트로 보이는군요 !

컴포넌트는 다음과 같이 표현해볼 수 있겠어요 😉

Suggested change
function breakText(text: string): JSX.Element {
const elements = text.split("\n").map((value) => (
<span key={value} style={{ display: "inline-block" }}>
{value}
</span>
));
return <>{elements}</>;
}
function BreakText({text}: {text: string}): JSX.Element {
const elements = text.split("\n").map((value) => (
<span key={value} style={{ display: "inline-block" }}>
{value}
</span>
));
return <>{elements}</>;
}

<TextContainer $reverse={reverse}>
<span>{content.label}</span>
<Title>{content.title}</Title>
<p>{breakText(content.description)}</p>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(이어서) 그리고 다음과 같이 호출해볼 수 있겠네요 😉

Suggested change
<p>{breakText(content.description)}</p>
<p><BreakText text={content.description} /></p>

@kiJu2
Copy link
Collaborator

kiJu2 commented Sep 5, 2025

크으 ~ 참솔님 역시 기대를 저버리지 않네요.
과제 진행도가 언제나 가장 앞서있으세요 ! 👍👍
참솔님의 질문을 보면 저도 배우는게 많아서 참솔님의 코드 피드백을 할 때 참 즐거운 시간이 되는 것 같아요 😊

나중에는 특정 기술과 패턴에 대해 논의하고 토론해봐도 재밌겠네요 👍

수고 많으셨습니다 참솔님 !!

@kiJu2 kiJu2 merged commit 67c6a4e into codeit-bootcamp-frontend:React-김참솔 Sep 5, 2025
@cskime cskime deleted the React-김참솔-sprint8 branch September 8, 2025 04:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants