[kotlin] 코틀린 빌더 패턴을 사용한 로깅 및 디버깅 기능 구현 방법

코드의 로깅 또는 디버깅 기능을 구현할 때, 코틀린의 빌더 패턴을 사용하면 편리하고 가독성 있는 코드를 작성할 수 있습니다. 빌더 패턴은 객체를 생성하고 초기화하기 위해 사용되며, 체이닝(Chaining)을 통해 여러 메소드를 순차적으로 호출하는 방식을 제공합니다. 이러한 특징을 활용하여 로깅 및 디버깅 기능을 구현해보겠습니다.

빌더 클래스 생성

class Logger private constructor(
    private val tag: String?,
    private val logLevel: LogLevel?,
    private val logFormat: LogFormat?
) {

    data class Builder(
        private var tag: String? = null,
        private var logLevel: LogLevel? = null,
        private var logFormat: LogFormat? = null
    ) {

        fun setTag(tag: String) = apply { this.tag = tag }

        fun setLogLevel(logLevel: LogLevel) = apply { this.logLevel = logLevel }

        fun setLogFormat(logFormat: LogFormat) = apply { this.logFormat = logFormat }

        fun build(): Logger {
            return Logger(tag, logLevel, logFormat)
        }
    }

    fun log(message: String) {
        if (logLevel != null) {
            val formattedMessage = logFormat?.formatMessage(tag, logLevel, message) ?: message
            println(formattedMessage)
        }
    }
}

enum class LogLevel {
    DEBUG, INFO, WARN, ERROR
}

interface LogFormat {
    fun formatMessage(tag: String?, logLevel: LogLevel, message: String): String
}

로그 포멧 클래스 구현

class DefaultLogFormat : LogFormat {

    override fun formatMessage(tag: String?, logLevel: LogLevel, message: String): String {
        val formattedTag = tag?.let { "[$it]" } ?: ""
        return "[$logLevel]$formattedTag: $message"
    }
}

위의 코드는 로거(Logger) 클래스를 구현한 예시입니다. 로거의 속성으로는 태그(tag), 로그 레벨(logLevel), 로그 포맷(logFormat)이 있습니다. 빌더 클래스를 통해 로거 객체를 생성하고 초기화할 수 있습니다. 로그 메시지를 출력하는 log 메소드를 제공하며, 지정된 로그 레벨에 따라 로그 메시지를 포멧하여 출력합니다. 로그 포맷은 인터페이스를 통해 구현하여 다양한 형식으로 로그 메시지를 포맷할 수 있습니다.

사용 예시

val logger = Logger.Builder()
    .setTag("App")
    .setLogLevel(LogLevel.DEBUG)
    .setLogFormat(DefaultLogFormat())
    .build()

logger.log("Hello, World!")

위의 예시에서는 빌더를 통해 로거 객체를 초기화한 후, log 메소드를 호출하여 로그 메시지를 출력합니다. 이때, 태그는 “App”으로 설정되고, 로그 레벨은 DEBUG로 설정됩니다. 로그 포맷은 DefaultLogFormat 클래스로 지정하며, 해당 클래스에 정의된 포맷 형식에 맞게 로그 메시지가 출력됩니다.

이처럼 코틀린의 빌더 패턴을 활용하여 로깅 및 디버깅 기능을 구현하면, 코드를 더욱 간결하게 작성할 수 있으며, 필요한 설정을 유연하게 조정할 수 있습니다.