Java WatchService API는 Java 7에서 도입된 파일 시스템의 변경 사항을 모니터링할 수 있는 기능을 제공하는 API입니다. 이 API를 사용하면 특정 디렉터리 내에서 파일 및 디렉터리가 생성, 수정 또는 삭제되는 이벤트를 감지할 수 있습니다. 이를 통해 파일 시스템의 변화에 실시간으로 반응해야 하는 애플리케이션을 개발할 수 있습니다.
.jpg)
WatchService Download 하러가기
1. WatchService API의 개요
WatchService API는 Java의 java.nio.file
패키지에 포함되어 있습니다. 주로 파일 관리, 로깅 시스템, 실시간 동기화 애플리케이션 등에서 사용되며, 파일 및 디렉터리의 상태를 감시하고 이벤트가 발생했을 때 이를 애플리케이션에 알리는 역할을 합니다.
2. WatchService API의 주요 구성 요소
WatchService API는 다음과 같은 주요 인터페이스와 클래스로 구성됩니다:
- WatchService
파일 시스템의 변경 사항을 감지하는 서비스를 나타내는 인터페이스입니다.newWatchService()
메서드를 통해 생성되며, 이벤트를 감시할 수 있습니다. - Watchable
감시 가능한 객체를 나타내는 인터페이스로, 일반적으로Path
객체가 이를 구현합니다.Path
객체는register()
메서드를 통해 WatchService에 등록할 수 있습니다. - WatchKey
WatchService에 등록된 객체에 대한 이벤트를 나타내는 키입니다. 이벤트가 발생하면 WatchKey가 활성화되고, 이를 통해 이벤트를 조회할 수 있습니다. - WatchEvent
파일 시스템 이벤트를 나타내며, 생성, 수정, 삭제 이벤트를 식별할 수 있는 타입을 포함합니다.
3. WatchService API의 사용 방법
WatchService API를 사용하기 위해 다음과 같은 단계를 수행합니다:
Step 1: WatchService 생성
WatchService 객체를 생성하려면 FileSystems.getDefault().newWatchService()
를 호출합니다.
javaWatchService watchService = FileSystems.getDefault().newWatchService();
Step 2: 디렉터리 경로 등록
모니터링할 디렉터리의 경로를 register()
메서드를 사용하여 WatchService에 등록합니다. 여기서 감지할 이벤트 타입을 지정할 수 있습니다.
javaPath path = Paths.get("C:/example/directory");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
Step 3: 이벤트 처리
무한 루프를 통해 WatchService에서 이벤트가 발생하는지 지속적으로 확인합니다. 이벤트가 발생하면 take()
메서드가 활성화된 WatchKey를 반환합니다.
javawhile (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: 이벤트가 손실된 경우 발생

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의 작동 원리와 사용법을 쉽게 이해할 수 있을 것입니다.