2026. 6. 17. 20:19ㆍAI Product Building/SwiftBeam
수많은 기기 속에서
나를 찾는 법
기기 고유 ID와 닉네임 시스템 설계
지난 편에서 mDNS 기술을 이용해 주변 기기를 찾아내는 '로컬 탐색'의 마법을 살펴보았습니다. 그런데 탐색만으로는 부족합니다. 만약 카페에서 SwiftBeam을 켰는데 주변에 'iPhone'이라는 이름의 기기가 3대나 검색된다면 어떨까요? 누구에게 파일을 보내야 할지 막막할 것입니다. 이번 편에서는 수많은 기기 사이에서 혼동을 막아주는 '기기 고유 식별(Unique Identification)'과 '닉네임 시스템' 구축기를 공유합니다.
1. "이름"은 변하지만 "존재"는 변하지 않는다
사용자가 설정하는 닉네임이나 기기 이름은 언제든 바뀔 수 있습니다. 만약 앱이 기기의 이름(예: '민수의 폰')만으로 상대를 식별한다면, 이름을 바꾸는 순간 이전의 전송 기록이나 차단 내역 등을 연동하기 어려워집니다.
따라서 시스템 내부적으로는 변하지 않는 '고유 식별자(UUID)'가 필요했습니다. 하지만 개인정보 보호가 강화된 최신 OS(iOS 14+, Android 10+)에서는 기기의 물리적 주소인 MAC Address나 하드웨어 일련번호(Serial Number)를 가져오는 것을 엄격히 제한합니다.
SwiftBeam은 이 문제를 해결하기 위해 device_info_plus 패키지를 활용했습니다. 앱 설치 시점에 생성되는 고유한 식별 토큰이나, 각 플랫폼이 허용하는 범위 내의 하드웨어 특성(모델명, 제조사, OS 버전 등)을 조합하여 해당 기기만의 '디지털 지문'을 생성하고 이를 안전하게 보관하도록 설계했습니다.
2. 닉네임: 사용자 친화적인 첫인상
내부적으로는 복잡한 ID(예: 8f2a-b4c1-...)를 쓰더라도, 사용자 화면에는 친숙한 이름이 나와야 합니다. SwiftBeam의 닉네임 전략은 '초기 자동화'와 '자유로운 커스터마이징'에 집중했습니다.
- 기본 이름 생성: 처음 앱을 켜면 '제조사 + 모델명'을 기반으로 기본 닉네임을 생성합니다. (예: Samsung S24, MacBook Air)
- 랜덤 접미사: 이름 중복을 시각적으로 구분하기 위해 4자리의 랜덤 숫자를 붙여줍니다. (예: iPhone 15 #1294)
- 언제든 수정 가능: 설정 화면에서 사용자가 원하는 이름으로 즉시 변경할 수 있으며, 변경된 이름은 네트워크 탐색 시 실시간으로 주변 기기에 업데이트됩니다.
3. 기억의 저장소: shared_preferences 활용
한 번 설정한 닉네임과 기기 ID는 앱을 껐다 켜도 유지되어야 합니다. 서버가 없는 SwiftBeam에서는 이 정보를 기기 내부 저장소에 안전하게 기록해야 했습니다. Flutter의 shared_preferences나 flutter_secure_storage를 활용하여 경량화된 데이터를 관리했습니다.
단순히 이름만 저장하는 것이 아닙니다. 사용자가 마지막으로 사용한 네트워크 환경 정보나, 선호하는 테마 설정 등도 함께 관리하여 '나만의 앱'이라는 느낌을 주도록 노력했습니다. 특히 보안이 중요한 식별자의 경우, 암호화된 저장소를 사용하여 외부 앱이나 루팅된 환경에서도 정보가 쉽게 유출되지 않도록 방어막을 쳤습니다.
4. 이름표 충돌을 방지하는 정교한 설계
네트워크 상에 동일한 이름의 기기가 동시에 존재할 때 발생할 수 있는 혼란을 막기 위해, SwiftBeam은 '세션 기반 검증'을 도입했습니다. 탐색 패킷(Discovery Packet)에 고유 ID와 닉네임을 함께 실어 보내고, 수신 측에서는 이를 대조하여 이미 등록된 기기인지 아니면 새로운 기기인지를 판단합니다.
만약 같은 ID를 가진 기기가 다른 IP 주소로 발견된다면, 이는 기기가 이동했거나 네트워크가 변경된 것으로 간주하고 기존 연결 정보를 갱신합니다. 이런 '보이지 않는 로직'들이 쌓여 사용자는 끊김 없이 자연스러운 연결을 경험하게 됩니다.
5. 이름표가 완성되면 비로소 '대화'가 시작된다
서로의 존재를 확인하고 명확한 이름표를 확인했다면, 이제 드디어 데이터를 주고받을 준비가 끝난 것입니다. 하지만 무작정 데이터를 쏘아 보낼 수는 없죠. 상대방이 전송을 받을 준비가 되었는지 확인하고, 안전한 통로를 개설하는 과정이 필요합니다.
다음 편에서는 두 기기가 본격적으로 손을 잡는 과정, '안정적인 데이터 교환을 위한 핸드셰이크(Handshake) 로직'에 대해 자세히 다루어 보겠습니다.
다음 편 예고: [SwiftBeam #06] "처음 뵙겠습니다" - 안정적인 데이터 교환을 위한 핸드셰이크(Handshake) 로직
SwiftBeam 프로젝트처럼 실생활의 가치를 더하는 앱들을
만나보세요.
저희 Team M2Y가 정성껏 만든 다른 제품들도 여러분의 일상을 더욱 편리하게 만들어줄 것입니다.
'AI Product Building > SwiftBeam' 카테고리의 다른 글
| [SwiftBeam #08] "내 파일이 밖으로 새지 않게" - 로컬 네트워크 암호화 전송의 기초 (0) | 2026.06.20 |
|---|---|
| [SwiftBeam #07] "복잡한 IP 주소는 잊으세요" - 사용자 몰래 일어나는 포트 매칭과 연결 자동화 (0) | 2026.06.19 |
| [SwiftBeam #04] "너 어디 있니?" - 중앙 서버 없이 주변 기기를 찾아내는 로컬 탐색의 원리 (0) | 2026.06.16 |
| [SwiftBeam #03] "기획은 심플하게, 기능은 확실하게" - 복잡한 설정을 걷어낸 미니멀리즘 설계 (0) | 2026.06.15 |
| [SwiftBeam #02] "혼자서 4개 OS를 어떻게 다 만드나요?" - 효율적인 배포를 위해 Flutter를 선택한 이유 (0) | 2026.06.14 |