December 13, 2020
저번 G9 클론 프로젝트에 이어 이번에는 마이리얼트립 클론 프로젝트에 참여하게 되었다.
프로젝트를 배정받고 나서 우리가 클론할 부분을 살펴보다가…엄청난 압박감이 몰려왔다.
페이지가 너무 많아..!! 😱
전부 너무 예쁘고 사랑스러운 기능들로 가득한 페이지였지만,
시간은 우리를 기다려 주지 않기에… 눈물을 머금고 쳐낼 것은 쳐내야 했다.
그렇게 채택된 것은 바로 항공권 예약 페이지~
2020-11-30 ~ 2020-12-11 (12일 간)
저번 프로젝트와 가장 달라진 점을 꼽아보자면
저번 프로젝트에선 class component와 sass를 사용했지만
이번 프로젝트는 hook을 사용한 functional component와 styled-components,
그리고 redux를 사용해서 구현해 보았다.
styled components를 사용하며 css in js의 멋짐과,
redux를 사용하며 전역 state 관리의 편안함,
hook을 사용하며 조금 더 간편한 컴포넌트 작성과 자주 사용되는 로직 분리의 편안함을 알아볼 수 있었다!
어쩌다 보니 이번에도 메인 페이지를 맡게 되었다.
이번에도 react-slick 라이브러리를 사용하여 image carousel을 구현했다.
이 라이브러리는 이전에도 사용해봤기에 커스터마이징 하는데 큰 어려움은 없었지만..
그 중에서도 꽤나 신경썼던 한가지를 꼽아보자면 바로 이 친구다.
자동으로 넘어가는 carousel에서 현재 페이지만 다른 색으로 보여주는 custom dot을 만들었다.
const [currentPage, setCurrentPage] = useState(1);
...
const sliderSettings = {
infinite: true,
arrows: false,
speed: 500,
slidesToShow: 2,
slidesToScroll: 2,
autoplay: true,
autoplaySpeed: 3500,
beforeChange: (current, next) => setCurrentPage(Math.ceil(next / 2) + 1),
};
...
return (
<Slider {...sliderSettings} ref={sliderRef}>
...
)
이런 식으로 현재 페이지를 state로 관리해주면서 react-slick에서 제공해주는 beforeChange를 사용해 현재 페이지를 갱신해주었다.
역시 document 잘 되어있는 라이브러리가 짱이라는 것을 또 새삼 느꼈다
마이리얼트립에는 두가지 버전의 네비게이션 바가 있다.
색깔만 다르고 하는 기능은 완전히 같다.
처음에는 기존에 하던 것 처럼 classname으로 색을 조절해야하나 싶었지만
styled-components를 익히고 나니 완전 쉽게 해결되었다. 이것이…스타일드 컴포넌트의 매력..?
<Navbar themeColor="normal" />
우선 Navbar 컴포넌트에 themeColor라는 prop을 넘겨주었고
const LogoImage = styled.img.attrs((props) => ({
alt: "my little trip logo",
src: props.themeColor === "normal" ? "/images/logo.png" : "/images/logo_white.png",
}))`
width: 128px;
margin: 0 20px;
`;
const NavContainer = styled.div`
z-index: 100;
border-bottom: 1px solid
${(props) => (props.themeColor === "normal" ? "rgba(0,0,0,0.05)" : "rgba(255, 255, 255, 0.2)")};
`;
...
&.signUpButton {
padding: 9px 30px 7px 30px;
border: 1px solid
${({ themeColor, theme }) => (themeColor === "normal" ? theme.deepBlue : theme.transparentWhite)};
Navbar는 그로부터 받아온 themeColor prop의 값이 무엇인지에 따라
다른 색이나 다른 이미지를 보여주도록 styled-component를 이용해 주었다.
너무 편하고 멋져..!
Date picker 라이브러리를 사용하여 항공권의 가는날 - 오는날 옵션 선택 창을 만들었다.
이 라이브러리도 document가 굉장히 잘 되어 있다.
엄청나게 다양한 옵션들이 있고, 원하는 옵션을 뽑아서 쓰면 된다.
나의 캘린더…
Css 커스터마이징도 어렵지 않게 해낼 수 있었다.
이번에는 소셜 로그인을 구현해보았다.
카카오 developers에 나와있는 가이드를 착실히 따라해보니 잘 되더라…
이번에 한번 해봤으니 다음에는 더 쉽게 해낼 수 있을 것 같다.
다음에는 다른 플랫폼으로도 시도해보는걸로…!!
메인 페이지에서 항공권 옵션을 선택한 후 리스트 페이지로 넘어갈 때 로딩 화면이 뜨게 되는데
항공권 데이터를 받아올 때 까지만 이 로딩 화면을 보이게 하자니, 너무 짧게 반짝 하고 사라져서
UX적인 관점을 생각하여 무조건 5초간 이 페이지가 보이도록 했다.
5초가 조금 긴 감도 있지만… 너무 예뻐서 자랑하고 싶은 마음에…(?)
그리고 깨알같이 메인 페이지에서 선택했던 옵션이 로딩스크린에도 나타난다.
const searchInfo = {
id: Date.now(),
depPlace,
arrPlace,
startDate,
endDate,
headCount,
seatType,
};
history.push({
pathname: "/list",
search: this.makeQueryString(searchInfo),
state: {
searchInfo,
},
});
react-router-dom의 usehistory를 사용하여 리스트 페이지로 넘어갈 때
searchInfo 객체를 같이 state에 넘겨주고,
List 페이지에서는 location.state로 searchInfo에 접근하게 해 주었다.
이 기능 완전 꿀인 것 같다. 다음에도 꼭 써먹어야지…!
이번에 처음 hook을 배우고 나서 나름의 custom Hook을 만들어서 컴포넌트 여기저기서 써먹었다.
(사실 구글신 지분률 70%지만… 쉿…)
clickOutside hook은 주로 모달창 컴포넌트에서,
useAxios는 정말 간단한 http 통신을 하는 컴포넌트들에서 주로 사용했다.
이래서 사람들이 함수형 컴포넌트 사용하는구나를 새삼 느꼈고,,
생각해보면 redux나 hook, styled-components 같은 나름 새로운 개념들을 배우면서 12일이라는 짧은 시간동안 이 일들을 해내야 했는데
처음에는 이걸 공부하면서 할 수 있는 걸까..? 싶었지만,… 해보니 되긴 되더라…
공부한 내용들을 바로 프로젝트에 적용해보면서 하니 더욱 습득이 빨랐던 것 같기도 하다.
마지막으로 무엇보다 우리 팀원분들…고생 많으셨습니다…
어찌보면 저번 프로젝트보다 훨씬 정신도 없고 시간도 훨씬 빨리 지나갔던 것 같습니다
중간에 갑자기 사회적 거리두기 2.5단계가 되면서 어려운 부분도 많았지만 ㅜㅜ 어떻게 해내긴 했네요..!
의문의 코딩공장 4층…잊지못할 추억거리도 남았어요… 지나고 나니 미화되는 기억쓰,,,