전원 상태에 따라 CPU EPP를 바꾸는 Windows 도구 만들기

매번 전원 설정을 바꾸는 불편

Windows의 CPU Speed Shift EPP는 성능과 전력 절약 중 어느 쪽을 우선할지 정하는 값입니다. 낮은 값은 성능에, 높은 값은 전력 절약에 무게를 두는 성향을 나타냅니다. 다만 실제 반응은 CPU, BIOS, 전원 드라이버와 노트북 제조사 정책에 따라 달라질 수 있습니다.

Windows 기본 도구인 powercfg로 EPP를 조정할 수 있지만, 명령을 직접 입력하려면 현재 전원이 AC인지 배터리인지 확인하고 서로 다른 옵션을 선택해야 합니다. 사용자에게 익숙한 EPP 범위는 0부터 255인 반면, 이 구현에서 powercfg에 전달하는 값은 0부터 100이어서 변환도 필요합니다.

이 도구가 해결하려는 핵심 불편은 이 과정을 하나의 화면으로 모으는 것입니다. 현재 전원과 배터리 상태를 보여주고, AC에서는 EPP 16, 배터리에서는 EPP 64를 추천합니다. 필요하면 미리 준비된 값으로 즉시 변경하거나 전원 연결 상태가 바뀔 때 자동으로 추천값을 적용할 수도 있습니다.

최근 변경사항에서 확인한 개선

프로젝트 범위의 최근 Git 변경은 실행 중인 앱의 기능을 다시 작성한 작업이 아니라 공개 빌드와 배포 기반을 보강한 작업입니다. 현재 작업 트리는 미커밋 변경 없이 정리된 상태였습니다.

  • 기본 브랜치의 변경과 병합 요청에서 Windows Release 빌드를 검사합니다.
  • 버전 태그가 등록되면 64비트 Windows용 self-contained 단일 실행 파일을 만듭니다.
  • 실행 파일과 압축 파일, SHA-256 체크섬을 릴리스 결과물로 구성합니다.
  • 빌드 산출물, 편집기 상태, 로컬 SDK 파일이 Git에 섞이지 않도록 제외 규칙을 추가했습니다.
  • 텍스트 파일은 LF 줄바꿈을 사용하고 이미지·실행 파일·압축 파일은 바이너리로 취급하도록 저장소 규칙을 명시했습니다.

빌드 작업의 저장소 권한은 읽기로 제한하고, 릴리스를 만드는 작업에만 콘텐츠 쓰기 권한을 부여했습니다. 따라서 최근 개선의 직접적인 효과는 EPP 제어 방식의 변화라기보다, 같은 설정으로 반복해서 빌드하고 배포 파일의 무결성을 확인하기 쉬워졌다는 데 있습니다.

화면과 시스템 기능을 나눈 구조

이 프로젝트는 별도의 서버나 네트워크 백엔드가 없는 Windows 데스크톱 앱입니다. 대신 화면을 담당하는 영역과 운영체제 기능을 호출하는 서비스 영역을 구분했습니다.

화면 영역

WPF 화면은 현재 전원 상태, 배터리 잔량, 현재 EPP 값과 추천 모드를 한곳에 표시합니다. 추천 적용과 강제 설정, 자동 적용, 시작 프로그램 등록, 바로가기 생성, 새로고침 버튼도 이 화면에 배치되어 있습니다.

화면의 이벤트 코드는 버튼 동작을 받아 서비스에 작업을 요청하고, 성공이나 실패 결과를 상태 메시지로 보여줍니다. 최소화와 닫기 확인, 시스템 트레이 복원 같은 데스크톱 앱의 수명 주기도 이 영역에서 관리합니다.

시스템 서비스 영역

  • 전원 상태 서비스: Windows의 GetSystemPowerStatus API로 AC 연결 여부와 배터리 잔량을 읽습니다.
  • EPP 서비스: 값을 검증하고 0~255 범위를 0~100으로 변환한 뒤 powercfg를 실행합니다.
  • 추천 서비스: 확인된 전원 공급원에 따라 AC 16 또는 배터리 64를 반환합니다.
  • 시작 프로그램 서비스: 현재 실행 중인 파일을 가리키는 Windows 시작 폴더 바로가기를 등록하거나 제거합니다.
  • 바탕화면 바로가기 서비스: 현재 실행 파일의 위치를 기준으로 바로가기를 생성합니다.

데이터 모델은 전원 상태와 추천 결과만 표현합니다. 화면 표현, 추천 판단, 운영체제 호출이 완전히 한 파일에 섞이지 않도록 역할을 나눈 구조입니다.

EPP 조회와 적용 흐름

  1. Windows API에서 현재 전원이 AC인지 배터리인지 확인합니다.
  2. 현재 활성 전원 구성표에서 AC용 값과 배터리용 값을 조회합니다.
  3. 현재 전원 공급원에 해당하는 값을 선택해 화면용 0~255 범위로 변환합니다.
  4. 추천 적용이나 강제 설정을 누르면 입력 범위가 0~255인지 검사합니다.
  5. 선택값을 0~100 범위로 변환하고 AC 또는 배터리용 설정에 적용합니다.
  6. 현재 전원 구성표를 다시 활성화한 뒤 값을 재조회해 화면을 갱신합니다.

변환의 핵심은 다음처럼 단순합니다.

화면 값 = 0..255
적용 값 = round(화면 값 × 100 / 255)

AC 사용 중  → AC 설정 변경
배터리 사용 → 배터리 설정 변경
마지막 단계 → 현재 전원 구성표 다시 활성화

강제 설정 버튼에는 최고 성능 0, 성능 우선 16, 균형 64, 절전 128, 최대 절전 224가 준비되어 있습니다. 이름은 설정의 방향을 설명하기 위한 것이며, 실제 성능이나 배터리 지속 시간이 일정하게 개선된다고 보장하는 수치는 아닙니다.

현재 구현은 활성 전원 공급원에 해당하는 설정만 변경합니다. AC에서 누른 값은 AC 설정에, 배터리 사용 중 누른 값은 배터리 설정에 적용됩니다.

전원 변경을 감지하는 자동 적용

앱은 5초 간격의 상태 확인과 Windows 전원 상태 변경 알림을 함께 사용합니다. 이전에 관찰한 전원 공급원과 현재 상태가 다르면 변경으로 판단합니다.

자동 적용이 켜져 있을 때는 바로 명령을 실행하지 않고 약 2초를 기다립니다. 전원 케이블이 순간적으로 접촉하거나 짧은 시간 안에 상태가 다시 바뀌는 경우를 고려한 지연입니다. 대기 중 새 변경이 발생하거나 자동 적용을 끄면 기존 예약 작업을 취소합니다.

지연이 끝나면 전원 상태와 현재 EPP를 다시 읽습니다. 추천값과 같으면 아무 작업도 하지 않고, 다를 때만 현재 전원에 맞는 추천값을 적용합니다. 수동 조작과 자동 새로고침이 동시에 실행되지 않도록 세마포어로 작업을 직렬화하며, 이미 다른 작업이 진행 중이면 조용한 주기 갱신은 건너뜁니다.

자동 적용 설정은 현재 실행 중인 앱의 메모리에만 존재합니다. 시작 프로그램 등록 여부와 별개이며, 앱을 다시 실행했을 때 자동 적용이 켜진 상태로 복원하는 저장 로직은 현재 소스에서 확인되지 않았습니다.

사용자가 실제로 사용하는 방법

  1. 64비트 Windows 환경에서 배포된 실행 파일을 관리자 권한으로 실행합니다. 앱 매니페스트가 관리자 권한을 요청하도록 구성되어 있어 Windows 권한 확인 화면이 나타날 수 있습니다.
  2. 첫 화면에서 AC 또는 배터리 상태, 배터리 잔량과 현재 EPP 값을 확인합니다.
  3. 일반적인 사용이라면 추천 적용을 눌러 현재 전원에 맞는 값을 적용합니다.
  4. 원하는 성향이 분명하다면 강제 설정 영역에서 준비된 값을 선택합니다.
  5. 전원 케이블 연결과 분리에 맞춰 자동으로 바꾸고 싶다면 자동 적용 켜기를 누릅니다.
  6. 백그라운드에서 계속 사용하려면 창을 최소화하거나 닫기 확인 창에서 트레이 이동을 선택합니다. 트레이 아이콘을 두 번 누르거나 메뉴의 열기를 선택하면 복원됩니다.
  7. 로그인할 때 앱을 실행하려면 배포용 실행 파일로 실행한 상태에서 시작 프로그램 등록을 누릅니다.

시작 프로그램과 바탕화면 바로가기는 버튼을 누른 시점에 실행 중인 파일의 위치를 저장합니다. 임시 빌드 위치에서 등록한 뒤 파일을 옮기면 바로가기가 이전 위치를 가리킬 수 있으므로, 최종 배포 위치에서 실행한 다음 등록하는 편이 안전합니다.

창의 닫기 버튼은 즉시 종료하지 않습니다. 트레이 이동, 완전 종료, 취소 중 하나를 선택하게 합니다. 반면 트레이 메뉴의 종료는 사용자가 명시적으로 선택한 동작이므로 바로 종료됩니다.

안정성과 보안을 위해 고려한 부분

  • 관리자 권한을 명시적으로 요청: 권한 부족 상태에서 조용히 실패하지 않고 Windows의 표준 권한 확인 절차를 거칩니다.
  • Windows 기본 도구만 사용: EPP 적용을 위해 별도 커널 드라이버나 제조사 전용 API를 추가하지 않았습니다.
  • 입력값 검증: 0보다 작거나 255보다 큰 값은 명령 실행 전에 거부합니다.
  • 셸을 통하지 않는 프로세스 실행: powercfg를 직접 시작하고 창을 표시하지 않으며, 표준 출력과 오류를 분리해 읽습니다.
  • 실패 확인: 외부 명령의 종료 코드를 검사하고 실패하면 메시지를 화면에 표시합니다.
  • 알 수 없는 전원 상태 차단: AC와 배터리를 신뢰할 수 없을 때는 적용 버튼을 비활성화하고 작업을 중단합니다.
  • 중복 작업 방지: 수동 적용, 자동 적용과 갱신이 동시에 설정을 덮어쓰지 않도록 잠금과 취소 처리를 사용합니다.
  • 배포 무결성 확인: 릴리스 과정에서 실행 파일의 SHA-256 체크섬을 함께 생성합니다.

현재 구현에서 알아둘 경계

0~255와 0~100 사이의 변환에는 반올림이 들어갑니다. 두 범위의 단계 수가 다르기 때문에 적용한 값을 다시 읽었을 때 원래 화면 값과 1 정도 차이가 날 수 있습니다. 예를 들어 일부 값은 적용 과정에서 퍼센트로 줄어든 뒤 역변환하면서 인접한 값으로 표시될 수 있습니다.

현재 추천값 비교는 변환 전 화면 값을 기준으로 하므로 이런 양자화 차이를 완전히 흡수하지는 못합니다. 기능 적용 자체와는 별개지만, 불필요한 재적용 판단을 더 줄이려면 향후에는 양쪽 값을 동일한 퍼센트 범위에서 비교하는 방식이 적합합니다.

또한 실제 장치가 EPP 변경에 어떻게 반응하는지는 하드웨어와 펌웨어에 달려 있습니다. 앱이 명령을 성공적으로 실행했다는 사실만으로 특정 수준의 성능 향상, 온도 감소 또는 배터리 시간 증가를 단정할 수는 없습니다.

최종적으로 개선된 점

사용자는 더 이상 전원 공급원을 확인하고 명령 옵션과 값 범위를 직접 계산할 필요 없이 한 화면에서 현재 상태를 확인하고 EPP를 적용할 수 있습니다. 자동 적용을 켜면 전원 케이블 연결 상태가 바뀔 때 추천 정책을 따라갈 수 있고, 트레이 기능과 시작 프로그램 등록을 이용해 일상적인 Windows 사용 흐름에도 자연스럽게 포함할 수 있습니다.

개발과 배포 측면에서는 Windows 환경의 Release 빌드 확인, 버전 태그 기반 단일 파일 배포, 압축본과 체크섬 생성이 자동화됐습니다. 최근 변경은 런타임 기능을 과장해서 확장한 것이 아니라, 이미 구현된 도구를 더 일관된 형태로 검사하고 전달할 수 있도록 배포 기반을 정돈한 개선이라고 정리할 수 있습니다.

#기록 #개발 #이미지 처리 #UI/UX #문서 편집 #보안 #성능 최적화 #자동화

댓글 0

    댓글 남기기