file-api-server 사내 설치 · 브라우저 연동 안내

Windows Server 설치 → 서비스 기동 → 브라우저에서 호출까지 단계별 가이드

대상: 허성진 수석님 · 설치 서버: Windows Server · 서비스 포트: 20000 · 저장소: github.com/chans97/file-api-server

0. 구성 개요 — 무엇을 어디에 설치하나

이 시스템은 “브라우저가 알 수 없는 로컬 파일/폴더의 절대경로”를 얻기 위한 두 개의 프로그램으로 구성됩니다.

구성요소설치 위치역할
file-api-server
(이 문서의 설치 대상)
사내 Windows Server 1대경로를 잠시 담아두는 릴레이(우편함) API 서버. 포트 20000.
FilePathInterface
(Electron 데스크톱 앱)
실제 사용하는 사용자 PC 각각네이티브 파일/폴더 선택창을 띄우고, 고른 절대경로를 서버로 전송. 커스텀 프로토콜 등록용.
웹앱 (브라우저)사용자 PC 브라우저앱을 호출하고, 서버를 폴링해 경로를 받아 사용.
전체 흐름
[웹앱/브라우저] [FilePathInterface (사용자 PC)] [file-api-server (Windows Server) :20000] │ 1. id 생성 │ 2. 커스텀 프로토콜 URL 호출 ──▶ 앱 기동 + 네이티브 파일/폴더 선택 │ 3. POST / {id, filename:절대경로} ─────────▶ 저장 │ 4. GET /{id} 폴링 ──────────────────────────────────────────────────▶ 조회 │◀──────────────── {status:"ok", data:{id, filename}} ───────────────────┤ │ 5. 경로 사용
이 문서의 범위이 안내서는 ①Windows Server에 file-api-server 설치와 ②브라우저에서 호출 설정을 다룹니다. 사용자 PC의 FilePathInterface 앱 설치(인스톨러 배포)는 별도 저장소(github.com/chans97/file-path-interface)를 참고하세요.

1. 사전 준비물

항목버전/조건비고
JDK17 이상 (17 권장)빌드·실행에 필요. 설치 후 JAVA_HOMEPATH 등록.
Git최신소스 clone 및 build.bat의 자동 git pull에 사용. (수동으로 소스를 복사한다면 없어도 됨)
인바운드 포트TCP 20000Windows 방화벽에서 열어야 사용자 PC가 접속 가능 (5장).
고정 IP / 호스트명사내에서 접근 가능한 주소브라우저·앱이 이 주소로 호출. 예: 192.168.0.10

JDK 설치 확인

java -version
:: openjdk version "17..." 등이 나오면 정상
JAVA_HOME 예시 (PowerShell, 관리자):
setx JAVA_HOME "C:\Program Files\Java\jdk-17" /M
:: 새 명령창을 열어 반영 확인
echo %JAVA_HOME%

2. 소스 내려받기

동봉된 배치 스크립트들이 작업 경로를 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_DIRC:\file-api-server\file-api-server 로 하드코딩되어 있습니다. 다른 경로에 설치하려면 두 배치 파일의 WORKING_DIR도 함께 수정하세요.

3. 빌드

방법 A(동봉 스크립트) 또는 B(직접 실행) 중 하나를 쓰면 됩니다.

방법 A — build.bat (git pull 후 빌드)

cd /d C:\file-api-server\file-api-server
build.bat
build.bat은 내부적으로 git pull --forcegradlew.bat clean build를 수행합니다.

방법 B — Gradle 직접

cd /d C:\file-api-server\file-api-server
gradlew.bat clean bootJar
산출물 (JAR) 위치빌드가 끝나면 아래 파일이 생성됩니다.
C:\file-api-server\file-api-server\build\libs\file-api-server-0.0.1-SNAPSHOT.jar

4. 실행

동봉된 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
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%
최초 1회는 포그라운드 실행 권장 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 로 종료

5. 방화벽 포트 개방 (TCP 20000)

사용자 PC에서 서버로 접속하려면 인바운드 20000을 열어야 합니다. PowerShell(관리자)에서:

New-NetFirewallRule -DisplayName "file-api-server 20000" `
  -Direction Inbound -Protocol TCP -LocalPort 20000 -Action Allow
사내 네트워크/보안 정책상 별도 방화벽 장비가 있으면 그쪽에서도 20000 허용이 필요할 수 있습니다.

6. 설치 검증

서버에서(로컬) 그리고 다른 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}}

7. 부팅 시 자동 시작 (운영 환경 권장)

start.bat은 로그인 세션에서 실행되어 로그오프/재부팅 시 종료됩니다. 서버 상시 운영에는 아래 중 하나로 등록하세요.

방법 A — NSSM으로 Windows 서비스 등록 (가장 권장)

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
서비스로 등록하면 재부팅 후 자동 기동되고, 장애 시 자동 재시작(옵션)도 설정할 수 있습니다.

방법 B — 작업 스케줄러

작업 스케줄러 → 작업 만들기 → 트리거 “컴퓨터 시작 시” → 동작 “프로그램 시작”에 start.bat 지정, “가장 높은 수준의 권한으로 실행” 체크.

8. 중지 / 재시작

서비스(NSSM)로 운영 시: nssm stop FileApiServer / nssm restart FileApiServer.

배치로 운영 시 동봉된 stop.batjps로 프로세스를 찾아 종료합니다(경로에 “file-api-server”가 포함되어 매칭됨). 재시작은 stop.batstart.bat.

참고stop.bat이 동작하려면 jps가 PATH에 있어야 합니다(JDK의 bin). JRE만 설치했다면 jps가 없을 수 있어 작업관리자에서 javaw.exe를 직접 종료하거나 서비스 방식을 권장합니다.

9. 브라우저에서 호출하는 법

웹앱(브라우저) 쪽 순서는 세 단계입니다: ①앱 호출 → ②서버 폴링 → ③경로 사용. 서버 주소는 커스텀 프로토콜 URL 안에 담겨 앱에 전달되고, 앱은 그 주소로 결과를 POST합니다. (앱 코드에는 IP가 하드코딩되어 있지 않습니다.)

커스텀 프로토콜 URL 형식

FilePathInterface:{protocol}/{서버IP}/{포트}/{FILE|DIR}/{id}

예) 파일 선택 :  FilePathInterface:http/192.168.0.10/20000/FILE/12345
예) 폴더 선택 :  FilePathInterface:http/192.168.0.10/20000/DIR/12345

복사해서 쓰는 예제 (HTML/JS)

버튼을 누르면 앱을 띄우고, 서버를 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>
사용자 PC에 앱이 먼저 설치되어 있어야 합니다FilePathInterface: 프로토콜은 FilePathInterface 앱을 인스톨러로 설치할 때 OS에 등록됩니다. 앱이 없으면 브라우저가 “이 링크를 열 앱을 찾을 수 없음”을 표시합니다.

10. 알아두어야 할 동작

11. 트러블슈팅

증상원인 / 조치
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