Java WatchService API로 실시간 파일 감시 및 디렉터리 모니터링 완벽 가이드

Java WatchService API는 Java 7에서 도입된 파일 시스템의 변경 사항을 모니터링할 수 있는 기능을 제공하는 API입니다. 이 API를 사용하면 특정 디렉터리 내에서 파일 및 디렉터리가 생성, 수정 또는 삭제되는 이벤트를 감지할 수 있습니다. 이를 통해 파일 시스템의 변화에 실시간으로 반응해야 하는 애플리케이션을 개발할 수 있습니다.

Java WatchService API로 실시간 파일 감시 및 디렉터리 모니터링 완벽 가이드

WatchService Download 하러가기

1. WatchService API의 개요

WatchService API는 Java의 java.nio.file 패키지에 포함되어 있습니다. 주로 파일 관리, 로깅 시스템, 실시간 동기화 애플리케이션 등에서 사용되며, 파일 및 디렉터리의 상태를 감시하고 이벤트가 발생했을 때 이를 애플리케이션에 알리는 역할을 합니다.

2. WatchService API의 주요 구성 요소

WatchService API는 다음과 같은 주요 인터페이스와 클래스로 구성됩니다:

  1. WatchService
    파일 시스템의 변경 사항을 감지하는 서비스를 나타내는 인터페이스입니다. newWatchService() 메서드를 통해 생성되며, 이벤트를 감시할 수 있습니다.
  2. Watchable
    감시 가능한 객체를 나타내는 인터페이스로, 일반적으로 Path 객체가 이를 구현합니다. Path 객체는 register() 메서드를 통해 WatchService에 등록할 수 있습니다.
  3. WatchKey
    WatchService에 등록된 객체에 대한 이벤트를 나타내는 키입니다. 이벤트가 발생하면 WatchKey가 활성화되고, 이를 통해 이벤트를 조회할 수 있습니다.
  4. WatchEvent
    파일 시스템 이벤트를 나타내며, 생성, 수정, 삭제 이벤트를 식별할 수 있는 타입을 포함합니다.

3. WatchService API의 사용 방법

WatchService API를 사용하기 위해 다음과 같은 단계를 수행합니다:

Step 1: WatchService 생성

WatchService 객체를 생성하려면 FileSystems.getDefault().newWatchService()를 호출합니다.

java
WatchService watchService = FileSystems.getDefault().newWatchService();

Step 2: 디렉터리 경로 등록

모니터링할 디렉터리의 경로를 register() 메서드를 사용하여 WatchService에 등록합니다. 여기서 감지할 이벤트 타입을 지정할 수 있습니다.

java
Path path = Paths.get("C:/example/directory");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);

Step 3: 이벤트 처리

무한 루프를 통해 WatchService에서 이벤트가 발생하는지 지속적으로 확인합니다. 이벤트가 발생하면 take() 메서드가 활성화된 WatchKey를 반환합니다.

java
while (true) {
WatchKey key;
try {
key = watchService.take(); // 이벤트가 발생할 때까지 대기
} catch (InterruptedException ex) {
return;
}

for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();

if (kind == StandardWatchEventKinds.OVERFLOW) {
continue; // 이벤트가 누락되었을 때 처리
}

// 이벤트에 대한 파일 또는 디렉터리 경로 가져오기
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
System.out.println(kind.name() + ": " + fileName);
}

// 키가 더 이상 유효하지 않으면 루프 종료
boolean valid = key.reset();
if (!valid) {
break;
}
}

4. 주요 이벤트 타입

WatchService API에서 감지할 수 있는 주요 이벤트 타입은 다음과 같습니다:

  • ENTRY_CREATE: 파일이나 디렉터리가 생성되었을 때 발생
  • ENTRY_DELETE: 파일이나 디렉터리가 삭제되었을 때 발생
  • ENTRY_MODIFY: 파일이나 디렉터리가 수정되었을 때 발생
  • OVERFLOW: 이벤트가 손실된 경우 발생
Java WatchService API로 실시간 파일 감시 및 디렉터리 모니터링 완벽 가이드

5. 주의사항

  • WatchService는 디렉터리 내의 파일만 감시할 수 있으며, 하위 디렉터리는 감시하지 않습니다. 하위 디렉터리를 감시하려면 각각 별도로 등록해야 합니다.
  • WatchService는 기본적으로 비동기적으로 동작하지만, 이벤트 처리 시 블로킹 메서드(take())를 사용하므로 별도의 스레드에서 실행하는 것이 좋습니다.

6. 사용 예시

다음은 WatchService를 활용한 간단한 디렉터리 감시 프로그램의 예시입니다:

java코드 복사import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
import java.io.IOException;

public class DirectoryWatcher {
    public static void main(String[] args) {
        try {
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Path path = Paths.get("C:/example/directory");
            path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

            System.out.println("Monitoring directory for changes...");

            while (true) {
                WatchKey key = watchService.take();

                for (WatchEvent<?> event : key.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();
                    WatchEvent<Path> ev = (WatchEvent<Path>) event;
                    Path fileName = ev.context();

                    System.out.println(kind.name() + ": " + fileName);
                }

                boolean valid = key.reset();
                if (!valid) {
                    break;
                }
            }
        } catch (IOException | InterruptedException ex) {
            System.err.println("Error: " + ex.getMessage());
        }
    }
}

7. 결론

Java WatchService API는 파일 시스템의 변경 사항을 감지하고 실시간으로 처리해야 하는 애플리케이션에 매우 유용합니다. 간단한 설정과 이벤트 기반 접근 방식으로 파일 모니터링 기능을 쉽게 구현할 수 있습니다. 이 API를 활용하면 애플리케이션의 효율성과 사용자 경험을 크게 향상시킬 수 있습니다.

참고 문서

이러한 구조로 블로그를 작성하면 독자들이 WatchService API의 작동 원리와 사용법을 쉽게 이해할 수 있을 것입니다.

위로 스크롤