세션 관리
세션은 실행 중인 애플리케이션의 그룹으로, 각 애플리케이션은 특정 상태를 갖습니다. 세션은 세션 관리자라는 서비스에 의해 제어됩니다. 세션에 참여하는 애플리케이션을 세션 클라이언트라고 합니다.
세션 관리자는 사용자를 대신하여 클라이언트에 명령을 내립니다. 이러한 명령을 통해 클라이언트는 저장되지 않은 변경 내용을 커밋하거나(예: 열린 파일 저장), 향후 세션을 위해 상태를 보존하거나, 세션을 정상적으로 종료할 수 있습니다. 이러한 일련의 작업을 세션 관리라고 합니다.
일반적인 경우 세션은 사용자가 데스크톱에서 한 번에 실행하는 모든 애플리케이션으로 구성됩니다. 그러나 Unix/X11에서는 세션에 여러 컴퓨터에서 실행 중인 애플리케이션이 포함될 수 있으며 여러 디스플레이에 걸쳐 있을 수 있습니다.
세션 종료하기
세션은 일반적으로 사용자가 로그아웃하려는 경우 세션 관리자가 사용자를 대신하여 종료합니다. 전원이 곧 끊길 것 같은 비상 상황에서는 시스템이 자동 종료를 수행할 수도 있습니다. 이러한 종료 유형에는 분명히 상당한 차이가 있습니다. 전자의 경우 사용자가 애플리케이션과 상호 작용하여 어떤 파일을 저장하고 어떤 파일을 삭제할지 정확히 지정할 수 있습니다. 후자의 경우에는 상호 작용할 시간이 없습니다. 심지어 사용자가 기계 앞에 앉아 있지 않을 수도 있습니다!
다양한 플랫폼에서의 프로토콜 및 지원
macOS와 Windows 2000 이전의 Microsoft Windows 버전에서는 아직 애플리케이션에 대한 완전한 세션 관리, 즉 이전 세션을 복원할 수 있는 기능이 없습니다. (Windows 2000 및 XP는 전체 메모리를 디스크에 저장했다가 컴퓨터를 다시 시작할 때 복원하는 '최대 절전 모드'를 제공합니다.) 하지만 애플리케이션이 사용자의 확인을 받은 후 프로세스를 취소할 수 있는 자동 로그아웃을 지원합니다. 이는 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 컨소시엄에서 제공하는 세션 관리자 참조 구현을 사용할 수 있습니다. 이 샘플 관리자는 xsm
이라고 하며 표준 X11R6 설치의 일부입니다. X11과 항상 그렇듯이 유용하고 유익한 매뉴얼 페이지가 제공됩니다. xsm
사용법은 간단합니다(서투른 Athena 기반 사용자 인터페이스를 제외하면). 다음은 간단한 방법입니다:
- X11R6을 실행합니다.
- 홈 디렉터리에 다음 한 줄이 포함된 도트 파일
.xsmstartup
을 만듭니다.xterm
이렇게 하면
xsm
에 기본/안전장치 세션이 임시 세션일 뿐 다른 세션이 아님을 알립니다. 그렇지 않으면xsm
이 창 관리자twm
를 포함한 많은 클라이언트를 호출하려고 시도하므로 별로 도움이 되지 않습니다. - 이제 다른 터미널 창에서
xsm
을 실행하세요. 세션 관리자 창과 xterm이 모두 나타납니다. xterm에는 현재 실행 중인 다른 모든 셸과 차별화되는 멋진 속성이 있습니다. 셸 내에서SESSION_MANAGER
환경 변수는 방금 시작한 세션 관리자를 가리킵니다. - 새 학기 창에서 애플리케이션을 실행합니다. 자동으로 세션 관리자에 연결됩니다. 연결이 성공했는지 ClientList 푸시 버튼으로 확인할 수 있습니다.
참고: 세션 관리 클라이언트를 시작하거나 종료할 때 ClientList를 열어 두지 마세요! 그렇지 않으면
xsm
이 충돌할 수 있습니다. - 세션 관리자의 체크포인트 및 종료 버튼을 다른 설정으로 사용하여 애플리케이션이 어떻게 작동하는지 확인하세요. 저장 유형 로컬은 클라이언트가 자신의 상태를 저장해야 함을 의미합니다. QGuiApplication::saveStateRequest () 신호에 해당합니다. 글로벌 저장 유형은 애플리케이션이 저장되지 않은 변경 사항을 전역적으로 액세스할 수 있는 영구 저장소에 저장하도록 요청합니다. QGuiApplication::commitDataRequest ()를 호출합니다.
- 충돌이 발생하면 Qt가 아닌
xsm
를 탓하세요.xsm
은 사용자 데스크톱에서 사용할 수 있는 세션 관리자와는 거리가 멉니다. 하지만 테스트 환경으로 사용하기에는 충분히 안정적이고 유용합니다.
© 2025 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.