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

[박소현] week20 #562

Conversation

ParkSohyunee
Copy link
Collaborator

@ParkSohyunee ParkSohyunee commented Jan 21, 2024

요구사항

기본

  • [기본] 프로젝트 전반에 필요한 리팩토링, 기능 개선을 진행했나요?
  • [기본] 즐겨찾기 설정된 카드의 별은 파랑색이 되나요?
  • [기본] 파랑색 별을 다시 클릭하면 즐겨찾기 설정이 해제되고 회색으로 돌아가나요?
  • [기본] 즐겨찾기 설정/해제는 PUT ‘/links/{linkId}’ 를 활용했나요?

심화

  • [심화] 카드를 클릭하고 드래그 해서 원하는 위치로 이동하면 순서가 바뀌는 2차원 드래그 앤 드롭 기능을 만들었나요?

주요 변경사항

  • week20 피드백 반영
  • 즐겨찾기 기능 구현(미완성)

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다. 😃

@ParkSohyunee ParkSohyunee added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 죄송합니다.. labels Jan 21, 2024
@ParkSohyunee ParkSohyunee requested a review from kiJu2 January 21, 2024 10:30
Comment on lines +35 to +43
return await fetch(`${DOMAIN_URL}${url}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json; charset=utf-8",
},
body: JSON.stringify({ favorite: !link.favorite }),
}).then(() => mutate("/links"));
}
Copy link
Collaborator Author

@ParkSohyunee ParkSohyunee Jan 21, 2024

Choose a reason for hiding this comment

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

📌 즐겨찾기 기능 구현 중에 api 요청시 다음과 같이 violate 에러가 발생하는데 원인을 잘 모르겠습니다ㅠㅠ
링크데이터는 이미 폴더ID를 기반으로 생성되는데 folderId가 null value로 확인되는 이유를 잘 모르겠습니다,,

스크린샷 2024-01-21 오후 4 02 53

Copy link
Collaborator

Choose a reason for hiding this comment

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

헐~ 저두 똑같은 문제가 생겨요. 스웨거에서 체크해봐도 그렇더라구요 ㅠㅠ..

Copy link
Collaborator

Choose a reason for hiding this comment

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

image

안녕하세요 소현님 ! 현재 코드 기준으로 해당 에러는 제가 확인할 수가 없는데 제가 방법을 잘못하고 있는걸까요?
새 폴더를 만들고 즐겨찾기/ 즐겨찾기 해제를 눌러보았습니다.

@ParkSohyunee ParkSohyunee self-assigned this Jan 21, 2024
Copy link
Collaborator

@hongjw030 hongjw030 left a comment

Choose a reason for hiding this comment

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

허허 소현님 pr 올라왔길래 한걸음에 달려온... 🥹🥹🥹🥹🥹 언제나봐도 깔꼼 그자체네용 ㅎㅋㅋ
이게 저희 마지막 위클리 미션이죠?! 넘넘 뿌듯하네요 ㅎㅎ 소현님 pr 보자마자 감동 쓰나미 막 몰려오는 중...

넘넘 고생 많으셨어요!!!! 소현님 꾸준함 성실함 코드 실력 등등, 오늘도 많이 배우고 동기부여 얻구 가요!! 😎😎😎

Comment on lines +35 to +43
return await fetch(`${DOMAIN_URL}${url}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json; charset=utf-8",
},
body: JSON.stringify({ favorite: !link.favorite }),
}).then(() => mutate("/links"));
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

헐~ 저두 똑같은 문제가 생겨요. 스웨거에서 체크해봐도 그렇더라구요 ㅠㅠ..

@@ -24,7 +24,7 @@ export default function AddFolders({ onClose }: AddFoldersProps) {
"Content-Type": "application/json; charset=utf-8",
},
body: JSON.stringify({ name }),
}).then((res) => res.json());
}).then(() => mutate("/folders"));
Copy link
Collaborator

Choose a reason for hiding this comment

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

오~ 저는 promise chaining 이 익숙지 않아서 자꾸 if문 써서 동기적으로 코드 짜는데 한수 배워갑니당 --__

@ParkSohyunee
Copy link
Collaborator Author

허허 소현님 pr 올라왔길래 한걸음에 달려온... 🥹🥹🥹🥹🥹 언제나봐도 깔꼼 그자체네용 ㅎㅋㅋ 이게 저희 마지막 위클리 미션이죠?! 넘넘 뿌듯하네요 ㅎㅎ 소현님 pr 보자마자 감동 쓰나미 막 몰려오는 중...

넘넘 고생 많으셨어요!!!! 소현님 꾸준함 성실함 코드 실력 등등, 오늘도 많이 배우고 동기부여 얻구 가요!! 😎😎😎

@hongjw030
재원님! 마지막까지 리뷰해주셔서 너무 감사드립니다! 늘 응원의 말씀해주셔서 제가 더 많이 배웠습니다😊
열정 가득한 재원님 덕분에 저도 더 잘해야겠다는 생각도 많이 들었고, 그만큼 동기부여도 많이 되었습니다.❤️‍🔥 마지막까지 파이팅!!!!

@kiJu2
Copy link
Collaborator

kiJu2 commented Jan 22, 2024

위클리미션 진행하시느라 수고 많으셨습니다 소현님. =)

@@ -1,2 +1,4 @@
export const TEST_USER_ID = 1;
export const DEFAULT = "전체";
Copy link
Collaborator

Choose a reason for hiding this comment

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

DEFAULT라는 이름보다는 좀 더 목적성 있는 변수명을 짓는게 어떨까요?

src/common/constants.ts에 있는 내용은 흔하게 쓰일 공통 상수로 보입니다.

사실, DEFAULT처럼 흔하게 쓰일 값은 지역적으로 두는 것이 좋을 것 같은데
소현님의 프로젝트를 살펴보니 총 4 곳에서 사용되고 있군요 !

그렇다면 해당 기본값을 명칭하는 자원을 변수명에 넣어서 FOLDER_FILTER_DEFAULT_VALUE 와 같이 짓는게 어떨까요?
만약, 폴더처럼 link 자원에서 DEFAULT 값이 필요할 수도 있으니까요. 😊

export async function signupUser(userData: SubmitFormData) {
const res = await fetch(`${DOMAIN_URL}/auth/sign-up`, {
method: "POST",
headers,
headers: headers,
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
headers: headers,
headers,

간단한거지만 위와 같이 표현할 수도 있어요 !

export const DOMAIN_URL = "https://bootcamp-api.codeit.kr/api/linkbrary/v1";
export const headers = { "Content-Type": "application/json; charset=utf-8" };
Copy link
Collaborator

Choose a reason for hiding this comment

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

hedaers는 상수가 아니라 config의 성격과 잘 맞을 것 같아요.

headers는 상수보다는 config의 성격과 잘 맞을 것 같아요.
commonfetch.config.ts와 같은 값을 두고 사용하시는 건 어떨까요?
만약, axios를 사용하신다면 instance를 생성해서 사용하는 것도 하나의 방법일 것 같아요.

headers, url, path를 초기에 한 번만 설장할 수 있으면 어떨까요? (심화 주제)

그렇다면 headers를 매번 불러오지 않도록 하는건 어떨까요?
다음은 GPT에게 물어본 예시 코드입니다:

// 공통 설정을 반영한 fetch 함수를 정의
const customFetch = (baseURL, headers = {}) => {
  // fetch를 wrapping하는 함수를 반환
  return (endpoint, options = {}) => {
    // 공통 헤더와 옵션을 병합
    const mergedOptions = {
      ...options,
      headers: {
        ...headers,
        ...options.headers,
      },
    };

    // 실제 fetch 호출
    return fetch(`${baseURL}${endpoint}`, mergedOptions)
      .then(response => {
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.json();
      });
  };
};

// 사용 예시
// customFetch 함수를 사용하여 공통 설정이 적용된 새로운 fetch 함수 생성
const myFetch = customFetch('https://api.mywebsite.com', {
  'Content-Type': 'application/json',
  // 기타 필요한 공통 헤더 추가
});

// myFetch 사용
myFetch('/users', {
  method: 'GET',
}).then(data => {
  console.log(data);
}).catch(error => {
  console.error('There was an error!', error);
});

물론 axios를 활용한다면 위와 같은 세팅은 필요 없겠지만, 한 번의 세팅으로 fetch를 재사용할 수 있다면 유지보수 측면에서 수월할 수 있어요. 한 번 즈음 생각해보면 소현님에게도 도움이 될 수 있을 것 같아요 =)

Comment on lines +3 to +8
interface ToggleButtonProps {
toggle: boolean;
onIcon: ReactNode;
offIcon: ReactNode;
onToggle: (e: MouseEvent<HTMLDivElement>) => Promise<void>;
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

props 타입을 잘 지정해주셨네요. 👍👍

@@ -1,19 +1,24 @@
import Image from "next/image";
import { useState } from "react";
import { MouseEvent, useEffect, useState } from "react";
import { mutate } from "swr";
Copy link
Collaborator

Choose a reason for hiding this comment

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

오호. 지금 봤네요 swr를 사용하셨군요.

const result = await fetcher(`/links/${link.id}`);
console.log(result); // error
} catch (error) {
console.log(error);
Copy link
Collaborator

Choose a reason for hiding this comment

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

console은 생각보다 다양한 메서드가 있어요.

Suggested change
console.log(error);
console.error(error);

console.log 말고도 console.error, console.dir, console.countconsole은 개발자들이 모르는 많은 메써드들이 있어요 !

이번은 실수일 수도 있겠지만 디버깅 할 때 유용하므로 이번 기회에 console에 대해서 mdn 문서를 한 번 보시는 것도 도움이 될 것 같아요. =)
mdn console

@@ -0,0 +1,3 @@
export default function FilledStarIcon() {
return <img src="/assets/filled_star.svg" alt="favorite" />;
Copy link
Collaborator

Choose a reason for hiding this comment

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

alt를 좀 더 구체적으로 작성해볼까요?

alt를 꼼꼼하게 작성했군요 ! 좋은 습관입니다.
다만, 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.

원문 보기

@kiJu2 kiJu2 merged commit d28fb23 into codeit-bootcamp-frontend:part3-박소현 Jan 22, 2024
@kiJu2
Copy link
Collaborator

kiJu2 commented Jan 22, 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.

3 participants