Application Servers & Java

[장애 사례] SLF4J AbstractMethodError 발생 원인과 해결 방법

midworker 2025. 5. 15. 18:53
반응형

[장애 사례] SLF4J AbstractMethodError 발생 원인과 해결 방법

Spring 기반 WAR를 JBoss/WildFly에 배포할 때 다음과 같은 에러로 배포 실패하는 경우가 있습니다.


✅ 에러 메시지 요약

Caused by: java.lang.AbstractMethodError:
org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V

✅ 원인 정리

  • SLF4J API의 log() 메서드는 버전에 따라 시그니처가 달라질 수 있음
  • slf4j-apislf4j-impl (예: slf4j-jdk14) 간 버전 불일치 발생 시
  • 혹은 WildFly에 내장된 SLF4J 모듈과 프로젝트 내부 라이브러리가 충돌할 때 발생

즉, SLF4J 인터페이스는 최신인데 구현체는 구버전이라 메서드를 찾을 수 없음


✅ 재현 환경 예시

  • 프로젝트 내 의존성:
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.36</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.6.1</version> <!-- ← 이 부분이 문제 -->
</dependency>
  • 배포 서버: WildFly 26.x
  • 에러 발생 시점: webapp.war 배포 중

✅ 해결 방법

1. slf4j-api와 구현체 버전 통일

  • slf4j-apislf4j-jdk14 또는 slf4j-log4j12같은 버전으로 맞추기

예:

<version>1.7.36</version>

2. 의존성 충돌 제거 (Maven/Gradle)

mvn dependency:tree | grep slf4j
  • 중복된 구버전 제거
  • 종속 라이브러리에서 transitive 의존성이 끌려오지 않도록 exclusions 설정

3. JBoss/WildFly 내장 SLF4J 제외

jboss-deployment-structure.xml 설정 추가:

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.slf4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

내부 모듈 제외하고 WAR 내부 라이브러리 우선 적용


✅ 추가 팁

  • SLF4J는 facade(인터페이스) 구조이므로 구현체(logback, log4j 등) 명확히 구분해야 함
  • WildFly는 기본적으로 org.slf4j 모듈을 내장하고 있으므로 WAR 내부 버전과 충돌 주의

✅ 마무리

이 오류는 라이브러리 충돌의 전형적인 사례입니다.
버전 불일치만 잘 관리해도 대부분 예방할 수 있습니다.


반응형