Conversation
There was a problem hiding this comment.
👏👏👏 과제 너무 잘하셨네요!
코드 읽으면서 계속 아 이렇게 구현할 수도 있구나! 아 이렇게 하면 더 깔끔해지는구나를 반복했습니다.
다만, 과제가 굉장히 가볍고 간단한 사이트인데 그에 비해 파일이 너무 잘게 쪼개져 있어 개인적으로 조금 복잡하게 느껴지기도 합니다..!
또한, 별 거 아니지만 코드 보다보니 {" "} 이렇게 남아있는 부분이 있던데 요런 부분들은 삭제하면 더 깔끔할 것 같습니다:)
그치만 이것들 제외하곤 코멘트 달 게 거의 없네용... 많이 배워 갑니다! 수고하셨어요~!
| const user = localStorage.getItem("user"); | ||
| if (!user) { | ||
| alert("로그인 후 이용하세요."); | ||
| return redirect("/login"); |
There was a problem hiding this comment.
우와 이런 식으로 리다이렉트를 구현하는 거군요! 새롭게 알아갑니다💡
There was a problem hiding this comment.
그냥 navigate로 url 주는거랑 redirect 사용하는거랑 어떤 차이가 있나요?
| export const Generators = { | ||
| flexGenerator: (flexDirection = "row", alignItems = "center", justifyContent = "center") => css` | ||
| display: flex; | ||
| flex-direction: ${flexDirection}; | ||
| align-items: ${alignItems}; | ||
| justify-content: ${justifyContent}; | ||
| `, | ||
| }; |
There was a problem hiding this comment.
항상 여러 줄로 작성했던 코드인데 이렇게 하니까 한 줄에 작성할 수 있어 훨씬 간결해지네요!👍
| {type === "password" && ( | ||
| <S.ToggleVisibilityIcon | ||
| onClick={handlePasswordVisibility} | ||
| as={isPasswordVisible ? IconEyeOn : IconEyeOff} |
| const errorMsg = | ||
| status === 401 && data.code === "00" | ||
| ? "토큰이 없습니다. 다시 로그인하세요." | ||
| : status === 403 && data.code === "00" | ||
| ? "유효하지 않은 토큰입니다." | ||
| : status === 404 && data.code === "00" | ||
| ? "유효하지 않은 경로입니다." | ||
| : "알 수 없는 오류가 발생했습니다."; | ||
| alert(errorMsg); |
There was a problem hiding this comment.
조건 별로 alert 문을 중복해서 작성하는 게 아니라 메시지만 바꾸니까 훨씬 깔끔한 것 같네요!
저도 이 방식으로 리팩토링 해야겠습니다.
gwagjiug
left a comment
There was a problem hiding this comment.
코리하면서 많이 공부했네요 css 제네레이터, 에러처리 로직에 대한 고민까지 해볼 수 있는 시간이였고
alert 를 errorMessage 로 묶어서 처리한 거 전 생각못했는데 인상 깊었습니다 ㅎ
| : exports => exports; | ||
|
|
||
| // Defer to the real eslint your application uses | ||
| module.exports = wrapWithUserWrapper(absRequire(`eslint`)); |
| const errorMsg = | ||
| status === 401 && data.code === "00" | ||
| ? "토큰이 없습니다. 다시 로그인하세요." | ||
| : status === 403 && data.code === "00" | ||
| ? "유효하지 않은 토큰입니다." | ||
| : status === 404 && data.code === "00" | ||
| ? "유효하지 않은 경로입니다." | ||
| : "알 수 없는 오류가 발생했습니다."; | ||
| alert(errorMsg); |
| <S.Title>{title}</S.Title> | ||
| {children} | ||
| <p> | ||
| 이미 회원이신가요? <S.SignupBtn onClick={goToLogin}>로그인</S.SignupBtn> |
| export const login = async (username: string, password: string) => { | ||
| const response = await apiClient.post("/login", { username, password }); | ||
| return response.data.result; | ||
| }; |
There was a problem hiding this comment.
이 부분에서는 결과값만 넘겨주고 페이지에서 결과를 기준으로 에러 관련 alert를 보여주는 것 맞나요??
저도 api 레벨에서 에러처리가 되는 것 vs 호출하는 곳에서 에처 처리 하는 것에 대해서 리뷰하면서 찾아봤는데
재사용성 측면에서는 api 에서 에러처리를 하는 것이 로직 처리를 일관적으로 구현할 수 있어서 좋다고 하고, 사용자 경험 측면에서는 호출한 곳에서 UI/UX 를 자유롭게 제어가능하다는 점때문에
호출하는 곳에서 에러처리가 더 유리하다고 알려져있네용
그래서 여러 곳에서 동일한 API 호출을 사용하는 경우에는 api 레벨에서 에러처리하는 것이 더 권장되고,
에러를 호출한 컴포넌트/페이지에서 세부적 으로 처리해야 하는 경우에는 채현님 방식이 더 적합한 것 같아요
덕분에 하나 더 공부했네요 😎
|
|
||
| export const InputWrapper = styled.article` | ||
| position: relative; | ||
| ${Generators.flexGenerator("row", "center", "center")} |
There was a problem hiding this comment.
이런식으로 사용하는거네요 이거 저도 한번 써보겠습니다 ㅎㅎ
| position: relative; | ||
| ${Generators.flexGenerator("row", "center", "center")} | ||
|
|
||
| width: inherit; |
| navigate("/login"); | ||
| }; | ||
|
|
||
| const goToMyPageTab = (tab) => { |
|
과제 되게 열심히 하시네영. 멋진 오비다!!!!!!!!! 꺄르륵 |
✨ 구현 기능 명세
💡 기본 과제
취미,내 정보메뉴 탭로그아웃버튼취미,내 정보취미 페이지, 내 정보 페이지 출력 (1개의 페이지로 구현해도 되고, url 달라도 됨)🔥 심화 과제
공유과제
https://wave-web.tistory.com/125
❗️ 내가 새로 알게 된 점
❓ 구현 과정에서의 어려웠던/고민했던 부분
🥲 소요 시간
12h🖼️ 구현 결과물
https://imdevdoy.notion.site/4-13c8a5b7422b80eb9064c89cf318f76f?pvs=4