본문 바로가기

👨‍💻 프로그래밍/책잇아웃(포트폴리오)6

😵 1달동안 MSA 다시 Mono로 전환한 후기 취준생 시절에 열심히 만들었던 책잇아웃이라는 독서 관련 사이트 있습니다. 처음에는 취업을 위해서 시작했지만 갈수록 제품에 애정이 생겨 취업 후에도 계속 운영하고 있었는데요. (운영이라고 해도 AWS에 서버 띄어 놓는 게 다이지만...) 문제는 프로젝트가 상당히 크고 복잡해서, 유지보수는 커녕 운영도 힘들다는 것이었습니다. 일단 서버 비용이 1달에 거의 20만원 가까이 나왔습니다... 9개의 서버를 동시에 띄워야 하는 MSA 구조 때문이었는데요, 서버 비용뿐만 아니라 여러 이유로 MSA 구조였던 프로젝트를 다시 Monolithic 구조로 전환하기로 하였습니다. 1달 동안 회사를 다니면서 주말에 틈틈이 프로젝트를 진행했는데, 없는 시간 쪼개서 하는 거니 기왕이면 뭔가를 더 하고 싶어 모두 Kotlin으로 재.. 2023. 11. 13.
👜 Apple Wallet Pass, Spring Boot에서 개발하기 기본적인 구조 모르는 분야의 개발을 시작할 때 가장 먼저 해야 할 일은 공식 문서를 보는 것이라고 생각합니다. 그래서 저도 애플의 공식 문서를 참고해 우선 Apple Wallet의 기본적인 구조를 이해해 보려고 했습니다. 우선, .pkpass라는 파일을 아이폰, 맥북, 아이패드 등의 애플 기기에서 열면 Apple Wallet에 Pass가 추가됩니다. .pkpass는 폴더를 압축한 파일이라고 생각하면 되고, 그 폴더의 구조는 아래와 같습니다. 보시면, 핵심적인건 3가지 입니다. 리소스 파일 (icon, thumbnail, logo 등 이미지) 설정 파일 (pass.json) 리소스 파일, 설정 파일의 번역본 (영어, 한국어 등) 즉, Apple Wallet Pass를 개발하는 방법은 위 3가지를 준비하고,.. 2023. 6. 2.
특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 해야 하는 것 현재 위치를 기준으로 특정 거리 내의 위도/경도 범위를 계산 Java의 Method Signature로 따지면 아래와 같습니다. public double[] getLatitudeRange(double latitude, int radiusInMeters) {} public double[] getLongitudeRange(double latitude, double longitude, int radiusInMeters) {} 우선 위도 / 경도에 대해 알아보자 우선, 위도 / 경도는 단순히 지구의 x / y 좌표가 아닙니다. 위도 / 경도는 각도입니다. 지구를 선으로 나누고, 그 선을 기준으로 몇 도 떨어져 있는지를 측정합니다. 위도는 적도에서 몇 도 떨어져 있느냐를 측정합니다. 적도는 지구의 .. 2023. 5. 27.
🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴) Hot Ranking 알고리즘이란? 인기있는 것 (Hot한 것)에 순위(Ranking)을 매기는 알고리즘 실시간 검색어, 커뮤니티의 인기 게시글, 화제가 되고 있는 뉴스 등 무언가에 특정한 기준으로 순위를 매기고 싶을 때 쓰는 알고리즘을 Hot Ranking 알고리즘이라고 부릅니다. 보통은 공개되어 있지 않고, 다양한 데이터를 바탕으로 계속 개선합니다. 책잇아웃(포트폴리오)을 만드는 도중, 커뮤니티 기능을 만들게 됐는데 게시글을 인기순으로 보여 주고 싶어 Hot Ranking 알고리즘을 고안해 봤습니다. 나만의 Hot Ranking 알고리즘 우선, 커뮤니티 부분의 DB 구조만 잠깐 보여 드리자면 아래같이 되어 있습니다. 즉, 게시글을 평가할 때 게시글 자체, 게시글의 좋아요/싫어요, 댓글, 댓글의 좋아요.. 2023. 5. 18.
느린 검색 속도 최적화하기 (공공 API, 웹 크롤링의 병목 현상) 열심히 만들고 있는 책과 관련된 사이트에 책을 검색할 수 있는 기능을 넣었습니다. (booksitout.com에서 사용해 볼 수 있습니다) 평소 책을 많이 읽는 편이라 도서관, 구독 서비스, 중고책 등을 한 번에 검색하면 편리하겠다 해서 넣었고, 좋은 아이디어라 생각했습니다. 하지만 문제가 있었습니다. 느려도 너무 느리다는 것입니다. 아래는 Zipkin을 사용해서 검색 속도를 측정한 것인데, 최고 9초가 걸립니다. 검색 속도를 최적화 하기 위해 제가 헤매고 실수하며 내린 결정들과 그 근거들을 소개해 보겠습니다. Spring Webflux, Kotlin Coroutine으로 Refactoring 가장 먼저 비동기적으로 요청하도록 개선했습니다. 사용자가 거의 없으니 영향이 크지는 않겠지만, 전체를 받아오는데.. 2023. 4. 30.
통계를 처리하기 위한 Table을 만드는 설계는 바람직할까? 통계용 Table을 만든 이유 제가 만들고 있는 사이트 책잇아웃에는 1년간의 독서내역 통계를 보여주는 기능이 있습니다. 통계는 사이트를 들어갈 때 마다 보이는데, 들어갈 때 마다 1년간의 모든 독서 활동을 SELECT 해서 계산해서 보여주면 너무 비효율적이라 생각해 보여주는 통계를 독서활동을 INSERT 할 때 마다 갱신해서 그 통계만 보여주면 좋을거라 생각해 통계용 Table을 만들었습니다. 통계용 Talbe이 재앙이 된 이유 우선, SELECT가 INSERT/UPDATE 보다 많은것 자체는 사실입니다. 하지만 INSERT/UPDATE가 일어 날 때 마다 코드 레벨에서 Transaction으로 통계 Table을 갱신해 줘야 하는건 상당한 부담입니다. 1. 코드가 쓸데없이 복잡해집니다. 통계용 Table.. 2023. 4. 28.