-
Notifications
You must be signed in to change notification settings - Fork 44
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
[김미소] Week13 #425
The head ref may contain hidden characters: "part3-\uAE40\uBBF8\uC18C-week13"
[김미소] Week13 #425
Conversation
수고 하셨습니다 ! 위클리 미션 하시느라 정말 수고 많으셨어요. |
커밋 메시지는 현재 커밋에서 어떠한 기록을 남길지를 말합니다:
다음은 커밋 메시지와 관련된 아티클입니다: commit 단위를 더욱 자주, 작게 해보시는건 어떠실까요?git을 다룰 때 commit은 "언제 해야 하는가"를 생각해보신 적 있으신가요?
그럼 커밋을 언제 해야 할까요?저는 다음과 같은 룰을 지키며 커밋을 하는걸 권장 드립니다:
관련하여 읽으시면 좋은 아티클을 추천드릴게요:tl;dr관련 변경 사항 커밋 자주 커밋 미완성 작업을 커밋하지 마십시오 커밋하기 전에 코드를 테스트하세요 |
export interface IImageSnsArr { | ||
id: string; | ||
src: string; | ||
link: string; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다음 타입은 배열이 아닌 것으로 보입니다 !
다음과 같이 Arr
을 없애보는건 어떨까요?
export interface IImageSnsArr { | |
id: string; | |
src: string; | |
link: string; | |
} | |
export interface IImageSns { | |
id: string; | |
src: string; | |
link: string; | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
또한, Footer
컴포넌트에서 IImageSns
타입을 반환하고 있습니다.
Footer
가 IImageSns
를 사용하고만 있는데 export
까지 해주면 Footer.tsx
의 역할이 많아질 것으로 우려됩니다 !
ImageSns
컴포넌트를 따로 만들어서 Props
를 정의하여 export
하거나, 앱 내에 자주 사용될 것으로 보인다면 타입 파일을 따로 만드시는게 어떨까요?
const imageSnsArr: IImageSnsArr[] = [ | ||
{ | ||
id: "Facebook", | ||
src: "/assets/icon/icons_face.svg", | ||
link: "https://www.facebook.com/?locale=ko_KR", | ||
}, | ||
{ | ||
id: "Twitter", | ||
src: "/assets/icon/icons_twt.svg", | ||
link: "https://twitter.com/?lang=ko", | ||
}, | ||
{ | ||
id: "YouTube", | ||
src: "/assets/icon/icons_you.svg", | ||
link: "https://www.youtube.com/", | ||
}, | ||
{ | ||
id: "Instagram", | ||
src: "/assets/icon/icons_ins.svg", | ||
link: "https://www.instagram.com/", | ||
}, | ||
]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
또한 타입 추론으로도 가능합니다.
만약, IImageSnsArr
타입이 재사용성이 낮다면 타입 추론을 활용해보시는 게 어떨까 싶어요 !
function Header({userInfo}:IHeaderUserLoginInfoApi) { | ||
const {pathname} = useRouter(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
프리티어를 사용해보시는거 어떨까요 ?
function Header({userInfo}:IHeaderUserLoginInfoApi) { | |
const {pathname} = useRouter(); | |
function Header({ userInfo }: IHeaderUserLoginInfoApi) { | |
const { pathname } = useRouter(); |
사소한 줄바꿈, 띄어쓰기 등 코드를 작성하시다보면 자연스럽게 불규칙해지는 경우가 많아요.
이를 돕기 위해서 개발 커뮤니티에서는 개발 경험 향상을 위한 여러가지 도구들이 있는데요.
보편적으로 많이 사용되는 툴은 prettier
입니다 !
Prettier: https://prettier.io/
prettier
는 vscode plugin에서 install
하고 실행할 수 있습니다 ! 🤗
macos 경우
option
+shift
+f
windows의 경우alt
+shift
+f
@@ -0,0 +1,9 @@ | |||
import { IImageSnsArr } from "./Footer"; | |||
|
|||
export default function SocialLinkButton({ id, src, link }: IImageSnsArr) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기서 Props
타입을 정의해줘도 되겠군요 !
export default function SocialLinkButton({ id, src, link }: IImageSnsArr) { | |
export default function SocialLinkButton({ id, src, link }: { id: string, src: string, link: string }) { |
해당 파일에서만 사용 되는 것으로 보여요. 그렇다면 Footer
에서 타입 추론으로 객체를 정의해두고 해당 컴포넌트에 props
를 내려줘도 될 것 같아요.
export default function SocialLinkButton({ id, src, link }: IImageSnsArr) { | ||
return ( | ||
<a href={link} target="_blank"> | ||
<img src={src} alt={id + "이동 버튼"} /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alt
는 대체 텍스트예요:
<img src={src} alt={id + "이동 버튼"} /> | |
<img src={src} alt={id + " 아이콘"} /> |
alt
는 스크린 리더 사용자에 대한 보조 텍스트가 될 수 있으므로 "어떠한 이미지 인지"를 작성해주는 것이 좋아요 !
alt의 목적
- 인터넷 연결이 끊겼을 때 대체되는 이미지
- 스크린 리더 사용자를 위한 대체 텍스트
- 이미지를 볼 수 없는 환경에서 이미지를 대체하기 위한 텍스트
등 목적을 알게 된다면 alt를 어떻게 사용하시면 될지 알 수 있을 것 같아요.
다음은 하버드 에듀케이션에서 제안하는 alt
규칙입니다:
tl;dr
- Write Good Alt Text
- Add alt text all non-decorative images.
- Keep it short and descriptive, like a tweet.
- Don’t include “image of” or “photo of”.
- Leave alt text blank if the image is purely decorative
- It's not necessary to add text in the Title field.
$buttonText: null, | ||
$modalData: null, | ||
}); | ||
const [searchContatn, setSearchContent] = useState<any>(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오타가 있는 것 같아요. 🤔
const [searchContatn, setSearchContent] = useState<any>(); | |
const [searchContent, setSearchContent] = useState<any>(); |
이러한 오타나 영어단어 오표기는 vscode
에 플러그인 하나만 설치하시면 손쉽게 해결할 수 있습니다 ! 🫠
변수에 영어가 틀리면 cSpell
이라고 하는 오류가 출력됩니다. 😊
} catch (error) { | ||
return { | ||
notFound: true, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
디버깅 없이 반환시킨다면 추 후 문제가 발생했을 때 추적하기 매우 어려워질 수 있습니다:
} catch (error) { | |
return { | |
notFound: true, | |
} | |
} catch (error) { | |
console.error('ERROR IN SERVER FETCHING DATA: ', error); | |
return { | |
notFound: true, | |
} |
const resTitle = await axios.get(`/folders/${query.id}`); | ||
const resContent = await axios.get(`/links?folderId=${query.id}`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
다음 코드는 병렬처리로 처리해보는건 어떨까요?:
const resTitle = await axios.get(`/folders/${query.id}`); | |
const resContent = await axios.get(`/links?folderId=${query.id}`); | |
const [resTitle, resContent] = await Promise.all([ | |
axios.get(`/folders/${query.id}`), | |
axios.get(`/links?folderId=${query.id}`) | |
]); |
이 전 패치를 기다렸다가 다음 패치를 진행하는 것 보다 한 번에 병렬처리 하는 것이 성능이 더욱 좋습니다 😊
$title = resTitle.data; | ||
$content = resContent.data; | ||
if(!$title.data[0]) { | ||
return { | ||
notFound: true, | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그리고 다음과 같이 작성하시면 let
으로 스코프를 걱정할 우려가 없어보입니다:
$title = resTitle.data; | |
$content = resContent.data; | |
if(!$title.data[0]) { | |
return { | |
notFound: true, | |
} | |
} | |
const $title = resTitle.data; | |
const $content = resContent.data; | |
if (!$title || !$title.length) { | |
return { | |
notFound: true, | |
} | |
} | |
return { | |
props: { | |
$title, | |
$content | |
} | |
} |
return { | ||
props:{ | ||
$title, | ||
$content | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제가 드린 코드로 한다면 요기는 지워도 될 것 같군요 !
수고 많으셨습니다 미소님 😊👍😊👍 |
요구사항
기본
심화
주요 변경사항
스크린샷
멘토에게