[42CM] 소켓은 언제 연결하고 끊어야 할까? 1편 (feat. App의 생명주기)

휘·2024년 7월 10일

프로젝트-42CM

목록 보기
8/9
post-thumbnail

상태 변화에 따른 소켓 연결 관리의 중요성

iOS 애플리케이션의 상태 변화에 따라 소켓 연결을 적절히 관리하는 것은 여러 가지 이유로 중요하다고 합니다! 주된 이유는 네트워크 자원 관리, 배터리 소비 절감, 그리고 사용자 경험 최적화입니다.

네트워크 자원 관리
소켓 연결은 네트워크 자원을 소모합니다. Active 상태에서는 사용자가 애플리케이션과 상호작용 중이므로, 실시간 데이터를 처리하기 위해 소켓 연결이 필요합니다. 예를 들어, 채팅 애플리케이션은 메시지의 실시간 전송 및 수신이 중요합니다. 그러나 앱이 Inactive 또는 Background 상태로 전환되면 사용자가 더 이상 즉각적인 상호작용을 하지 않기 때문에 소켓 연결을 유지하는 것이 불필요하거나 비효율적입니다. 특히, Background 상태에서는 iOS가 네트워크 활동을 제한할 수 있기 때문에, 지속적인 연결을 유지하려는 시도는 불필요한 리소스 소비로 이어질 수 있습니다.

배터리 소비 절감
소켓 연결을 지속적으로 유지하면, 네트워크를 통한 지속적인 데이터 전송으로 인해 배터리가 빠르게 소모될 수 있습니다. 애플리케이션이 Inactive 또는 Suspended 상태일 때, 소켓 연결을 끊으면 불필요한 네트워크 활동을 방지할 수 있어 배터리 수명을 연장할 수 있습니다. 특히, 모바일 환경에서 배터리 효율성은 중요한 요소입니다.

사용자 경험 최적화
사용자가 애플리케이션을 사용하지 않을 때도 계속해서 소켓 연결을 유지하면 데이터 사용량이 증가할 수 있습니다. 사용자는 예기치 않게 발생하는 데이터 사용료에 불만을 가질 수 있습니다. 애플리케이션이 백그라운드에 있을 때는 필수적인 작업만 수행하고, 나머지 네트워크 활동은 중단하는 것이 바람직합니다.


앱의 생명주기

Not Running
애플리케이션이 실행되지 않은 상태입니다.
예: 사용자가 앱을 시작하지 않았거나, 시스템이 메모리 확보를 위해 앱을 종료했을 때입니다.

Inactive
애플리케이션이 포그라운드에 있지만, 사용자 이벤트를 처리하지 않는 상태입니다.
예: 사용자가 앱을 실행한 직후, 상호작용을 시작하지 않았거나, 전화나 알림이 뜨면서 앱이 잠시 멈춘 경우입니다.

Active
애플리케이션이 포그라운드에서 실행 중이며, 사용자와 상호작용이 가능한 상태입니다.
예: 사용자가 앱을 통해 이메일을 작성하거나, 게임을 플레이하는 상황입니다.

Background
애플리케이션이 백그라운드에서 실행 중인 상태로, 제한된 시간 동안 작업을 완료할 수 있습니다.
예: 사용자가 다른 앱으로 전환했을 때, 음악 스트리밍 앱이 백그라운드에서 음악을 재생하거나, 파일 다운로드가 계속되는 경우입니다.

Suspended
애플리케이션이 백그라운드에 있지만 실행되지 않고, 메모리에만 남아 있는 상태입니다. 시스템은 이 상태에서 애플리케이션을 메모리에서 제거할 수 있습니다.
예: 앱이 백그라운드에 오래 머물러 있거나, 메모리가 부족한 경우 시스템이 앱을 메모리에서 제거할 수 있습니다.


적절한 소켓 연결 시점

Active 상태에서 소켓 연결
사용자가 애플리케이션과 상호작용하는 상태에서는 실시간 데이터 통신이 필요한 경우가 많습니다. 예를 들어, 실시간 채팅 애플리케이션에서는 메시지의 즉각적인 수신 및 전송이 필요합니다. 이때 소켓 연결을 유지하면 사용자가 데이터를 실시간으로 받을 수 있어, 원활한 사용자 경험을 제공합니다.

Inactive 상태에서 소켓 연결 유지 또는 해제
짧은 시간 동안의 Inactive 상태에서는 소켓 연결을 유지하는 것이 효율적일 수 있습니다. 사용자가 잠시 앱을 벗어나거나 푸시 알림을 확인하는 동안에는 소켓 연결을 끊는 것보다 유지하는 것이 더 나은 사용자 경험을 제공할 수 있습니다. 이 경우 다시 연결할 때의 오버헤드와 잠재적인 데이터 손실을 방지할 수 있습니다.

그러나 장기적인 Inactive 상태에서는 실시간 데이터 통신이 불필요해지므로, 소켓 연결을 끊는 것이 적절합니다. 이를 통해 불필요한 네트워크 사용을 줄이고 배터리 소모를 최소화할 수 있습니다.

Background 상태에서 소켓 연결 해제
Background 상태에서는 앱이 백그라운드에서 제한된 작업만 수행할 수 있으며, 시스템은 네트워크 활동을 제한할 수 있습니다. 이 상태에서 소켓 연결을 유지하려 하면 불필요한 데이터 사용이 발생할 수 있으며, 시스템 자원도 낭비될 수 있습니다. 따라서 백그라운드로 전환될 때 소켓 연결을 종료하는 것이 일반적입니다. 다만, 백그라운드에서도 네트워크 연결이 필요한 일부 앱(ex. 음악 스트리밍 앱)에서는 특별히 설정하여 연결을 유지할 수 있습니다.

Suspended 상태에서 소켓 연결 해제
애플리케이션이 백그라운드에서 실행되지 않는 상태로, 모든 활동이 중지됩니다. 이 상태에서는 네트워크 활동이 불가능하므로 소켓 연결을 유지할 필요가 없습니다. 따라서 이 시점에서 소켓 연결을 종료하면 시스템 자원을 절약할 수 있습니다.


소켓 연결 관리의 구현

이러한 생명주기 상태에 맞춰 소켓 연결을 관리하기 위해, iOS에서는 AppDelegate와 SceneDelegate에서 애플리케이션의 상태 변화를 감지하고 적절히 대응할 수 있습니다. 예를 들어, applicationDidBecomeActive에서 소켓을 연결하고, applicationWillResignActive나 applicationDidEnterBackground에서 소켓을 끊는 방식으로 구현합니다.

0개의 댓글