프로젝트 개요
- 팀명 : wallstreet
- 기간 : 2020.10.02 ~ 2020.10.16
- 인원 : 총 5명 (백엔드 2명, 프론트엔드 3명)
- 설명 : 가상 화폐 거래 사이트 '코인원' 사이트를 참고하여 클론 프로젝트를 진행하였으며, 레이아웃과 기능을 크게 3개로 나눠 역할을 분담하였다.
- 역할 분담
- 백엔드: 회원가입, 로그인 / 가상 거래 데이터 생성 / 암호화폐 매수, 매도 기능
- 프론트엔드: 메인페이지 / 거래소페이지 / 기타(로그인, 회원가입, 수익현황 등)
카카오톡 서버 측으로 유저 정보를 post 통신으로 보냈을 때 응답으로 받은 토큰을 백엔드 측으로 보내주고, 우리 서버에서 다시 카카오톡 서버와 통신하여 전용 토큰을 만드는 알고리즘으로 소셜로그인 기능을 구현하였습니다.
// 받아온 데이터와 이전 데이터를 비교해 Boolean 값을 삽입
// buyArr 새로 들어오는 데이터, buyWaiting 기존 데이터(시세별 주문현황)
for (let i = 0; i < buyArr.length; i++) {
for (let e = 0; e < buyWaiting.length; e++) {
if (
buyArr[i][0] === buyWaiting[e][0] &&
buyArr[i][1] === buyWaiting[e][1]
) {
buyArr[i][3] = false;
// 새로운 데이터와 기존 데이터에 내용이 동일하다면 false 삽입
continue;
}
}
if (buyArr[i][3] !== false) {
// 위 조건에 해당하지 않으면 true 삽입
buyArr[i][3] = true;
}
}
/*styled-component*/
const MapUnit = styled.div`
${({ theme }) => theme.flex(null, 'center', 'row')}
position:relative;
text-align: right;
height: 36px;
/* boolean 값에 따라 애니메이션 활성화 */
@keyframes updatingData {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
100% {
opacity: 0;
}
}
animation-name: ${({ update }) => (update ? 'updatingData' : null)};
animation-duration: ${({ update }) => (update ? '1s' : null)};
animation-timing-function: ${({ update }) => (update ? 'ease-out' : null)};
div {
${({ theme }) => theme.flex('space-between', 'center', 'row')}
}
`;
선정 이유
이 코드를 고민했던 두 가지 포인트가 있었다.
사실, 이것은 막바지에 구현하려는 추가 기능이었다. 백엔드가 가상 데이터를 실시간으로 업데이트하고 받아오는 과정이었는데, 사이트에서 너무 눈에 띄지 않았기 때문이다. 데이터를 최대한 전달력있게 보여주는 것이 프론트에 역할이라고 생각했고, 그동안의 팀원들의 노고를 꼭 보여주고 싶었기에 매달렸던 것 같다. 구현했을 때는 굉장히 기뻤고 보람찼기에 선정하게 되었다.
상황 설명
HighCharts 그래프에 활용하는 데이터 형식이 있고, 그 안에 수치 데이터를 삽입하는 부분이 있다. 해당 부분을 fetch
함수 실행할 때마다 바꿔주어야 했고, 이를 위해 함수를 별도로 선언하였다.
그런데, fetch
이전의 초기 rendering 에서 그래프 데이터 형식이 완전하지 않아서 해당 함수에서 활용하는 key 값에 대해 undefined 오류가 발생하였다.
optional chaining
?.
: 앞의 평가 대상이 undefined
나 null
이면 평가를 멈추고 undefined
를 반환한다.
//데이터를 호출하는 함수 선언
const fetchChart = () => {
// state 값에 대입
setChart({
...chart,
plotOptions: {
line: {
color: chartList[coinId]?.upDown > 0 ? "#e12343" : "#1763b6",
},
},
// optional chaining 사용
title: {
text: chartList[coinId]?.coinName,
},
subtitle: {
text: chartList[coinId]?.present,
style: {
color: chartList[coinId]?.upDown > 0 ? "#e12343" : "#1763b6",
}
},
series: [
{
data: chartList[coinId]?.data.map((data) => [
data.reported_time,
data.closing_price,
]),
},
],
});
};
뭔가 고생했던 것에 비하면 너무나도 짧은 블로깅인 듯한 느낌이지만, 그래도 위에서 언급한 코드는 정말 몇시간 동안 고민해서 깨달았던 것들이라 정말 보람찼던 기억이다. 그리고 처음으로 PM 역할을 맡아 프로젝트를 진행해서 초반에는 부담이 되기도 했지만, 팀원들이 정말 열정적으로 함께 참여해줘서 진심으로 감사했다.
위에는 개인적으로 기억나는 코드지만 정말 드라마틱한 순간이 많았던 것 같다. 처음으로 우리의 데이터를 그래프에 넣었을 때, High-charts 라이브러리 템플릿의 프로퍼티를 하나하나 이해하가며 커스터마이징 했을때, 백엔드 분들이 만든 주가데이터 수치가 의도한대로 맞춰져서 생성됐을 때 등등 함께 해주셔서 정말 감사하다는 말씀을 드리고 싶다.
저번 프로젝트는 본인이 맡은 역할에 충실하고 기여하겠다는 마음이 강했다면 이번에는 프로젝트를 이끌어가야한다는 마음이었다. 그래서 더욱 많은 도움을 느꼈고 함께 프로젝트를 만들어간다는 느낌을 정말 많이 받았다.
몇날 몇일 새벽동안 프로젝트 준비하시느라 정말 고생한 예원, 예찬, 지선, 수정님에게 큰 은혜를 받았다는 말씀을 전하며, 우리팀 WallStreet 평생 기억할 것이고 사랑합니다~💗