frontend
- 100여 개의 코인의 시세를 실시간 웹소켓으로 받아오는데 보유 및 관심 코인 리스트에서는 백여 개의 코인 시세를 실시간으로 받아올 필요가 없습니다
- 웹소켓을 모듈화 하여 다른 파일에서도 웹소켓의 send 요청을 보낼 수 있도록 했습니다
- 기존에 open 하자마자 send를 보내니까 구독이 돼서 이후 send를 해도 처음 send 한 걸로 계속 시세를 받아옴
- open 하고 send를 바로 하지 않으면 처음 화면이 렌더링 됐을
backend
spring boot 3.2 java 17도입
- 안전한 불변객체를 사용하기 위해서 모든 dto에 record 적용
JWT
- 보안성을 높이기 위해
refresh token을 http only cookie를 사용하여 프론트에서 접근 불가하게 만들어 관리하였고
access token 탈취 위험에 따라 만료시간을 짧게 주고 리프레시 토큰으로 재발급 로직을 구현하였습니다.
재발급 시에는 ietf 공식문서 권장사항에 따라 두 토큰 모두 버스트
정확한 소수점 연산
- 핀테크 프로젝트 특성 상 정확한 소수점 연산을 다뤄야 함. 우리의 경우 정확한 코인 수량과 가격에 대한 정확하고 일관적인 연산 결과가 필요.
- BigDecimal Utility class 를 만들어 전역으로 사용함으로써 일관적인 연산과 정확한 소수점 연산을 할 수 있게 됐다.
랭킹 redis
- 랭킹은 어쩔 수 없이 매번 총 자산과 총 팔로워 금액을 구해야하기 때문에 성능에 대한 고민이 있을 수 밖에 없었습니다.
- 실시간은 쿼리가 많이 발생하여 너무 서버에 부담이 갈 것 같아서 30분마다 스케줄링을 돌려 계산을 하고 계산한 값들은 레디스에 넣도록 했습니다.
- 조회가 많이 일어나기 때문에 redis 사용을 고려했습니다.
- 정렬 기능을 필요로 했기 때문에 레디스의 ZSet을 활용하여 정렬을 하였고 조회할 때마다 레디스에서 캐싱하여 보여주었습니다.
- ZSet 연산은 O(log(n))으로 단순히 java의 timsort, Arrays.sort()의 평균 O(nlog(n))보다 훨씬 효율적입니다.
- zrange의 시간복잡도는 O(log(n) + m(반환받는 멤버들의 개수))로 효율적으로 페이징 처리를 했습니다.