- 주제 : 온라인 강의 사이트
- 기술 스택
Frond-end : react , react-query, axios, react-hook-form , react-player , scss, chakra-UI
Back-end : django, nginx ,certbot, ubuntu, mysql, ObjectStorage
- 프로젝트 인원 : 프론트엔드 3명, 백엔드 3명
- 총 프로젝트 기간
기획: 3월 2일 ~ 3월 6일
제작: 3월 7일~ 3월 28일
- Git으로 협업해서 진행
백엔드에서 데이터를 fetch 해오는 첫 프로젝트
리액트 컴포넌트를 공유하여 효율성을 높이는 작업
⭐ 표시는 내가 기여한 기능!
프로젝트로 최종적으로 만든 → 구현 페이지
<Controller
name="rating"
control={control}
rules={{ required: true }}
render={({ field }) => (
<StarScore
{...field}
onRatingChange={value => {
setValue('rating', value);
}}
/>
)}
/>
const StarScore = forwardRef(({ value, onChange }, ref) => {
그래서 위 코드처럼 react-hook-form 의 controller를 사용하고 StarScore 컴포넌트에서는 forwardRef를 사용하여 상위 컴포넌트에 값을 넘겨주어서 별점 기능을 구현하였다.
React-Player로 영상을 재생하고 영상이 80퍼센트가 되었을 때 isPlayer : true를 서버로 보내서 저장을 하기위해 작업을 하던 중 문제가 발생했었다.
const handleProgress = state => {
setPlayedSeconds(state.playedSeconds);
const duration = playerRef.current?.getDuration();
if (duration && state.playedSeconds >= duration * 0.8 && !isCompleted) {
setIsCompleted(true);
setPlayed80(true);
watchedlectures80Mutation.mutate({
lectureId,
num,
is_completed: true,
lastPlayed: playedSeconds,
});
return;
}
};
위 코드는 React-Player에서 영상 재생시간을 받아오기 위해 작성했는데
api로 연결하고 보니 80%가 넘어가면 영상이 재생되는 동안 계속 서버로 보내지는 문제가 발생했다.
그래서 방법을 찾던 중 useCallback을 사용하는 방법으로 해결할 수 있었다.
const sendDataToServer = useCallback(() => {
// Your logic to send data to the server
}, [/*dependencies*/]);
useEffect(() => {
sendDataToServer();
}, [sendDataToServer]);
위의 예시 코드는 구성요소가 마운트될 때 useEffect 후크를 사용하여 sendDataToServer 함수를 호출하고, 함수가 한 번만 호출되도록 빈 종속성 배열([])을 useEffect 후크에 전달한다.
하지만 다시 실행해야 하는 종속성이 있는 경우 예기치 않은 동작이 발생할 수 있으므로 빈 종속성 배열을 사용할 때는 주의해야하고 useCallback 및 useEffect 후크의 종속성 배열에 필요한 모든 종속성을 포함해야 한다고 한다.
const watchedlectures80Mutation = useCallback(
useMutation(watchedlectures80, {
onSuccess: () => {
queryClient.invalidateQueries(queryKey);
},
}),
[]
);
useEffect(() => {
if (isCompleted) {
watchedlectures80Mutation.mutate({
lectureId,
num,
is_completed: true,
lastPlayed: playedSeconds,
});
}
}, [isCompleted, watchedlectures80Mutation, lectureId, num]);
그래서 위의 코드로 데이터를 보내는 호출은 80퍼센트가 됐을 때 한번만 보내지게 만들었다.
이번 프로젝트는 react로 구현하는 첫 프로젝트여서 데이터가 많아지면서 렌더링이 느려질 때를 대비하지 않은 채 기능구현을 해서 로딩중일 때 화면이 어색하게 나오는 부분이 꽤 있었다. 다음 프로젝트에서는 로딩중 상태일 때 화면구현과 컴포넌트를 더 세부적으로 나눠서 코드의 가독성을 높여볼 생각이다.
백엔드에서 데이터를 fetch 해오는 첫 프로젝트이자 리액트로 하는 첫 프로젝트여서 처음엔 막막했지만 팀원들과 협력하여 생각보다 괜찮은 결과물이 나온 것 같아서 뿌듯하다.
다음 프로젝트에서는 만들고 기능구현에 급급하기보단 리액트의 본질이나 개념에 대해서 더 이해하면서 만들어보고싶다는 생각을 했다.