본문 바로가기

kotlin

Kotlin/Spring 에서 logger 객체로 로그 출력하기

기본 사용방법

class TestClass {
    private val log = LoggerFactory.getLogger(javaClass)

    fun testMethod() {
	     log.info("test log")
    }
}

동작원리 파헤치기

LoggerFactory.getLogger()

public static Logger getLogger(...)

getLogger는 Logger 객체를 반환하는 static getter이다.

Logger

  • 실제 Logger 인터페이스 안에 info, debug, warn과 같은 메소드들이 선언되어 있다.
public interface Logger {
		public void debug(Marker marker, String msg);
		public void info(String msg);
		...
}

결론

  • LoggerFactory.getLogger하면 Logger타입의 객체를 하나 반환한다.
  • 자바로 치면 아래와 같은 형태인 것
  • private Logger log = Logger.Factory.getLogger(javaClass); public void testMethod() { log.info("test"); }

interface와 companion object를 이용해서 여러 곳에서 편하게 사용하기

interface LoggerSupport {
    val logger: Logger get() = LoggerFactory.getLogger(this.javaClass)
}

interface LoggerSupport {
    val logger: Logger
        get() {
            return LoggerFactory.getLogger(this.javaClass)
        }
}

사용하기

class TestClass {

    companion object : LoggerSupport

    fun test() : void {
        try {
          ...
        } catch (e: IOException) {
             logger.warn("Rest unauthorized result write failed", e)
        }
    }
}

companion object로 LoggerSupport 인터페이스를 구현한다. LoggerSupport에 이미 초기화, 구현이 다되어 있어서 따로 구현할 것 없이 저렇게만 선언하면 된다.

→ LoggerSupport의 속성값인 logger를 자유롭게 사용할 수 있게 된다.

참고) 위와 같이 사용이 가능한 이유 : companion object로 interface구현

  • companion object : 같은 클래스로부터 생성되는 모든 객체에서 공통적으로 쓰일 값 선언
  • 아래와 같이 companion object가 특정 interface를 구현해줄 수 있다.
  • → companion object가 구현한 특정 인터페이스 내의 멤버들은 현재 클래스에 선언한 것처럼 자유롭게 사용할 수 있다.
interface Person {
    val name: String
    fun hello()
}

class Student {
    companion object : Person {
        override val name: String = "juhi"
        override fun hello() {
            println("hello")
        }
    }
    fun test() {
        println(name)
        hello()
    }
}

Person 인터페이스처럼 구현해줘야 하는 메소드와 초기화해야 하는 속성값이 있을 때는 companion object를 선언할 때도 override해줘야 한다.

반응형