Programming(185)
-
[Flutter] Isolate를 활용한 HTTP 클라이언트 리팩토링과 iOS에서 Isolate 초기화 문제
Flutter에서 Isolate를 활용한 HTTP 클라이언트 리팩토링 Flutter 앱에서 네트워크 요청은 매우 빈번하게 사용되지만, Flutter 자체는 싱글 스레드로 동작하다보니 메인 UI 스레드에서 무거운 네트워크 작업을 처리하면 앱이 버벅거리거나 응답성이 떨어집니다. 특히 지금 진행하고 있는 프로젝트는 P2P를 통해 IoT 장비와 직접 통신을 하면서, 동시에 클라우드 서버와도 통신을 하는 구조였기 때문에 리렌더링이 반복되면 네트워크 처리 속도가 떨어지는 문제가 있었죠. 이 문제를 해결하기 위해 HTTP 통신을 Isolate에서 처리하도록 HTTP 클라이언트를 구현해서 네트워크 속도에 대한 문제를 개선했는데, iOS에서 앱을 구동할 시 문제가 발생했습니다. 메인 Isolate와 HTTP 클라이..
2025.04.11 -
TypeScript에서 문자열 리터럴 유니온 타입 가독성 높이기
GitHub - zerodice0/youtube_thumbnail_generatorContribute to zerodice0/youtube_thumbnail_generator development by creating an account on GitHub.github.com 문자열 리터럴 유니온 타입이란? TypeScript에서 문자열 리터럴 유니온 타입(String Literal Union Type)은 변수가 특정 문자열 값들 중 하나만 가질 수 있도록 제한하는 타입 시스템 기능이다. 다른 언어의 enum값이랑 비슷한데, Typescript가 제공하는 enum값에는 알려진 문제점들이 여럿 있다고 들어서 되도록이면 enum값 대신 문자열 리터럴 유니온 타입을 사용하고 있었다. 기존에는 queued,..
2025.04.09 -
Sign in with Apple: iOS에서는 실패하는데 Android/Web에서는 성공하는 경우?
Flutter로 앱을 개발하다 보면 소셜 로그인 기능은 거의 필수적으로 구현하게 됩니다. 그중에서도 'Sign in with Apple'은 iOS 사용자들에게 편리한 경험을 제공하는 중요한 기능이죠. 그런데 이상하게도 Android나 Web 환경에서는 잘 동작하던 Apple Sign In이 유독 iOS 네이티브 앱에서만 실패하는 경우가 있습니다. Bundle ID가 변경되지 않았다면, 백엔드의 Apple ID 토큰 검증 로직에 있을 가능성이 높습니다! 특히, JWT(JSON Web Token)의 aud (Audience) 클레임 검증 방식이 문제의 핵심일 수 있습니다. 이 글에서는 Flutter 앱에서 Apple Sign In이 실패하는 흔한 원인 중 하나인 aud 클레임 불일치 문제와 그 해결 방법을..
2025.04.09 -
[MacOS] Cursor 0.47 업데이트 이후 채팅창이 안 열리는 경우
CMD+I... CMD+L이었나...? 왜 안 열려? 평소대로 Cursor를 실행시키고 채팅창을 열려는 찰나, 뭐가 문제인지 채팅창이 열리지 않는다. 어쩔 수 없이 0.46버전으로 다운그레이드하고나니 잘 되기는 하는데, 다음날 아침 다시 Cursor를 실행하니 자동으로 업데이트되는 바람에 또 다시 채팅창이 열리지 않는다. 이럴 줄 알고 0.46버전 설치파일을 지우지 않았지... 만, 매일 아침 0.46으로 설치하자니 그것도 좀 그렇다. 그렇다고 자동 업데이트를 꺼놓자니, 옵션이 어딨는지도 모르겠고 업데이트하지 못한다는 것도 좀 그렇고.나만 겪는 문제는 아니었나봄https://forum.cursor.com/t/bug-on-cursor-0-47-x-chat-tab-not-opening/65412/7 Bug..
2025.03.20 -
[Flutter] 때때로 생성자에서 비동기 요청을 하게되면, 비동기 요청이 실행되기 전에 dispose()가 호출될 수도 있다.
문제상황 ListView에 표시되는 ListViewItem은 필요한 데이터를 요청하기 위해 2~3개의 API를 순차적으로 조회해야했다. 문제는 사용자가 리스트를 스크롤할 경우, 요청하는 API의 수가 기하급수적으로 늘어난다는 것. 이러한 문제를 막기 위해서 스케쥴러를 구현하고, VisibilityDetector를 사용해 ListViewItem이 더 이상 화면에서 사라지면 API 요청을 취소하도록 작성했다. ListViewItem이 dispose를 호출할 때 역시 API 요청을 취소하도록 작성했다. 실제로 스크롤을 내리다보면 ListViewItem은 생성자를 호출하는 시점에 API 요청을 스케쥴링을 하고, ListViewItem이 더 이상 렌더링되지 않는 시점에는 스케쥴링한 API 요청을 취소하고 ..
2025.03.18 -
[Python] AIOAPNS를 사용한 APNs 푸시 메시지 전송
왜 FCM을 사용하지 않고 APNs를 사용하게 됐는가? AIOAPNS 패키지를 사용해서 APNs로 푸시 메시지를 발송 기능을 구현해야 할 일이 생겼다. 일반적인 경우 푸시 메시지를 발송할 일이 있다면 FCM을 사용해서 iOS/안드로이드 양쪽으로 푸시 메시지를 발송하게 되는데, 이번에는 FCM 토큰 유효기간으로 인한 의구심이 들었다. 파이어베이스 문서에 명시되어있는 비활성 토큰은 다음과 같다. 270일간 활동이 없으면 만료된 토큰으로 간주한다는 얘기인데, 이 '활동'이 푸시 메시지를 수신한 것을 의미하는지, 아니면 푸시 메시지를 수신한 이후 사용자가 아무런 반응을 보이지 않은 것인지 분명하지 않다. 비활성 등록 토큰은 FCM에 1개월 넘게 연결되지 않은 비활성 기기와 연결된 토큰입니다. 시간이 지날수록 ..
2025.02.24