Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[유미정] Week12 #374

Conversation

ymj0828
Copy link
Collaborator

@ymj0828 ymj0828 commented Jan 10, 2024

요구사항

기본

  • ‘/folder’ 페이지를 Next.js 프로젝트에 맞게 변경 및 이전 했나요?
  • ‘/shared’ 페이지를 Next.js 프로젝트에 맞게 변경 및 이전 했나요?
  • 다른 페이지로 이동이 필요한 곳에 next/link의 Link를 적용했나요?
  • Input 컴포넌트에 값이 없는 경우 회색의 placeholder값을 볼 수 있나요?
  • Input 컴포넌트에 focus in 하면 파랑색 테두리를 볼 수 있나요?
  • Input 컴포넌트에 눈 모양 아이콘을 누르면 비밀번호 가리기/보기 기능이 토글 되나요?
  • Input 컴포넌트에 값이 에러케이스일 경우 빨강색 테두리와 에러 메세지를 볼 수 있나요?
  • Input 컴포넌트에서 focus out 하면 실행할 함수를 설정할 수 있나요?

주요 변경사항

  • React 프로젝트에서 Next.js 프로젝트로 마이그레이션
  • jsx 파일을 tsx 파일로 변경

멘토에게

  • 타입스크립트 실력이 많이 부족하여 템플릿코드를 많이 참고하였습니다 그래서 이해가 안되는 코드가 굉장히 많은데 그 부분은 더 학습해보겠습니다
  • next.config.js 파일 설정을 어떻게 해야 할 지 몰라 그것도 템플릿코드로 가져왔는데 module.exports에서 이미지의 도메인을 저렇게 하나하나 다 써야 되는지 궁금합니다

@ymj0828 ymj0828 requested a review from soonoo27 January 10, 2024 08:34
@ymj0828 ymj0828 added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다... labels Jan 10, 2024
Copy link
Collaborator

@soonoo27 soonoo27 left a comment

Choose a reason for hiding this comment

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

다양한 컴포넌트 prop에 타입 시스템을 잘 적용해주셨네요! 고생 많으셨습니다 👍

Comment on lines +5 to +9
if (loading || error || !data) {
// 로딩 중 ui
return;
}
return data;
Copy link
Collaborator

Choose a reason for hiding this comment

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

data, loading, error를 함께 반환하고, UI 노출 여부 등은 useGetData를 호출하는 컴포넌트에서 결정하는건 어떨까요?

const useGetData = (url) => {
  const { loading, error, data } = useAsync(url);
  return { loading, error, data };
};

@@ -0,0 +1,5 @@
const getFormatDate = (date) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

입력과 출력이 비교적 명확/간단한 getFormatDate 같은 함수부터 타입스크립트를 적용해보는 것도 좋을 것 같습니다!

};

useEffect(() => {
if (links) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

조건을 만족하지 않을 때 빠르게 return하고 그 이후에 로직을 실행하는 방식으로 진행해보면 어떨까요?

if (links) {
  return;
}
// 기존 코드 실행
...

이렇게 조건이 충족되지 않을 때 빠르게 함수를 종료시키는 방식을 얼리 리턴이라고 하는데요, 중첩 단계를 줄이고 주요 로직에 집중할 수 있도록 도움을 주는 경우가 많습니다.
(참고: https://mkseo.pe.kr/blog/?p=2631&cpage=1)

Comment on lines +13 to +15
const { data: folders }: any = useGetData("users/1/folders") || {};
const [selectedFolderId, setSelectedFolderId] = useState<string>("");
const { data: folderDatas }: any =
Copy link
Collaborator

Choose a reason for hiding this comment

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

foldersfolderDatas 두 변수 명을 아래와 같이 변경하면 각 변수가 어떤 데이터를 담고 있는지 조금 더 명확하고 구체적으로 나타낼 수 있을 것 같습니다.

const { data: folders }: any = useGetData("users/1/folders") || {};
const { data: folderLinks }: any = useGetData(`users/1/links?folderId=${selectedFolderId}`) || {};


const SharedPage = () => {
const { folder }: any = useGetData("sample/folder") || {};
const { links } = folder || [];
Copy link
Collaborator

Choose a reason for hiding this comment

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

예외 상황에 대한 처리를 꼼꼼하게 잘 해주셨네요!

const cx = classNames.bind(styles);

const Profile = () => {
const { email, profileImageSource }: any = useGetData("sample/user") || {};
Copy link
Collaborator

Choose a reason for hiding this comment

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

user 데이터는 데이터 구조가 비교적 간단하네요!
이렇게 간단한 구조를 가진 api 응답들부터 타입을 작성해보면 좋을 것 같습니다.

{
    "id": 1,
    "name": "코드잇",
    "email": "[email protected]",
    "profileImageSource": "https://codeit-front.s3.ap-northeast-2.amazonaws.com/images/default_profile.png"
}

Comment on lines +17 to +22
images: {
domains: [
"codeit-front.s3.ap-northeast-2.amazonaws.com",
"codeit-images.codeit.com",
],
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Next.js에서는 Image 컴포넌트를 통해 이미지 최적화 기능을 제공합니다.
이 Image 컴포넌트를 통해 서빙하기 위한 이미지의 도메인은 모두 작성해주신 설정 파일 내 domains 목록에 포함되어야 합니다.

모든 도메인을 허용하는 방법이 있기는 한데요, 보안 상의 이유로 권장되는 방법은 아닙니다.

<FolderToolBar
foldersData={folders}
selectedFolderId={selectedFolderId}
onFolderClick={(id: string) => setSelectedFolderId(id)}
Copy link
Collaborator

Choose a reason for hiding this comment

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

onFolderClick도 다른 prop들과 같은 방식으로 전달 가능하겠네요!

onFolderClick={setSelectedFolderId}

const cx = classNames.bind(styles);

type AddFolderButtonProps = {
onClick: MouseEventHandler<HTMLButtonElement>;
Copy link
Collaborator

Choose a reason for hiding this comment

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

이벤트 핸들러의 타입을 잘 정의해주셨네요!

MouseEventHandler, HTMLButtonElement같은 내장 타입들의 선언을 살펴보시는 것도 타입 시스템을 이해하는 데 도움이 될 것 같습니다.
VS Code 기준, 키워드(ex. MouseEventHandler)를 마우스 우클릭하면 해당 타입이 어떻게 선언되어 있는지 확인할 수 있습니다.

@soonoo27 soonoo27 merged commit aebf945 into codeit-bootcamp-frontend:part3-유미정 Jan 11, 2024
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