Codex로 만든 로컬 서버 펫 버튼
블로그 로컬 서버가 꺼져 있을 때 화면 위의 작은 버튼으로 다시 실행할 수 있는 server-pet.bat을 만들고, Windows 시작프로그램에 등록한 과정을 정리했습니다.
매번 로컬 서버를 다시 켜는 작은 불편
블로그 글을 작성할 때는 로컬 서버를 켜고 http://localhost:4173/에서 결과를 확인한다. 서버가 계속 살아 있으면 편하지만, 컴퓨터를 다시 켜거나 터미널이 종료되면 다시 명령을 입력해야 한다.
.\blog.bat dev
큰 일은 아니지만 글을 자주 고치다 보면 이 작은 반복도 은근히 거슬린다. 특히 블로그를 열어보려는데 서버가 꺼져 있어서 404나 연결 실패가 나오면 흐름이 한 번 끊긴다.
처음에는 그때마다 Codex에게 "로컬 서버가 꺼져 있으면 켜줘"라고 부탁했다. Codex가 확인하고 다시 실행해주기는 했지만, 이 말을 반복하는 것 자체가 점점 귀찮아졌다. 생각해보면 매번 같은 확인과 같은 실행을 부탁하고 있었기 때문에, 굳이 채팅을 거칠 필요가 없는 작업이었다.
이 반복을 작은 버튼 하나로 줄이기로 했다. 내가 Codex에게 말하지 않아도, 화면 위에 떠 있는 버튼을 누르면 서버 상태를 확인하고 필요하면 다시 켜주는 방식이다.
Codex에게 화면 맨앞에 떠 있는 작은 버튼을 만들 수 있는지 물어봤고, 버튼을 누르면 로컬 서버가 켜져 있는지 확인한 뒤 꺼져 있으면 다시 실행하는 프로그램을 만들었다.
server-pet.bat 만들기
결과물은 두 파일로 나누었다.
server-pet.batscripts/server-pet.ps1
server-pet.bat은 실행 진입점이다. PowerShell 스크립트를 숨김 창으로 실행한다.
@echo off
setlocal
set "PROJECT_DIR=%~dp0"
set "SCRIPT=%PROJECT_DIR%scripts\server-pet.ps1"
start "" powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%SCRIPT%"
실제 UI와 서버 확인 로직은 scripts/server-pet.ps1에 들어 있다. Windows Forms를 사용해 작은 창을 만들고, TopMost를 켜서 다른 창 위에 떠 있게 했다.
$form = New-Object System.Windows.Forms.Form
$form.Text = "MyBlog Server Pet"
$form.TopMost = $true
$form.StartPosition = "Manual"
$form.FormBorderStyle = "FixedToolWindow"
$form.ShowInTaskbar = $true
창은 화면 오른쪽 아래에 놓이도록 했다.
$screen = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea
$form.Left = $screen.Right - $form.Width - 24
$form.Top = $screen.Bottom - $form.Height - 24
이름은 거창하지만 실제로는 블로그 옆에 붙어 있는 작은 실행 버튼에 가깝다. 그래도 항상 화면 위에 떠 있으니, 약간은 내 블로그 서버를 지켜보는 작은 펫 같은 느낌이 난다.

실제로 실행하면 이런 작은 창이 화면 위에 떠 있다. 서버가 살아 있으면 Running at localhost:4173 상태가 보이고, 버튼은 Open / Check Server로 바뀐다. 블로그를 확인하고 싶을 때 이 버튼만 누르면 로컬 서버 상태를 확인한 뒤 브라우저를 열 수 있다.
버튼을 누르면 하는 일
버튼을 누르면 먼저 로컬 서버가 살아 있는지 확인한다.
function Test-LocalServer {
try {
$response = Invoke-WebRequest -UseBasicParsing -Uri $serverUrl -TimeoutSec 2
return $response.StatusCode -eq 200
} catch {
return $false
}
}
확인 대상은 블로그 개발 서버 주소다.
$serverUrl = "http://localhost:4173/"
서버가 이미 켜져 있으면 브라우저로 해당 주소를 연다. 꺼져 있으면 blog.bat dev를 실행한다.
Start-Process `
-FilePath "powershell.exe" `
-ArgumentList @(
"-NoProfile",
"-ExecutionPolicy", "Bypass",
"-Command",
"Set-Location -LiteralPath '$projectRoot'; & '$blogBat' dev"
) `
-WindowStyle Hidden `
-WorkingDirectory $projectRoot
서버를 실행한 뒤에는 바로 끝내지 않고 최대 15초 동안 localhost:4173이 응답하는지 기다린다. 응답이 확인되면 브라우저를 열고, 실패하면 메시지 박스를 띄운다.
$deadline = (Get-Date).AddSeconds(15)
while ((Get-Date) -lt $deadline) {
Start-Sleep -Milliseconds 500
if (Test-LocalServer) {
return $true
}
}
덕분에 버튼을 누른 뒤 서버가 켜지기도 전에 브라우저가 먼저 열려서 실패 페이지를 보는 일이 줄어든다.
상태 표시도 함께 넣기
버튼 아래에는 현재 상태를 표시하는 작은 텍스트도 넣었다.
function Update-Status {
if (Test-LocalServer) {
$status.Text = "Running at localhost:4173"
$button.Text = "Open / Check Server"
return
}
$status.Text = "Server is stopped"
$button.Text = "Start Local Blog"
}
5초마다 상태를 다시 확인하도록 타이머도 붙였다.
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 5000
$timer.Add_Tick({ Update-Status })
$timer.Start()
서버가 살아 있으면 버튼 문구가 Open / Check Server로 바뀌고, 꺼져 있으면 Start Local Blog로 표시된다. 단순하지만 지금 필요한 정보는 충분히 보여준다.
시작프로그램에 등록하기
이 프로그램은 컴퓨터를 켤 때 같이 실행되도록 Windows 시작프로그램에 등록했다.
등록 방법은 간단하다.
1. Win + R을 누른다. 2. shell:startup을 입력한다. 3. 열린 시작프로그램 폴더에 C:\MyBlog\server-pet.bat의 바로가기를 넣는다.
중요한 점은 server-pet.bat 원본 파일을 옮기는 것이 아니라 바로가기를 넣는 것이다. 원본 파일은 C:\MyBlog에 그대로 있어야 scripts/server-pet.ps1 경로를 정상적으로 찾을 수 있다.
이렇게 해두면 Windows에 로그인할 때 server-pet.bat이 자동 실행된다. 컴퓨터가 켜지면 화면 위에 작은 버튼도 같이 나타나고, 블로그 로컬 서버가 필요할 때 버튼 한 번으로 다시 켤 수 있다.
배운 점
이번 작업은 거창한 프로그램을 만든 것은 아니지만, Codex와 함께 개인 작업 흐름을 조금 더 편하게 바꾼 사례였다.
블로그 서버 자체는 이미 blog.bat dev로 실행할 수 있었다. 여기에 작은 UI와 상태 확인, 시작프로그램 등록만 더했을 뿐인데 체감은 꽤 달라졌다. 터미널을 찾고 명령을 입력하는 대신, 화면 위에 떠 있는 버튼을 누르면 된다.
또 좋았던 점은 기존 자동화와 잘 이어진다는 것이다. 블로그 배포 스크립트는 배포 중 로컬 서버를 잠시 끄고 끝나면 다시 켜도록 만들어 두었다. server-pet은 평소에 서버가 꺼졌을 때 수동으로 되살리는 역할을 맡는다.
작은 도구라도 반복되는 불편을 줄이면 작업 리듬이 부드러워진다. 이번 server-pet.bat은 그런 의미에서 내 블로그 작업 환경에 붙인 작은 스위치다.