iOS16 채팅 소켓 통신에서 메시지 누락 대응하기 코드엘 iOS 프로젝트를 개발하면서, 채팅 기능은 생각보다 훨씬 “정상 동작하기 어려운 기능”이라는 걸 자주 느꼈어요. 채팅은 겉으로 보면 단순해 보여요.메시지를 보내고, 상대 메시지를 실시간으로 받고, 읽음 상태만 잘 맞으면 될 것 같죠.그런데 실제 서비스에서는 그렇게 단순하지 않았어요. 앱은 계속 포그라운드에만 머물러 있지 않고, 네트워크도 항상 안정적이지 않아요. 사용자는 채팅방을 보다가 잠깐 홈으로 나갔다가 돌아오기도 하고, 앱을 백그라운드에 두었다가 다시 진입하기도 하고, 네트워크 연결이 끊기는 구간을 지나가기도 해요. 문제는 이런 순간들이 모두 채팅의 연속성을 깨뜨릴 수 있다는 점이었어요.소켓 연결이 잠깐 끊기는 동안 들어온 메시지를 놓칠 수 있었어요.연결이 다시 살아나더라도 이전 구독 상태가.. 2026. 4. 20. 채팅 푸시 진입 흐름 안정화하기 코드엘 iOS 프로젝트를 개발하면서, 채팅 푸시 알림을 눌렀을 때의 진입 흐름이 생각보다 쉽게 흔들릴 수 있다는 걸 느꼈어요. 겉으로 보면 단순한 기능처럼 보여요. 푸시를 누르면 해당 채팅방으로 이동하면 되니까요. 그런데 실제 서비스에서는 그렇게 단순하지 않았어요. 앱이 이미 실행 중일 수도 있고, 백그라운드에 있다가 돌아오는 상황일 수도 있고, 완전히 종료된 상태에서 푸시로 시작될 수도 있었거든요. 여기에 사용자가 이미 다른 채팅방을 보고 있거나, 아직 채팅 목록이 준비되지 않은 경우까지 겹치면 같은 채팅 푸시라도 전혀 다른 결과가 나올 수 있었어요. 그래서 이번 글에서는 코드엘 iOS에서 채팅 푸시 진입 흐름을 어떻게 정리했는지, 그리고 왜 이 개선이 필요했는지 정리해보려고 해요.문제의 발견처음에는 .. 2026. 4. 17. 커스텀 이미지 캐시로 성능개선하기 코드엘 iOS 프로젝트를 개발하면서, 홈 화면 첫 진입 경험이 서비스 인상에 꽤 큰 영향을 준다는 걸 많이 느꼈어요. 코드엘의 홈 화면은 앱에 들어오자마자 여러 사용자 프로필이 한 번에 보이는 구조예요. 상단에는 오늘의 코드매칭 카드가 있고, 그 아래에는 코드타임 영역에서 여러 사용자의 프로필 카드가 그리드 형태로 이어져요. 즉, 첫 화면부터 여러 장의 원격 이미지와 사용자 정보를 동시에 받아와 렌더링해야 했어요. 문제는 이 구간에서 체감 성능이 좋지 않았다는 점이었어요.이미지가 한꺼번에 붙으면서 첫 화면이 무겁게 느껴졌어요.스크롤도 완전히 매끄럽다기보다 약간 버벅이는 느낌이 있었어요.placeholder가 길게 보이거나, 이미 본 이미지를 다시 불러오는 것처럼 느껴질 때도 있었어요.그래서 저는 홈 화면.. 2026. 4. 16. 앱 생명주기를 고려한 딥링크 흐름 만들기 두게더 iOS 프로젝트를 개발하면서, 그룹 초대 경험을 더 자연스럽게 만들기 위해 딥링크를 적용했던 경험을 정리해보려고 해요. 기존 그룹 초대 기능은 초대 메시지를 받은 사용자가 앱에 직접 들어가 초대코드를 붙여넣어야 하는 구조였어요. 기능은 동작했지만, 초대 메시지에서 실제 참여 흐름으로 이어지는 경험은 매끄럽지 않았습니다. 그래서 이번 작업에서는 Universal Link 기반 딥링크를 적용해 그룹 초대 흐름을 개선했고, 그 과정에서 앱 생명주기와 화면 전환 구조를 함께 정리하게 됐어요.문제의 발견처음에는 딥링크도 결국 “링크를 누르면 원하는 화면으로 보내면 되는 것 아닌가?”라고 생각하기 쉬워요. 하지만 실제 앱에서는 그렇게 단순하지 않았어요. 딥링크는 앱이 어떤 상태에서 열리느냐에 따라 처리 시점.. 2026. 4. 15. 페이지 단위 조회로 인증목록 응답성 개선하기 두게더 iOS 프로젝트를 개발하면서, 사용자가 화면에 들어왔을 때 로딩이 오래 걸리거나 스크롤이 매끄럽지 않게 느껴지는 경험이 생각보다 UX에 큰 영향을 준다는 걸 자주 느꼈어요. 특히 인증목록처럼 데이터가 계속 쌓이는 화면은 더 그랬어요.처음 진입했을 때 목록이 늦게 뜨거나, 한참 스크롤하다가 화면 흐름이 끊기면 사용자는 단순히 “조금 느리다”가 아니라 “앱이 답답하다”는 인상을 받기 쉬웠거든요. 두게더의 인증목록도 한동안은 그런 부담이 있었어요. 인증 데이터가 많아질수록 처음 화면에 진입할 때 한 번에 처리해야 하는 데이터 양이 커졌고, 그만큼 초기 응답성과 탐색 흐름에도 영향을 주기 시작했어요. 그래서 이번 글에서는 두게더 iOS에서 인증목록 조회 방식을 페이지 단위 조회로 바꾸면서, 왜 이 개선이.. 2026. 4. 13. 친절한 에러 UX 만들기 두게더 iOS 프로젝트를 개발하면서, 사용자가 에러를 마주하는 순간에 어떤 안내를 받는지가 서비스 경험에 꽤 큰 영향을 준다는 걸 느꼈어요. 앱을 사용하다 보면 에러 화면을 마주하는 순간이 종종 있어요. 그런데 불친절한 에러 화면은 왜 문제가 생겼는지 알기 어렵고, 그다음에 내가 무엇을 해야 하는지도 알려주지 않아서 더 답답하게 느껴질 때가 있었어요. 저는 두게더에서는 그런 답답함을 조금이라도 줄이고 싶었어요. 사용자가 느끼기에 지금 어떤 에러가 발생한 건지, 그리고 다음에는 어떤 행동을 하면 되는지를 더 친절하게 안내하는 UX를 만들고 싶었어요. 단순히 실패를 보여주는 데서 끝나는 게 아니라, 실패 이후의 흐름까지 설계하고 싶었어요. 서비스를 만들다 보면 성공 흐름은 비교적 선명해요. 그룹에 참여하고,.. 2026. 4. 12. 안정적인 로딩 UX 만들기 두게더 iOS 프로젝트를 개발하며 “기능이 동작하는 것”만큼이나 “기다리는 동안 어떤 경험을 주는가”가 중요하다는 걸 자주 느꼈어요. 두게더는 투두 인증, 통계 조회, 프로필 조회, 이미지 업로드처럼 네트워크 요청이 생각보다 자주 일어나는 서비스예요. 그런데 한동안은 이 요청들이 화면 위에서 조용히 일어나고 있었어요. 요청이 빠르면 티가 안 났지만, 네트워크가 조금만 느려져도 사용자는 앱이 멈춘 것처럼 느끼기 쉬웠죠. 특히 여러 API가 한 화면에서 동시에 호출되거나, 업로드처럼 요청이 한 번 더 이어지는 흐름에서는 이 문제가 더 크게 드러났어요. 그래서 이번 글에서는 두게더 iOS에서 로딩 경험을 어떻게 개선했는지, 그리고 그 과정에서 어떤 고민을 했는지 정리해보려고 해요.문제의 발견처음에는 “로딩 화.. 2026. 4. 12. 키보드와 함께 버튼을 자연스럽게 올리는 방법 (feat. Combine) ❓ 상황프로젝트 진행 중, 텍스트 필드에 입력할 때 키보드가 올라오면서 하단의 가입 버튼이 키보드에 가려지는 문제가 발생했습니다. 가입 버튼을 키보드 위로 자연스럽게 올리고 싶다는 단순한 목표였지만, iOS의 동작 타이밍과 키보드 노티피케이션의 구조를 이해해야 제대로 해결할 수 있는 문제였습니다. 또한, Minimum Target이 iOS 14였기 때문에 @objc, addObserver 같은 Objective-C 기반 코드는 최대한 줄이고 Swift스럽게 구현하고자 고민이 많았습니다.🤔 처음 고민했던 방법들textFieldDidBeginEditing, textFieldDidEndEditing 델리게이트 메서드를 활용해서 버튼 위치 조정?NotificationCenter의 UIKeyboardWillSh.. 2025. 4. 17. 고차함수 고차함수란 다른 함수를 매개변수로 받거나, 함수 자체를 반환하는 함수Swift에서는 배열이나 컬렉션을 처리할 때 유용하게 사용됨 map배열의 각 요소에 주어진 변환 함수를 적용하여 새로운 배열을 반환filter배열의 각 요소 중 주어진 조건을 만족하는 요소들만 포함하는 새로운 배열을 반환reduce배열의 모든 요소를 주어진 클로저를 사용하여 하나의 값으로 합침forEach배열의 각 요소에 대해 특정 작업을 수행.새로운 배열을 반환하지 않고, 각 요소에 대해 작업만 수행flatMap배열의 각 요소에 대해 주어진 변환 함수를 적용하고, 중첩된 배열을 평평하게 펼쳐 하나의 배열로 반환compactMap배열의 각 요소에 대해 주어진 변환 함수를 적용하고, nil 값을 제거한 후 새로운 배열을 반환 2024. 8. 10. UICollectionViewCompositionalLayout UICollectionViewCompositionalLayout은 iOS 13에서 도입된 강력하고 유연한 레이아웃 시스템으로, 복잡하고 다양한 레이아웃을 손쉽게 구성할 수 있도록 설계되었습니다. 🔴 레이아웃 (Layout)UICollectionViewCompositionalLayout을 사용하여 복잡한 레이아웃을 손쉽게 구현할 수 있음UICollectionViewCompositionalLayout: 여러 섹션이 서로 다른 레이아웃을 가질 수 있는 컬렉션뷰 레이아웃을 구성하는 객체 NSCollectionLayoutSection 객체를 사용하여 섹션 단위로 레이아웃을 정의NSCollectionLayoutSection: 컬렉션뷰의 각 섹션에 대한 레이아웃을 정의 섹션 내의 그룹 및 아이템의 크기, 간.. 2024. 8. 7. 이전 1 2 다음