스프링 공부/어노테이션 정리

@Log(@Slf4j를 써보다가 궁금해서 찾아본 내용 정리)

장아장 2023. 1. 1. 15:43

이게 뭘까? 사실 다른 어노테이션들은 이름을 보면 간단하게 뜻을 유추해볼 수 있거나, 구글링해야할 단어들을 명확히 알 수 있다. 

그런데 이건 진짜 모르겠다. 그대로 복사해서 구글링을 해보기도 했다(진짜 별다줄이라는 말이 괜히 있는게 아니다)

 

근데, 구글링 하기 전에 항상 들어가보는 곳이 있다. 

package lombok.extern.slf4j;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Causes lombok to generate a logger field.
 * <p>
 * Complete documentation is found at the project lombok features page for lombok log annotations</a>.
 * <p>
 * Example:
 * <pre>
 * &#64;Slf4j
 * public class LogExample {
 * }
 * </pre>
 * 
 * will generate:
 * 
 * <pre>
 * public class LogExample {
 *     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
 * }
 * </pre>
 * 
 * This annotation is valid for classes and enumerations.<br>
 * @see org.slf4j.Logger</a>
 * @see org.slf4j.LoggerFactory#getLogger(java.lang.Class)</a>
 * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog
 * @see lombok.extern.java.Log &#64;Log
 * @see lombok.extern.log4j.Log4j &#64;Log4j
 * @see lombok.extern.log4j.Log4j2 &#64;Log4j2
 * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j
 * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog
 * @see lombok.extern.flogger.Flogger &#64;Flogger
 * @see lombok.CustomLog &#64;CustomLog
 */
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Slf4j {
   /** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */
   String topic() default "";
}

여기. 어노테이션을 cmd+클릭(맥 기준)을 해서 모르겠는걸 한번 까보고 검색을 하건, 써보기를 하건 한다. 

 

일단 주석문을 읽어보았을 땐, 롬복에서 logger field를 생성하게 해주는 어노테이션으로, 등록한 클래스에 상수로 Logger를 만들어주는 역할을 한다. 

 

그러면 Logger, Logger Field가 무엇일까?

 

Logger는 js의 Console.log처럼, java의 System.out.println처럼 기록, 출력을 해주는 일종의 장치이며, Logger Library에 저장시키는 방식으로 처리된다고 한다. 

근데, 대부분의 현업에서는 System.out.println보다는 로그로 시스템 출력문을 만드는 것을 선호한다고 한다. 

 

이러한 이유는, 위에 적혀있는 저장의 방식도 있지만, 추적과 데이터에 의미가 있다고 한다. 

일반적인 System.out.println은 출력의 목적이 있다. 하지만, Logger는 기록의 목적을 가진다. 

이를 통해 모니터링할 수 있고, 특이한 문제가 있다면 출력으로 처리시킬 수도 있다. 

이렇게 만들어진 로그들은 로그 라이브러리를 만들 수 있다. 

이에 대해서는 따로 정리하도록 하겠다. 

또한, 일반적인 출력문보다 로그를 사용했을 때 메모리가 더 적게 사용된다고 한다. 

트래픽이 많아졌을 때, 일반 출력문보다 더 적은 메모리로 로그를 사용할 수 있게 된다. 

 

이렇게 Slf4j -> Logger 까지 개인적으로 알아보았다. 이제, 정의되어있는 Slf4j에 대해서 찾아보아야 겠다. 

 

일단 lombok blog의 설명문을 보았다. 

 

기본적으로 @Slf4j는 @Log의 변형이라고 한다. 

공통적인 것은, 모든 변형과 기본의 @Log는 출력되는 부분들을 로그로 만들어주는 것이다. 

 

모든 어노테이션은 정적 변수 log를 만들어주는데, 이 방식이 조금씩 다르다. 

 

이중에서 내가 만들었던 Sl4fj를 보았을 경우엔, slf4j라는 단체에서 만든 LoggerFactory로 로그를 만들어내는 방식임을 알 수 있었다. 

지금은 만들어진 구조로 사용하지만, 나중에 서비스가 큰 기업의 경우에서는 Log를 직접 만들어 사용하며, @CustomLog를 통해 따로 로그를 모아 쓰거나 할 수 있다고도 생각된다. 

 

로그를 어떻게 만들었는지, 기회가 된다면 보고싶기도 하다(블로그에 써도 되려나...? 기업비밀아닌가몰라)

 

'스프링 공부 > 어노테이션 정리' 카테고리의 다른 글

@EventListner  (0) 2024.02.02
@뭐시깽이Constructor  (0) 2023.01.02
@JsonInclude  (0) 2023.01.02
@Bean  (0) 2022.12.28
@Configuration  (0) 2022.12.28