Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 모듈에서 ServiceLoader 클래스를 활용하는 방법

자바에는 java.util 패키지에 ServiceLoader 클래스가 포함되어 있으며, 이 클래스를 활용하면 런타임에 클래스패스(classpath)를 검색하여 서비스 프로바이더(service provider)를 자동으로 찾아낼 수 있습니다. 특히 Java 9부터 도입된 모듈 시스템에서 정의된 서비스 프로바이더를 다룰 때 유용하게 사용됩니다.

모듈에서의 서비스 선언 예제

예를 들어, "test.app" 모듈에서 로거(Logger)를 사용해야 한다고 가정해 보겠습니다. 이때 LoggerFinder 서비스를 통해 System.getLogger() 팩토리 메서드로 로거 인스턴스를 얻을 수 있습니다.

module com.tutorialspoint.test.app {
    requires java.logging;
    exports com.tutorialspoint.platformlogging.app;
    uses java.lang.System.LoggerFinder;
}

MainApp 클래스 구현

위 모듈에서 사용되는 test.app.MainApp 클래스는 다음과 같이 작성할 수 있습니다.

package com.tutorialspoint.platformlogging.app;

public class MainApp {
    private static Logger LOGGER = System.getLogger();
    public static void main(String args[]) {
        LOGGER.log();
    }
}

LoggerFinder 서비스 구현하기

다음은 "test.logging" 모듈 내부에서 LoggerFinder를 구현한 코드입니다. getLogger() 메서드를 오버라이드하여 이름과 모듈 정보에 따라 적절한 로거를 반환하도록 작성합니다.

package com.tutorialspoint.platformlogging.logger;

public class MyLoggerFinder extends LoggerFinder {
    @Override
    public Logger getLogger(String name, Module module) {
        // name/module 값에 따라 적절한 Logger 반환
    }
}

provides – with 절로 서비스 등록

"test.logging" 모듈 선언부에서는 "provides – with" 절을 사용하여 LoggerFinder 서비스의 구현체를 제공(등록)할 수 있습니다. 이렇게 등록된 서비스는 ServiceLoader를 통해 런타임에 자동으로 검색되어 사용됩니다.

module com.tutorialspoint.test.logging {
    provides java.lang.System.LoggerFinder
    with com.tutorialspoint.platformlogging.logger.MyLoggerFinder;
}

정리하면, 소비자(consumer) 모듈은 uses 절로 필요한 서비스를 선언하고, 제공자(provider) 모듈은 provides – with 절로 구현체를 등록합니다. 그러면 ServiceLoader가 런타임에 이들을 연결해 주므로, 모듈 간 느슨한 결합(loose coupling)을 유지하면서도 유연한 플러그인 아키텍처를 구성할 수 있습니다.