목록전체 글 (390)
민프
개발후기App Tracking Transparency는 macOS에서 컴파일은 되는데 동작은 하지 않는다.그리고 그 사실은 Xcode 안에 처음부터 적혀 있었다.2026 · Frontend › [IOS]#ATT#AppTrackingTransparency#앱추적투명성#IDFA#macOS#iOS#Flutter#AppsFlyer#앱스플라이어#Amplitude폰용으로 만든 iOS 앱이 어느 날 Mac App Store에서 검색됐다. 이왕 이렇게 된 거 ATT 권한 요청도 Mac에서 되게 하자고 마음먹었다가, 플러그인 · 배포 타겟 · Info.plist를 차례로 헤집은 끝에 Xcode SDK 헤더 주석 한 줄에서 끝났다. 처음부터 불가능한 일이었다.01폰용 앱이 Mac App Store에 있었다우리 앱은 아..
음성 AI 기초 뜯어보기음량이 임계값 아래면 무음이라고 판단하는 코드를 짰다. 조용한 방에서만 잘 됐다.2026 · 인공지능 › [AI | ML]#VAD#Voice Activity Detection#음성활동감지#Silero VAD#WebRTC VAD#무음감지#음성인식#STT#Opus DTX음성 입력 기능을 만들면서 "지금 말하고 있나?"를 판단해야 했다. 라이브러리를 찾기 전에 음량(RMS)이 임계값을 넘으면 말하는 중이라는 코드를 먼저 짰다. 동작은 했다 — 조용한 방에서만. 그러고 나서야 왜 다들 VAD라는 걸 따로 쓰는지 이해했다.01VAD란 무엇인가VAD는 Voice Activity Detection, 우리말로 음성 활동 감지다.오디오 조각을 받아서 "이 안에 사람의 말소리가 있는가"를 판별한..
음성 AI 아키텍처 뜯어보기음성 입력에 "무음 2초면 자동 전송"을 넣었다가 생각하느라 멈출 때마다 말이 잘려나갔다. 큰 앱들은 이 문제를 어떻게 풀었을까.2026 · 인공지능 › [AI | ML]#VAD#엔드포인팅#turn detection#ChatGPT Voice#Gemini Live#Silero VAD#semantic VAD#음성인식#STT음성 입력 기능에 자동 전송을 붙이면서 "무음이 N초 지속되면 끝난 걸로 보고 보낸다"는 로직을 짰다. 조용한 방에선 잘 됐는데, 말을 고르느라 잠깐 멈추면 문장이 두 동강 났다. 큰 앱들은 어떻게 하고 있는지 공식 문서를 뒤졌더니 — 애초에 침묵 길이로 판단하는 시대가 지나 있었다.01증상 — 생각하면 잘린다처음 만든 로직은 단순했다.마이크에서 오는 오디오 ..
DB 실험 일지PostgreSQL Seq Scan이 DB CPU를 100%로 만들자, ALB 헬스체크가 멀쩡한 서버를 처형하기 시작했다.2026 · Backend › [DB]#PostgreSQL#인덱스#SeqScan#ALB헬스체크#ECS#BullMQ개발 중인 AI 채팅 서비스의 테스트 서버가 한낮에 두 번 죽었다. 원인을 파보니 문제는 하나가 아니라 네 개가 쌓인 탑이었다 — 인덱스 없는 테이블, 무한 반복 기능, DB를 기다리는 헬스체크, 그리고 좀비가 된 백그라운드 잡. 그 추적기와 수습기를 정리한다.01증상 — 멀쩡한 서버가 자꾸 처형당했다오후에 갑자기 "서버 죽은 것 같다"는 말이 나왔다.ECS 콘솔을 열어보니 백엔드 태스크가 이미 두 번 교체돼 있었다.중지 사유는 전부 이거였다.stopped..
개발 후기AppsFlyer의 SKAN 경고 배너에서 시작해, Apple 문서의 NSAdvertisingAttributionReportEndpoint와 SKAdNetworkItems가 각각 누구를 위한 키인지 정리한 기록.2026 · Frontend › [IOS]#SKAdNetwork#SKAN#AppsFlyer#iOS#InfoPlistAppsFlyer를 붙이고 SKAN 대시보드를 열었더니 경고 배너가 떠 있었다.해결하려고 문서를 읽다 보니 Info.plist 키가 두 개 등장하는데, 하나는 우리 앱에 없었다.없어도 되는 이유를 이해하고 나니, iOS 광고 측정의 큰 그림이 같이 정리됐다.그리고 다 끝난 줄 알았을 때 넣어야 할 키가 하나 더 나왔고,“로컬에선 확인 못 한다”던 전송을 실기기에서 눈으로 ..
배포 회고모바일 앱과 백엔드를 동시에 갱신하는 건 불가능하다. 그 틈에서 뭘 지켜야 안 터지나.2026 · DevOps › [CI-CD]#VersionSkew#버전스큐#BackwardCompatibility#하위호환#ParallelChange#ExpandContract#DBMigration#마이그레이션#무중단배포#CICD모바일 앱을 출시하려고 백엔드를 먼저 prod에 올렸다. 앱은 앱스토어 심사를 거쳐 며칠 뒤에나 나간다. “서버는 최신인데 앱은 옛날 버전인 그 구간에 에러 나면 어쩌지?”에서 시작해, version skew를 정면으로 마주친 하루의 기록.01배경 — 서버는 오늘 올리는데, 앱은 며칠 뒤모바일 앱 출시를 앞두고 있었다.앱이 쓸 API를 담은 백엔드를 prod에 올려야 했다.문제는 순서..
트러블슈팅 일지AppsFlyer OneLink 딥링크, 설정 다 맞는데 앱이 안 열린다?— iOS Universal Link의 함정, 범인은 Apple CDN 캐시AppsFlyer OneLink로 딥링크(deep link)를 붙였다. entitlement도, AASA도, Team ID·Bundle ID도 다 맞았다.iOS Universal Link 진단은 초록불. 그런데 링크를 누르면 앱이 안 열리고 웹페이지만 떴다.2026 · Frontend › [IOS Error]#iOS#UniversalLinks#유니버설링크#딥링크#Deeplink#AASA#AppsFlyer#앱스플라이어#OneLink#FirebaseDynamicLinks#DynamicLinks종료랜딩에서 들어와 앱을 설치·가입한 유저에게 코인을..
개발 후기플래그 한 줄이 새벽에 앱스토어 심사를 기다리는 시간과 지금 당장 끄는 버튼을 가른다.2026 · 기타 › [개발] #FeatureFlag#FeatureToggle#Flutter#KillSwitch#운영기능을 코드에서 지우지 않고 스위치로 감싼다. 프론트는 빌드 상수로, 백엔드는 런타임 토글로. 별거 아닌 패턴 같지만, 외부 API가 죽거나 기능 하나가 사고를 칠 때 이게 있고 없고는 “재배포 30분 + 심사 하루”와 “토글 5초”의 차이였다.01배경 — 왜 스위치로 감쌌나AI 채팅 앱을 만들다 보면 “아직 완성은 안 됐지만 코드는 이미 들어와 있는” 기능이 계속 쌓인다. 개발자용 진단 도구, 실험 중인 탭, 아직 서버가 안정화 안 된 이미지 기능 같은 것들.이걸 브랜치로 격리하면 머지 지옥..
도입 후기2026 · Frontend › [Flutter] · 약 11분#AppsFlyer#모바일어트리뷰션#MMP#Flutter#ATTiOS 앱에 AppsFlyer(모바일 어트리뷰션 툴)를 붙였다. Firebase·Amplitude와 뭐가 다른지, 왜 셋 다 "이벤트 기록 툴"인데 넣을 이벤트가 갈리는지, 그리고 dev/prod를 분리해 SDK를 연동하고 실기기에서 설치를 확인하기까지의 기록이다.01왜 필요했나유료 광고를 곧 돌릴 계획이었다. 그런데 "어느 광고 채널에서 온 유저가 실제로 결제까지 하는가" 를 측정할 방법이 없었다.앱에는 이미 Firebase Analytics가 있었다. 그래서 처음엔 "Firebase로 되는 거 아냐?" 싶었다. 결론부터 말하면 Firebase만으론 반쪽짜리였고,..
개념 정리EC2는 "이 서버 살아있어"라고 하고, ECS는 "아직 일 못 받아"라고 한다. 같은 서버를 두고 두 시스템이 다르게 말하는 이유.2026 · AWS 개념 · 약 5분#ECS#AutoScaling#EC2인스턴스가 InService인데 태스크가 ECS Agent is not connected로 실패했다. "켜졌으면 됐잖아?" 싶었는데, 알고 보니 InService와 agentConnected는 서로 다른 시스템의 서로 다른 "준비" 신호였다.01ECS Agent가 뭐길래ECS Agent는 EC2 인스턴스 안에서 도는 작은 프로그램이다. 하는 일은 둘.하나, 그 서버를 ECS 관제탑에 "저 여기 있어요, 컨테이너 받을 수 있어요"라고 등록/연결한다.둘, 관제탑이 준 태스크를 받아 그 서버에..