Home e.printStackTrace()의 문제점과 해결을 위한 @Log4j2와 @Slf4j
Post
Cancel

e.printStackTrace()의 문제점과 해결을 위한 @Log4j2와 @Slf4j

e.printStackTrace()의 문제점과 해결을 위한 @Log4j2와 @Slf4j

e.printStackTrace() 메소드의 사용은 여러 문제점을 가지고 있습니다. 가장 큰 문제는 이 메소드가 스택 트레이스를 표준 오류 스트림으로 출력한다는 것입니다. 이것은 다음과 같은 이유로 바람직하지 않습니다:

  1. 통제되지 않은 로깅: e.printStackTrace()는 로깅 라이브러리를 사용하지 않고 직접 출력합니다. 이는 로그의 포맷이나 출력 대상을 통제할 수 없다는 것을 의미합니다.
  2. 유연성 부족: 애플리케이션의 로깅 레벨이나 출력 형식을 변경할 수 없습니다.
  3. 문맥 정보 부족: 예외만 출력되며, 추가적인 문맥 정보가 제공되지 않습니다.

반면에 @Log4j2 또는 @Slf4j 어노테이션을 사용하여 로그를 기록하는 것은 더 나은 접근법입니다. 이러한 방법을 사용하면 다음과 같은 이점이 있습니다:

  1. 유연한 로깅: 로그 레벨, 포맷, 출력 대상을 쉽게 변경할 수 있습니다.
  2. 성능 향상: 로그 레벨에 따라 필요하지 않은 로그를 출력하지 않아 성능이 향상됩니다.
  3. 문맥 정보 제공: 추가적인 문맥 정보를 로그에 포함시킬 수 있습니다.

@Log4j2@Slf4j 사이에는 몇 가지 차이점이 있습니다. Log4j2는 로그 기록을 위한 구체적인 구현체이며, Slf4j는 로깅을 위한 추상화 레이어를 제공합니다. 아래 표는 이 두 로깅 방식의 주요 차이점과 특징을 요약한 것입니다:

특징 / 로깅 프레임워크Log4j2SLF4J
타입로깅 구현체로깅 파사드
주요 기능고성능 로깅, 비동기 로깅다양한 로깅 구현체와 연동
사용법직접 사용다른 로깅 구현체를 위한 인터페이스
확장성커스텀 로거 구현 가능구체적인 로깅 구현체를 선택할 수 있음
성능빠른 로깅 성능로깅 구현체에 따라 다름
설정XML, JSON, YAML 등을 통한 구성구현체에 따라 달라짐

일반적으로, SLF4J는 다양한 로깅 시스템 간의 호환성을 제공하는 파사드 역할을 하며, Log4j2는 로깅 시스템의 한 구현체로서 더 많은 기능과 성능을 제공합니다.

이제, e.printStackTrace()를 사용한 기존 코드의 예시를 살펴보겠습니다. 이후에 이를 @Log4j2@Slf4j를 사용하는 방식으로 각각 수정한 코드를 보여드리겠습니다.

기존 코드 (e.printStackTrace 사용)

1
2
3
4
5
6
7
8
9
public class SomeClass {
    public void someMethod() {
        try {
            // 비즈니스 로직
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Log4j2를 사용한 수정 코드

@Log4j2 어노테이션을 사용하려면, 먼저 의존성을 build.gradle 파일에 추가해야 합니다.

1
2
3
4
dependencies {
    implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
}

수정된 코드는 다음과 같습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {
    private static final Logger logger = LogManager.getLogger(SomeClass.class);

    public void someMethod() {
        try {
            // 비즈니스 로직
        } catch (Exception e) {
            logger.error("An error occurred", e);
        }
    }
}

@Slf4j를 사용한 수정 코드

@Slf4j 어노테이션을 사용하려면, 먼저 의존성을 build.gradle 파일에 추가해야 합니다.

1
2
3
4
dependencies {
    implementation 'org.slf4j:slf4j-api:1.7.32'
    implementation 'org.slf4j:slf4j-simple:1.7.32'
}

수정된 코드는 다음과 같습니다:

1
2
3
4
5
6
7
8
9
10
11
12
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SomeClass {
    public void someMethod() {
        try {
            // 비즈니스 로직
        } catch (Exception e) {
            log.error("An error occurred", e);
        }
    }
}

이렇게 수정함으로써, 로그의 출력 방식을 더 유연하게 관리할 수 있으며, 예외 처리를 통해 더 많은 정보를 제공하고 성능을 향상시킬 수 있습니다.

MAC host파일 수정방법

제네릭 타입