전체 글 (7) 썸네일형 리스트형 FCM + 잠금화면 으로 제공하는 정확한 막차 알림! ⏰ 막차 알림! 어떻게 해야 막차를 안 놓치게 할까?!저희 서비스 앗차의 가장 중요한 기능 중 하나는 막차 알림이에요!이 알림을 어떤 방식으로 제공할 수 있을지 고민해 봤어요.FCM 알림만 제공하면 너무 단순한 알림만 제공하는 것 같았기에, 잠금화면을 통해 알림을 제공하기로 했어요! 💻 잠금화면 알림 구현우선, 잠금화면 알림을 어떻게 구현했는지 간단하게 소개해드릴게요. 구성 요소LockService : 백그라운드에서 실행되는 잠금화면 표시 및 알림음 재생LockActivity : Compose를 통한 잠금화면 UI 구현LockReceiver : 화면 켜짐/꺼짐 등 시스템 이벤트를 수신하는 BroadcastReceiverLockServiceManager : Service의 생명주기 관리LockScreen.. 남들이 하니까가 아닌 Compose & MVI, 이유 있는 선택 안녕하세요, 6팀 ‘앗차’에서 UI를 그리기 위해 선택한 기술스택과 아키텍처 패턴에 대해 소개하려고 합니다 !기술 스택을 선정하는데 어떤 고민과 과정들이 있었는지 함께 보시죠 😎 🤔 왜 Compose를 선택했을까?저희는 UI구현 방시기으로 XML이 아닌 Jetpack Compose를 선택했는데요...! 그 이유부터 말씀드리겠습니다~ 안드로이드 팀은 앗차의 본격적인 개발에 들어가기 전, 어떤 기술 스택을 사용하면 좋을지에 선정하는 시간을 가졌습니다.이때 단순히 ‘요즘 트렌드하니까’ 라는 이유보다는 저희에게 진짜 필요한 기술을 선택하고 싶었습니다.그래서 저희 팀의 목표를 다시 한 번 생각해 보았는데요, 저희 팀의 목표는 바로‘실사용자를 받아 서비스 운영을 해보는 것’이었습니다.이때 실사용자를 많이 받고,.. SparseArray를 활용하여 효율적인 디자인시스템을 구축해보자! TMap SDK를 안드로이드에 정착하기까지앗차 서비스에서는 TMap과 공공데이터 API를 활용하여 막차시간과 대중교통 경로를 제공하고 있기 때문에 신뢰도있는 지도 UI를 제공하기 위하여 안드로이드에서도 역시 TMap SDK를 활용하기로 했어요.이에따라 컴포즈 기반으로 구축하고 있던 디자인시스템을 View 기반으로 동작하는 Tmap SDK에도 적용할 수 있도록 확장해야 했어요. 그 예로 다양한 버전의 아이콘을 하나의 vector 표현식으로 렌더링할 수 있도록 Compose 컴포넌트화 시켜둔 아이콘이 존재했는데, Tmap SDK에서는 비트맵 형식의 아이콘 렌더링만 지원하고 있었으므로 사용불가능하다는 문제점이 발생했어요.이를 해결하기 위해 안드로이드 OS에서 지원하는 Canvas와 Paint 매서드를 활용하여.. 분산 서버에서 푸시 알림 중복 전송 문제 해결기 3편 들어가기 앞서이 글은 FCM 푸시 알림이 중복 전송되는 문제를 개선하기 위해 리팩터링해온 과정을 서술했습니다. 레디스 스트림을 활용하여 푸시 알림을 고도화하고자 하는 독자에게 추천드리며, 이 글을 읽고 나면 전체적인 흐름을 파악하고 어떻게 리팩터링 할 수 있을지 방향을 잡는 데 도움이 되었으면 합니다. 푸시 알림의 가용성과 신뢰성을 높이기 위해 구조를 점차 개선해온 과정이므로, 이전 글을 먼저 읽고 오시면 전체 흐름을 이해하는 데 훨씬 수월할 것입니다. 2025.04.12 - [분류 전체보기] - 분산 서버에서 푸시 알림 중복 전송 문제 해결기 1편2025.04.12 - [분류 전체보기] - 분산 서버에서 푸시 알림 중복 전송 문제 해결기 2편 지금 어떤 구조로 되어 있는가?현재 구현되어 있는 알림 .. 분산 서버에서 푸시 알림 중복 전송 문제 해결기 2편 들어가기 앞서이 글은 이전 글에서 이어지는 글로 코드적으로 알림 중복 전송 처리를 고도화하기 위해 고민했던 내용이 담긴 글입니다.이해를 위해 이전 글을 먼저 일고 오시면 흐름을 이해하는데 도움이 될 것입니다. 2025.04.12 - [분류 전체보기] - 분산 서버에서 푸시 알림 중복 전송 문제 해결기 1편 동적 TTL 설정이전에 레디스의 락 만료 시간이 고정되어 있다는 문제점이 있어서 이를 동적 TTL 설정하는 방식으로 해결한다고 했었습니다.실제로 어떻게 구현했는지에 대해서 살펴보겠습니다. 락을 획득한 경우, 작업이 진행되는 동안에는 락의 만료 시간이 계속해서 연장되어야 합니다. 이를 위해선 “작업이 끝났는지”를 확인하는 작업이 필요합니다. 그리고 이 확인하는 작업을 크게 2가지 방식으로 설정할 수 있.. 분산 서버에서 푸시 알림 중복 전송 문제 해결기 1편 들어가기 앞서'앗차!' 프로젝트에서는 멀티 서버 환경에서 매 분마다 배치 작업을 실행해 사용자에게 푸시 알림을 전송합니다. 이때 Redis에 저장된 알림 후보를 확인하고, 조건에 맞으면 FCM 서버로 알림을 보냅니다. 문제는 두 서버가 동시에 같은 배치를 실행하면서, 동일한 알림에 대해 두 번 푸시가 전송되는 상황이 발생했다는 점입니다. 이번 글에서는 이 문제를 어떻게 해결했는지, 그리고 해결 과정에서 고민했던 기술적 선택들을 공유드리려 합니다. 처음 떠올린 해결책: 단일 서버에서만 배치 실행가장 먼저 떠오른 해결책은 한 서버에서만 배치를 실행하는 방식입니다.한 서버에서만 푸시 알림을 전송하면 중복 전송이 발생하지 않을 것이라는, 다소 단순한 접근이었습니다.하지만 곧바로 이 방식이 적절하지 않다고 판단.. 지하철 막차 시간 가져오기(feat. 공공데이터) ‘앗차!’는 목적지까지의 대중교통 경로를 기반으로, 각 교통수단의 막차 시간을 계산해 사용자에게 안내해주는 서비스입니다.그중에서도 특히 까다로웠던 ‘지하철 막차 시간’ 계산 방식에 대해 이야기해보려 합니다. 본격적인 설명에 앞서,앗차가 어떻게 경로를 계산하고, 이때 얻은 경로 데이터 중 어떤 정보가 지하철 막차 시간 계산에 사용되는지 먼저 살펴보겠습니다. 사실 경로 계산 자체는 복잡하지 않습니다.이미 잘 만들어진 외부 API를 활용하면 되니까요.앗차는 여러 API 중에서 TMAP 대중교통 API를 사용하기로 결정했습니다.다른 API에 비해 비용이 저렴하다API 문서화가 잘되어있다.클라이언트측(TMAP SDK)과 동일한 기술스택이 API를 통해 대중교통 경로를 탐색하면,지하철, 버스, 도보 등 다양한 이동.. 이전 1 다음