[java] Google Guice를 사용하여 로깅(Logging) 구현하기

로깅은 소프트웨어 개발에서 중요한 부분입니다. 로그를 기록하면 애플리케이션의 동작을 추적하고 디버깅에 도움이 됩니다. 이번에는 Google Guice를 사용하여 Java 애플리케이션에서 로깅을 구현하는 방법을 알아보겠습니다.

Google Guice란?

Google Guice는 Java 애플리케이션의 의존성 주입(Dependency Injection)을 쉽게 처리하기 위한 프레임워크입니다. Guice를 사용하면 애플리케이션의 구성 요소들을 관리하고 의존 관계를 자동으로 주입할 수 있습니다.

로그 라이브러리 선택

우선 로깅을 위해 어떤 라이브러리를 사용할지 선택해야 합니다. 대표적으로 Log4j, Logback, Slf4j 등이 있습니다. 이번 예제에서는 Slf4j와 Logback을 사용하겠습니다.

의존성 추가

먼저 Maven을 사용한다면 pom.xml 파일에 다음 의존성을 추가합니다.

<dependencies>
    <!-- Slf4j API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.32</version>
    </dependency>

    <!-- Logback Classic -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version>
    </dependency>

    <!-- Google Guice -->
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>5.0.1</version>
    </dependency>
</dependencies>

Gradle을 사용한다면 build.gradle 파일에 다음 의존성을 추가합니다.

dependencies {
    // Slf4j API
    implementation 'org.slf4j:slf4j-api:1.7.32'

    // Logback Classic
    implementation 'ch.qos.logback:logback-classic:1.2.6'

    // Google Guice
    implementation 'com.google.inject:guice:5.0.1'
}

Guice 모듈 설정

애플리케이션 로깅을 위한 Guice 모듈을 작성해야 합니다. 다음은 간단한 Guice 모듈 설정 예제입니다.

import com.google.inject.AbstractModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingModule extends AbstractModule {
    @Override
    protected void configure() {
        // Logger 바인딩
        bind(Logger.class).toInstance(LoggerFactory.getLogger(getCallingClassName()));
    }

    private String getCallingClassName() {
        return new Throwable().getStackTrace()[2].getClassName();
    }
}

이 모듈은 Logger 인스턴스를 Guice 컨테이너로부터 주입할 수 있도록 설정합니다.

애플리케이션에서 로깅 사용하기

이제 로깅을 사용할 클래스에 Logger를 주입하여 사용할 수 있습니다. Guice를 사용하는 예제 클래스는 다음과 같습니다.

import com.google.inject.Inject;
import org.slf4j.Logger;

public class MyClass {
    private final Logger logger;
    
    @Inject
    public MyClass(Logger logger) {
        this.logger = logger;
    }
    
    public void doSomething() {
        logger.info("Something is happening.");
    }
}

MyClass에서 Logger를 생성자 주입으로 받아와 로깅을 사용합니다.

로깅 설정 파일 생성

마지막으로 Logback을 사용하여 로깅 설정 파일을 생성해야 합니다. src/main/resources 디렉토리에 logback.xml 파일을 생성하고 다음 내용을 작성합니다.

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

이 설정은 콘솔로 로그를 출력하도록 설정합니다.

실행 결과 확인

애플리케이션을 실행하고 로깅 결과를 확인해보세요.

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new LoggingModule());
        MyClass myClass = injector.getInstance(MyClass.class);
        
        myClass.doSomething();
    }
}

위의 Main 클래스를 실행하면 콘솔에 로그가 출력됩니다.

결론

이렇게 Google Guice를 사용하여 Java 애플리케이션에서 로깅을 구현하는 방법을 알아보았습니다. Guice를 사용하면 의존성 주입과 함께 로깅을 쉽게 구현할 수 있습니다. 로깅은 애플리케이션의 안정성과 디버깅에 매우 중요하므로, 적절한 로그 라이브러리와 Guice를 통해 구현하는 것을 권장합니다.

참고 자료