자바 로그 선언에 대해서 찾아보면 2가지 선언방법이 나옵니다.
- 정적선언
LOGGER를 static으로 선언함으로써 클래스에 종속된 상태로 유지
private static final Logger logger = LoggerFactory.getLogger(JavaClassName.class);
- 인스턴스 선언
getClass() 를 사용해 현재 인스턴스의 클래스 타입을 기준으로 Logger를 선언
private final Logger log = LoggerFactory.getLogger(getClass());
https://slf4j.org/faq.html#declared_static
SLF4J FAQ
Generalities What is SLF4J? When should SLF4J be used? Is SLF4J yet another logging facade? If SLF4J fixes Jakarta Commons Logging (JCL), then why wasn't the fix made in JCL instead of creating a new project? When using SLF4J, do I have to recompile my app
slf4j.org
SLF4J 사이트에서는
logger 멤버를 정적이 아닌 인스턴스 변수로 선언할 것을 권장한다고 한다.
1. 정적(static) 으로 선언했을 때 이점과 단점은 ?
1.1 이점
1) 메모리 효율성 좋음 : Logger가 정적으로 선언되기 때문에 클래스 로딩 시 한번만 초기화된다. 따라서
메모리 사용량이 적고, 모든 인스턴스가 동일한 Logger인스턴스를 공유한다.
2) 일반적이고 잘 정립된 관용어
3) 성능효율성 좋음 : 정적 필드는 클래스 로딩 시 초기화 되므로, 로깅 시 불필요한 객체 생성이 줄어들어 성능에 유리하다.
4) 일관성 유지 : JavaClassName.class 를 통해 클래스명을 명시적으로 지정함으로서, 로그 파일을 확인할 때 해당 클래스에 대한 명확한 출처를 쉽게 알 수 있다.
1.2 단점
1) 애플리케이션 간 로깅 환경 독립성 부족 : 정적 로거는 한 번 로그되면 해당 클래스에 종속된 상태로 유지된다. 부모 클래스에서 선언된 정적 logger 를 클래스가 그대로 사용하게 되면, 자식 클래스의 로그에서도 부모 클래스명이 찍히게 된다. 따라서 상속 구조에서 다소 일관성 문제가 발생할 수 있다.
하지만 SLF4J 로깅프레임워크와 로깅 설정이 각각의 애플리케이션에 독립적으로 포함되어 있다면, 애플리케이션마다 개별적인 로깅환경을 유지할 수 있다.
2) 의존성 주입(IOC)과의 비호환성 : 의존성주입을 통해 로깅 설정을 다르게 하거나 동적으로 변경하는 것이 어렵기 때문에, 유연한 로깅 구성을 구현하는 데 한계가 있다.
2. 인스턴스(instance)로 선언했을 때 이점과 단점은 ?
2.1 이점
1) 상속에서의 유연성 : 상속 구조에서 자식 클래스가 Logger를 상속받더라도, getClass()를 통해 각 클래스에 맞는 Logger 인스턴스를 동적으로 생성할 수 있다.
2) 동적인 클래스 참조 : 코드 복사 및 재사용시 해당 코드가 어떤 클래스에서 호출되었는지 정확하게 기록할 수 있다.
3) 의존성 주입(IOC) 과 친화적
4) 로거 직렬화 : 정적변수와 달리 인스턴스 변수는 기본적으로 직렬화 된다. slf4j 버전 1.5.3부터 로거 인스턴스는 직력화에서 살아남는다.
2.2 단점
1) 메모리 및 성능 효율성 저하 : 인스턴스 필드로 Logger를 선언하므로, 클래스의 각 인스턴스가 별도의 Logger 인스턴스를 가질 수 있다. 정적 선언보다 약간의 메모리 소모가 더 발생할 수 있다.
3. 요약
정적 변수로 로거를 선언하면 CPU 사용량이 줄고, 메모리도 조금 더 효율적으로 사용할 수 있습니다. 반면, 인스턴스 변수로 선언하면 CPU와 메모리를 더 쓰긴 하지만, 각 애플리케이션마다 독립적인 로거 환경을 구성할 수 있습니다. 특히 인스턴스 변수는 의존성 주입(IOC)과 호환이 잘 되는 반면, 정적 변수는 그렇지 않다는 점이 중요한 차이점이라고 합니다.
+ 임포트는
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
참고 문헌 :
https://stackoverflow.com/questions/6653520/why-do-we-declare-loggers-static-final
Why do we declare Loggers static final?
In Java, why is it best practice to declare a logger static final? private static final Logger S_LOGGER
stackoverflow.com
https://thiago6.tistory.com/167
logger 변수 private static final 선언이유?
보통 아래와 같이 무의식적으로 logger를 선언한다.private static final Logger logger = LoggerFactory.getLogger(ThisClass.class); 스택오버플로우를 보면, - private: 다른 클래스에서 가로채 사용하지 못하도록- static:
thiago6.tistory.com
'백엔드 back-end' 카테고리의 다른 글
[JAVA] 메서드 체이닝(Method Chaining) 이란? 사용 예시/ 주의사항 (1) | 2025.02.28 |
---|---|
[Spring] DTO & Entity 차이, 분리이유 ? (0) | 2024.09.25 |
[리팩토링] if-statemets 를 효율적이고 가독성있게 사용하는 방법 3가지 (1) | 2024.08.20 |
[Spring] @Value 어노테이션 값에 빨간줄 뜨는 이유? / 인식오류/ 해결방법 (0) | 2024.08.13 |
[JPA] 엔티티 클래스 테이터 타입 int, Integer 차이점/ null 값 오류 해결방법 (0) | 2024.08.05 |