과제의 대략적인 요구사항은 아래와 같았습니다.
초기 셋팅은 이전 과제물들과 동일하게 진행하였습니다.
불필요한 파일이 제거된 CRA를 생성하고,
ESLint,Prettier,husky가 설정이 된 repo를 main으로 올린 뒤, 팀원들이 모두 클론하여 각자의 브런치를 만들고 진행하였습니다.
추가적으로, 이번 과제에서는 API가 별도로 주어지지 않고 JSON 파일만이 주어졌기 때문에, public에 server 폴더를 만들고 거기에 보관하였습니다.
🎨 ui : 새로운 CSS관련 디자인에 대한 커밋
👏 chore : 파일 이동, 파일명 수정, 변수 제거 등의 자잘한 수정에 대한 커밋
📝 style : 공백 제거와 같은, 코드 스타일 혹은 포맷 등에 관한 커밋
과 같이 일부 커밋 규칙이 변경하였습니다.
기존 chore 규칙과 sytel 규칙의 경계가 너무 불분명하여, style 커밋은 자잘한 코드스타일에 대한 부분으로 제한하였습니다.
또한, ui 커밋을 따로 생성하여, 기존 feat커밋에 ui도 같이 겹치는 부분을 제거하기로 하였습니다.
이전 방식과 크게 달라진 부분은 없었습니다.
원칙적으로는, 과제 진행일 마다 매일 모여서 각자 의견을 공유하고, 제출 전날 각자 코딩리뷰를 한 후, BestPractice를 선출하였지만, 이번 과제물은 완성한 분이 한분밖에 없어서 자동적으로 그 분이 선출되었습니다.
<NavLink
to="/"
className={({ isActive }) =>
isActive
? `${ServicePageButtonStyle} bg-[#EDEFF1] text-[#586CF5]`
: `${ServicePageButtonStyle}`
}
>
사실 react-router-dom의 Link만 사용하여서 NavLink를 사용할 생각은 전혀 못했었는데, 팀원분의 정보 공유로 인해 손쉽게 페이지 이동에 따른 버튼의 디자인변경을 할 수 있었습니다.
NavLink는 클릭이 되어 페이지가 변경될시 className에서 isActive값을 주기 때문에, 이를 활용하여 버튼값의 디자인을 변경하였습니다.
이번 과제 같은경우 API가 전혀 주어지지 않고, JSON파일만이 주어졌습니다. 이것을 처리하기 위해서 어떠한 방식이 좋을지 토의해봤는데, json서버를 사용하거나, src 내에 data폴더에서 관리하여 불러오자는 의견등이 있었습니다. 하지만 팀원 한분의 의견으로 public에 json파일을 보관하고 해당 경로로 요청을 보내면 json 데이터를 API요청을 통해 받아오는것과 큰 차이없이 받아올수있다는 사실을 알게되었습니다.
정말 사소한것이지만, 이러한 발상으로 json파일을 코드에서 굳이 불러와 처리해줄 필요가 없다는것을 알게되어 좋았습니다.
예시) axios.get("/mockData/jsonFile.json")
이것도 사실 매우 단순하고 사소한것이지만, 지금까지는 bool값이 필요한 많은 부분에서 각각의 컴포넌트에서 useState를 사용하여 값을 생성하였습니다. 하지만 이러한 부분을 커스텀 훅을 사용하여 재사용하였고, 이후에도 추상화 하여, 재사용할 수 있는 부분이 있다면 커스텀 훅을 사용 해야겠다는 생각을 하게되었습니다.
export const useToggle = () => {
const [toggle, setToggle] = useState(false);
const onToggle = () => {
setToggle(prev => !prev);
};
return [toggle, onToggle];
};
//사용 방법 (드랍다운)
const [listToggle, onToggle] = useToggle();
<AdDropDownBlock onClick={onToggle}> 클릭시 토글값 변경
{listToggle && <토글일시 보여줄 값>}
<AdDropDownBlock/>
이전 강의에서 클린 코드를 위한 예시로서, OOP 관점에서 클래스가 하나의 관심사를 가지고 처리히먀, 또한 이것을 컨텍스트에서 값을 불러와 사용하는 예시를 강사님이 보여주셨습니다. 그래서 이번 프로젝트에서는 그러한 방식을 사용해보려 하였습니다.
//getAdList(type:string):Promise<adList[]>
export class AdListService {
#httpClient;
#Listpath;
#endPoint;
constructor(httpClient, endPoint = 'wanted_FE_ad-list-data-set.json') {
this.#httpClient = httpClient;
this.#endPoint = endPoint;
this.#Listpath = 'ads';
}
getAdList(type = 'all') {
return this.#httpClient.fetch(this.#endPoint).then(result => {
if (result.status !== 200) {
throw new Error('api Error');
}
const adsData = result.data[this.#Listpath];
if (type === 'all') {
return Promise.resolve(adsData);
} else {
return Promise.resolve(adsData.filter(adItem => adItem.status === type));
}
});
}
}
주석을 통해서 인터페이스를 적어주었고, httpClient와 endPoint를 의존성을 주입하여 사용할수있게 설계하였습니다.
//context에서의 사용.. 처음에 값을 받아와 set으로 값을 넣습니다.
useEffect(() => {
adListService.getAdList().then(result => {
setAdListData(result);
});
}, []);
차트는 'react-chartjs-2' 를 사용해보려했고, 날짜를 표현하는 것은 airDatePicker를 사용해보려했습니다.
둘다 처음 사용해보는 Lib기 때문에 당연히 많은 부분을 해맸습니다.
결국 최종적으로 해당 Lib를 사용하여 과제물을 완성하지는 못하였지만,
모르는것에 도전한 경험이 좋았습니다.
완성은 못하였지만, chartJs는 배열을 사용하여 값을 주입하면 값이 자동으로 완성되고, DatePicker 또한 훅을 통해 값을 보관하면 손쉽게 사용이 가능하다는 점을 알게되었습니다.
그리고, 외부 Lib를 사용하는경우, 디자인은 무조건 2순위로 작업해야 한다는것을 절실히 깨닫게 되었습니다.
이번 과제물 같은경우 Lib의 디자인에 신경쓰느라 시간 Resource를 많이 소비하였고, 결과적으로 만족하지 못한 결과가 나온것 같습니다.
(기간 내 미완성,작업기간 1.5일)
http://pre-onboarding-7th-2-2-9-june.s3-website.ap-northeast-2.amazonaws.com/
https://github.com/jun-05/pre-onboarding-7th-2-2-9
최종적으로 시간내 완성하신분이 한분밖에 없으셔서, 그분이 자동적으로 선출되었습니다.