이 페이지에서

세션 관리

세션은 각각 특정 상태를 가진 실행 중인 애플리케이션들의 집합입니다. 세션은 세션 관리자라고 하는 서비스에 의해 제어됩니다. 세션에 참여하는 애플리케이션들을 세션 클라이언트라고 합니다.

세션 관리자는 사용자를 대신하여 클라이언트에 명령을 내립니다. 이러한 명령은 클라이언트가 저장되지 않은 변경 사항을 반영하거나(예: 열려 있는 파일을 저장), 향후 세션을 위해 상태를 보존하거나, 정상적으로 종료하도록 할 수 있습니다. 이러한 작업들의 집합을 세션 관리라고 합니다.

일반적으로 세션은 사용자가 한 번에 데스크톱에서 실행하는 모든 애플리케이션으로 구성됩니다. 그러나 유닉스/리눅스 환경에서는 세션이 서로 다른 컴퓨터에서 실행되는 애플리케이션을 포함할 수 있으며, 여러 디스플레이에 걸쳐 있을 수도 있습니다.

세션 종료

세션은 세션 관리자에 의해 종료되며, 일반적으로 사용자가 로그아웃을 원할 때 사용자를 대신하여 수행됩니다. 또한 시스템은 비상 상황(예: 전원이 곧 끊길 경우)에서 자동 종료 작업을 수행할 수도 있습니다. 분명히 이러한 두 가지 종료 방식 간에는 상당한 차이가 있습니다. 전자의 경우, 사용자는 애플리케이션과 상호작용하여 어떤 파일을 저장하고 어떤 파일을 삭제할지 정확히 지정할 수 있습니다. 후자의 경우, 상호작용을 할 시간이 없습니다. 심지어 컴퓨터 앞에 사용자가 앉아 있지 않을 수도 있습니다!

다양한 플랫폼에서의 프로토콜 및 지원

macOS와 Windows 2000 이전 버전의 Microsoft Windows에서는 아직 애플리케이션을 위한 완전한 세션 관리 기능, 즉 이전 세션을 복원하는 기능이 없습니다. (Windows 2000과 XP는 전체 메모리를 디스크에 저장했다가 컴퓨터를 재시작할 때 복원하는 “최대 절전 모드(hibernation)” 기능을 제공합니다.) 다만, 애플리케이션이 사용자로부터 확인을 받은 후 프로세스를 취소할 수 있는 “정상적인 로그아웃(graceful logout)”은 지원합니다. 이는 ` QGuiApplication::commitDataRequest()` 신호에 해당하는 기능입니다.

X11은 X11R6부터 완전한 세션 관리 기능을 지원해 왔습니다.

Qt에서 세션 관리 작동시키기

먼저, 애플리케이션이 정상 종료 프로세스에 참여할 수 있도록 QGuiApplication::commitDataRequest() 신호에 슬롯을 연결하세요. Microsoft Windows 플랫폼만을 대상으로 하는 경우, 이것이 제공해야 할 전부이자 필수 사항입니다. 이상적으로는 애플리케이션에서 다음과 유사한 종료 대화 상자를 제공해야 합니다:

시스템 종료 시 표시되는 일반적인 대화 상자

이 대화 상자에 대한 예제 코드는 QSessionManager::allowsInteraction() 문서에서 확인할 수 있습니다.

완전한 세션 관리(현재 X11R6에서만 지원됨)를 위해서는 애플리케이션 상태를 저장하고, 필요 시 세션의 다음 수명 주기에서 상태를 복원하는 작업도 처리해야 합니다. 이 저장 작업은 QGuiApplication::saveStateRequest() 신호에 연결된 슬롯을 구현하여 수행됩니다. 이 함수에서 저장하는 모든 상태 데이터는 세션 식별자 QGuiApplication::sessionId()로 표시되어야 합니다. 이 애플리케이션별 식별자는 전역적으로 고유하므로 충돌이 발생하지 않습니다. (특정 Qt 애플리케이션의 상태 저장/복원에 대한 정보는 QSessionManager 를 참조하십시오.)

복원은 일반적으로 애플리케이션의 main() 함수에서 수행됩니다. QGuiApplication::isSessionRestored()가 true 인지 확인하십시오. 해당 조건이 충족되면, 세션 식별자 QGuiApplication::sessionId()를 다시 사용하여 상태 데이터에 접근하고 애플리케이션의 상태를 복원하십시오.

중요: 창 관리자가 중첩 순서나 기하학적 정보와 같은 창 속성을 복원할 수 있도록 하려면, 최상위 위젯을 애플리케이션 전체에서 고유한 객체 이름으로 식별해야 합니다( QObject::setObjectName() 참조). 애플리케이션을 복원할 때는 복원된 모든 최상위 위젯에 이전에 사용했던 것과 동일한 고유 이름이 부여되도록 해야 합니다.

세션 관리 테스트 및 디버깅

macOS 및 Windows에서의 세션 관리 지원은 운영 체제 자체에 해당 기능이 부족하여 상당히 제한적입니다. 세션을 종료한 후 애플리케이션이 예상대로 동작하는지 확인하십시오. 애플리케이션을 시작하기 전에 다른 애플리케이션(일반적으로 통합 개발 환경)을 실행해 두는 것이 유용할 수 있습니다. 이렇게 하면 해당 애플리케이션이 나중에 종료 메시지를 수신하게 되어, 세션 종료를 취소할 수 있게 됩니다. 그렇지 않으면 매 테스트 실행 후 다시 로그인해야 하는데, 이는 그 자체로는 문제가 되지 않지만 시간이 많이 소요됩니다.

Unix에서는 표준 X11R6 세션 관리를 지원하는 데스크톱 환경을 사용하거나, 권장되는 방법인 X Consortium에서 제공하는 세션 관리자 참조 구현을 사용할 수 있습니다. 이 샘플 관리자는 xsm 라고 하며, 표준 X11R6 설치의 일부입니다. 항상 그렇듯이 X11에는 유용하고 유익한 매뉴얼 페이지가 제공됩니다. xsm 의 사용법은 (서툰 아테나(Athena) 기반 사용자 인터페이스를 제외하면) 간단합니다. 다음은 간단한 사용 방법입니다:

  • X11R6를 실행합니다.
  • 홈 디렉토리에 .xsmstartup 이라는 닷 파일을 생성하고, 그 안에 다음 한 줄을 포함시킵니다.
    xterm

    이는 xsm 에게 기본/안전 모드 세션이 xterm뿐이며 그 외에는 아무것도 아니라고 알려줍니다. 그렇지 않으면 xsm 는 윈도우 매니저 twm 를 포함하여 수많은 클라이언트를 호출하려고 시도할 것이며, 이는 별로 도움이 되지 않습니다.

  • 이제 다른 터미널 창에서 xsm 를 실행해 보세요. 세션 관리자 창과 xterm이 모두 나타납니다. 이 xterm은 현재 실행 중인 다른 모든 셸과 구별되는 훌륭한 특성을 가지고 있습니다. 바로 이 셸 내에서 SESSION_MANAGER 환경 변수가 방금 시작한 세션 관리자를 가리킨다는 점입니다.
  • 새로운 xterm 창에서 애플리케이션을 실행해 보세요. 애플리케이션이 자동으로 세션 관리자에 연결될 것입니다. ClientList 푸시 버튼을 통해 연결이 성공했는지 확인할 수 있습니다.

    참고: 세션 관리 클라이언트를 시작하거나 종료할 때는절대로 ClientList를 열어두지 마십시오! 그렇지 않으면 xsm 가 충돌할 가능성이 높습니다.

  • 세션 관리자의 Checkpoint 및 Shutdown 버튼을 서로 다른 설정으로 사용해 보고 애플리케이션이 어떻게 동작하는지 확인해 보세요. 저장 유형 local은 클라이언트가 자신의 상태를 저장해야 함을 의미합니다. 이는 QGuiApplication::saveStateRequest() 신호에 해당합니다. 저장 유형 global은 애플리케이션이 저장되지 않은 변경 사항을 영구적이고 전역적으로 접근 가능한 저장소에 저장하도록 요청합니다. 이는 QGuiApplication::commitDataRequest()을 호출합니다.
  • 무언가 충돌할 때마다 Qt가 아니라 xsm 를 탓하십시오. xsm 는 사용자 데스크톱에서 사용 가능한 세션 관리자로는 한참 부족합니다. 하지만 테스트 환경으로 활용하기에는 충분히 안정적이고 유용합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.