Windows Server 설치 → 서비스 기동 → 브라우저에서 호출까지 단계별 가이드
이 시스템은 “브라우저가 알 수 없는 로컬 파일/폴더의 절대경로”를 얻기 위한 두 개의 프로그램으로 구성됩니다.
| 구성요소 | 설치 위치 | 역할 |
|---|---|---|
| file-api-server (이 문서의 설치 대상) | 사내 Windows Server 1대 | 경로를 잠시 담아두는 릴레이(우편함) API 서버. 포트 20000. |
| FilePathInterface (Electron 데스크톱 앱) | 실제 사용하는 사용자 PC 각각 | 네이티브 파일/폴더 선택창을 띄우고, 고른 절대경로를 서버로 전송. 커스텀 프로토콜 등록용. |
| 웹앱 (브라우저) | 사용자 PC 브라우저 | 앱을 호출하고, 서버를 폴링해 경로를 받아 사용. |
| 항목 | 버전/조건 | 비고 |
|---|---|---|
| JDK | 17 이상 (17 권장) | 빌드·실행에 필요. 설치 후 JAVA_HOME과 PATH 등록. |
| Git | 최신 | 소스 clone 및 build.bat의 자동 git pull에 사용. (수동으로 소스를 복사한다면 없어도 됨) |
| 인바운드 포트 | TCP 20000 | Windows 방화벽에서 열어야 사용자 PC가 접속 가능 (5장). |
| 고정 IP / 호스트명 | 사내에서 접근 가능한 주소 | 브라우저·앱이 이 주소로 호출. 예: 192.168.0.10 |
java -version
:: openjdk version "17..." 등이 나오면 정상
setx JAVA_HOME "C:\Program Files\Java\jdk-17" /M
:: 새 명령창을 열어 반영 확인
echo %JAVA_HOME%
동봉된 배치 스크립트들이 작업 경로를 C:\file-api-server\file-api-server 로 가정합니다. 정확히 이 경로가 되도록 내려받으세요.
:: 1) 상위 폴더 생성 후 그 안에 clone
mkdir C:\file-api-server
cd /d C:\file-api-server
git clone https://github.com/chans97/file-api-server.git
:: 결과 경로: C:\file-api-server\file-api-server (배치 스크립트 기본값과 일치)
build.bat/start.bat 안의 WORKING_DIR이 C:\file-api-server\file-api-server 로 하드코딩되어 있습니다. 다른 경로에 설치하려면 두 배치 파일의 WORKING_DIR도 함께 수정하세요.방법 A(동봉 스크립트) 또는 B(직접 실행) 중 하나를 쓰면 됩니다.
cd /d C:\file-api-server\file-api-server
build.bat
git pull --force 후 gradlew.bat clean build를 수행합니다.cd /d C:\file-api-server\file-api-server
gradlew.bat clean bootJar
C:\file-api-server\file-api-server\build\libs\file-api-server-0.0.1-SNAPSHOT.jar동봉된 start.bat을 실행하면 백그라운드(javaw, 콘솔 창 없음)로 서버가 기동됩니다.
start.bat이 참조하는 JAR 이름은 빌드 산출물(file-api-server-0.0.1-SNAPSHOT.jar)과 일치합니다.
cd /d C:\file-api-server\file-api-server
start.bat
set "WORKING_DIR=C:\file-api-server\file-api-server"
set "JAR_NAME=file-api-server-0.0.1-SNAPSHOT.jar"
cd "%WORKING_DIR%\build\libs"
rem 백그라운드로 기동 (콘솔 없음)
javaw -jar %JAR_NAME%
javaw는 콘솔이 없어 오류가 보이지 않습니다. 처음 설치 검증 시에는 java로 실행해 기동 로그를 확인한 뒤, 정상이면 start.bat(또는 7장의 서비스 등록)으로 운영하세요.cd /d C:\file-api-server\file-api-server\build\libs
java -jar file-api-server-0.0.1-SNAPSHOT.jar
:: "Started FilePathApiServerApplication ... Tomcat started on port(s): 20000" 확인 후
:: Ctrl+C 로 종료
사용자 PC에서 서버로 접속하려면 인바운드 20000을 열어야 합니다. PowerShell(관리자)에서:
New-NetFirewallRule -DisplayName "file-api-server 20000" `
-Direction Inbound -Protocol TCP -LocalPort 20000 -Action Allow
서버에서(로컬) 그리고 다른 PC에서(원격) 헬스체크가 응답하면 성공입니다.
:: 서버 자기 자신에서
curl http://localhost:20000/hcheck
:: 다른 PC 브라우저 주소창 또는 curl 에서 (서버IP로 교체)
:: http://192.168.0.10:20000/hcheck
{"status":"ok","data":{"id":null,"filename":null,"createdAt":null}}start.bat은 로그인 세션에서 실행되어 로그오프/재부팅 시 종료됩니다. 서버 상시 운영에는 아래 중 하나로 등록하세요.
nssm.cc에서 nssm.exe를 받아 서버에 두고, 관리자 명령창에서:
nssm install FileApiServer "C:\Program Files\Java\jdk-17\bin\java.exe" ^
"-jar C:\file-api-server\file-api-server\build\libs\file-api-server-0.0.1-SNAPSHOT.jar"
nssm set FileApiServer AppDirectory "C:\file-api-server\file-api-server\build\libs"
nssm set FileApiServer Start SERVICE_AUTO_START
nssm start FileApiServer
:: 상태 확인 / 중지 / 삭제
sc query FileApiServer
:: nssm stop FileApiServer
:: nssm remove FileApiServer confirm
작업 스케줄러 → 작업 만들기 → 트리거 “컴퓨터 시작 시” → 동작 “프로그램 시작”에 start.bat 지정, “가장 높은 수준의 권한으로 실행” 체크.
서비스(NSSM)로 운영 시: nssm stop FileApiServer / nssm restart FileApiServer.
배치로 운영 시 동봉된 stop.bat은 jps로 프로세스를 찾아 종료합니다(경로에 “file-api-server”가 포함되어 매칭됨). 재시작은 stop.bat 후 start.bat.
stop.bat이 동작하려면 jps가 PATH에 있어야 합니다(JDK의 bin). JRE만 설치했다면 jps가 없을 수 있어 작업관리자에서 javaw.exe를 직접 종료하거나 서비스 방식을 권장합니다.웹앱(브라우저) 쪽 순서는 세 단계입니다: ①앱 호출 → ②서버 폴링 → ③경로 사용. 서버 주소는 커스텀 프로토콜 URL 안에 담겨 앱에 전달되고, 앱은 그 주소로 결과를 POST합니다. (앱 코드에는 IP가 하드코딩되어 있지 않습니다.)
FilePathInterface:{protocol}/{서버IP}/{포트}/{FILE|DIR}/{id}
예) 파일 선택 : FilePathInterface:http/192.168.0.10/20000/FILE/12345
예) 폴더 선택 : FilePathInterface:http/192.168.0.10/20000/DIR/12345
서버IP/포트 = 방금 설치한 file-api-server 주소 (192.168.0.10, 20000).FILE = 파일 선택창, DIR = 폴더 선택창.id = 요청마다 겹치지 않는 정수(상관키). 서버 저장·조회 매칭에 사용.http 뒤는 ://가 아니라 / 입니다 (http/192.168.0.10/20000).버튼을 누르면 앱을 띄우고, 서버를 1초 간격으로 폴링해 경로를 표시합니다.
<button id="pickFile">파일 선택</button>
<button id="pickDir">폴더 선택</button>
<p id="result"></p>
<script>
// ── 사내 서버 주소로 교체 ──
const SERVER_IP = "192.168.0.10";
const SERVER_PORT = "20000";
const SERVER = `http://${SERVER_IP}:${SERVER_PORT}`;
function pick(kind /* "FILE" | "DIR" */) {
const id = Math.floor(Math.random() * 99999); // 상관키
document.getElementById("result").innerText = "파일 선택 중...";
// 1) 데스크톱 앱 호출 (FilePathInterface 앱이 설치되어 있어야 함)
window.location = `FilePathInterface:http/${SERVER_IP}/${SERVER_PORT}/${kind}/${id}`;
// 2) 서버 폴링 (앱이 경로를 POST할 때까지 최대 60초)
poll(id, 60);
}
function poll(id, triesLeft) {
if (triesLeft <= 0) {
document.getElementById("result").innerText = "시간 초과: 다시 시도해주세요.";
return;
}
fetch(`${SERVER}/${id}`)
.then(r => { if (!r.ok) throw new Error("not ready"); return r.json(); })
.then(res => {
// 응답 형식: { status:"ok", data:{ id, filename, createdAt } }
if (res && res.data && res.data.filename) {
document.getElementById("result").innerText = res.data.filename; // ← 절대경로
} else {
setTimeout(() => poll(id, triesLeft - 1), 1000);
}
})
.catch(() => setTimeout(() => poll(id, triesLeft - 1), 1000)); // 아직 없으면 재시도
}
document.getElementById("pickFile").onclick = () => pick("FILE");
document.getElementById("pickDir").onclick = () => pick("DIR");
</script>
FilePathInterface: 프로토콜은 FilePathInterface 앱을 인스톨러로 설치할 때 OS에 등록됩니다. 앱이 없으면 브라우저가 “이 링크를 열 앱을 찾을 수 없음”을 표시합니다.*)하도록 설정되어 있어, 사내 어떤 웹 호스트에서 호출해도 CORS로 막히지 않습니다. (쿠키/인증 미사용)src/main/resources/application.properties의 server.port=20000을 바꾸면 됩니다(변경 후 재빌드/재기동, 방화벽·URL도 함께 수정).| 증상 | 원인 / 조치 |
|---|---|
start.bat을 눌러도 아무 반응 없음, /hcheck 무응답 | 빌드가 안 됐거나 build\libs에 JAR이 없을 수 있음. 빌드(3장) 완료를 확인하고, 최초엔 java -jar 포그라운드로 실제 에러 메시지를 확인. |
| 다른 PC에서 접속 안 됨(서버 로컬은 정상) | 방화벽 20000 미개방(5장) 또는 서버IP 오기입. telnet 서버IP 20000 로 연결 확인. |
| 브라우저가 “링크를 열 앱 없음” | 해당 PC에 FilePathInterface 앱 미설치 → 프로토콜 미등록. 앱 인스톨러 설치 필요. |
'gradlew.bat'은(는) 내부 명령이 아닙니다 | 프로젝트 루트(C:\file-api-server\file-api-server)에서 실행하지 않음. 경로 이동 후 재시도. |
java -version이 17 미만/없음 | JDK 17 설치 및 JAVA_HOME/PATH 재설정(1장). |
| 재부팅하면 서버가 꺼져 있음 | 배치 실행은 세션 종속. NSSM 서비스 등록(7장)으로 전환. |
문의: 설치 중 막히는 지점이 있으면 로그(포그라운드 java -jar 출력)와 함께 공유해 주세요.
연관 저장소 — 서버: github.com/chans97/file-api-server · 데스크톱 앱: github.com/chans97/file-path-interface