DevJong12

[Issue] Embedded-redis의 slf4j 의존성 이슈 본문

프로젝트/NoobLoL

[Issue] Embedded-redis의 slf4j 의존성 이슈

Jong12 2022. 9. 15. 16:15
728x90

개요

프로젝트의 기능 구현 진행을 위해 Redis를 셋팅하면서 문제가 발생하였다. 정확히는 Test의 설정과 관련된 의존성 문제이며, 해결하는 과정을 기록한 포스트이다.


설정 및 테스트 코드

 

먼저 설정의 경우 아래의 포스트를 참고하였다.

 

Redis(레디스) | Spring Boot 프로젝트 연동하기

[DB, NoSQL] - Windows 10 | 레디스(Redis) 설치 및 명령어 [DB, NoSQL] - Windows 10 | 레디스(Redis) 비밀번호 설정 📌 구성환경 SpringBoot 2.5.6, Redis 3.2.100 build.gradle implementation 'org.springfram..

kitty-geno.tistory.com

 

테스트 케이스의 경우에는 작동여부만 판단하기 위해 작성했으며, 아래의 포스트의 케이스를 가져와서 사용하였다.

 

[Redis - 8] Spring Boot Redis 사용해보기

Mac OS CatalinaSpring Boot 2.42Java 8https://start.spring.io/ 에서 들어가서 설정을 동일하게 해주세요. LombokSpring Boot DevTools Spring WebSpring Data Redis자바 버전은

velog.io



  • build.gradle
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis'
    testImplementation group: 'it.ozimov', name: 'embedded-redis', version: '0.7.3'

 

  • application.yml (추가적인 설정을 진행한 부분이다.)
spring:
  redis: #redis
    host: 127.0.0.1
    port: 6379
    lettuce:
      pool:
        #min-Idle 1로 설정한 이유는 0인 경우 다시 커넥션을 맺어야 하나, 한개이상 맺고있으면 통신없이 바로 사용이 가능하기에
        min-idle: 1
        max-idle: 8
        max-active: 8
    password: test

 

  • RedisConfig.java
package com.nooblol.global.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisConfig {

  @Value("${spring.redis.host}")
  private String host;

  @Value("${spring.redis.port}")
  private int port;

  @Value("${spring.redis.password}")
  private String password;

  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
    redisStandaloneConfiguration.setHostName(host);
    redisStandaloneConfiguration.setPort(port);
    redisStandaloneConfiguration.setPassword(password);
    return new LettuceConnectionFactory(redisStandaloneConfiguration);
  }

  @Bean
  public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    return redisTemplate;
  }
}

 

  • RedisConfigTest.java
package com.nooblol.global.config;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.ActiveProfiles;

@SpringBootTest
@ActiveProfiles(profiles = "local")
class RedisConfigTest {

  @Autowired
  RedisTemplate redisTemplate;

  @Test
  void contextLoads() {
  }

  @Test
  void redisConnectionTest() {
    final String key = "a";
    final String data = "1";

    final ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
    valueOperations.set(key, data);

    final String result = valueOperations.get(key);
    assertEquals(data, result);
  }
}

오류로그

오류로그는 Slf4j에 대한 Binding문제라고 표시가 되었다.

 

1번

더보기

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/kimjongwon/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/1.7.36/a41f9cfe6faafb2eb83a1c7dd2d0dfd844e2a936/slf4j-simple-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/kimjongwon/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.11/4741689214e9d1e8408b206506cbe76d1c6a7d60/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]

2번

더보기

Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.SimpleLoggerFactory loaded from file:/Users/kimjongwon/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/1.7.36/a41f9cfe6faafb2eb83a1c7dd2d0dfd844e2a936/slf4j-simple-1.7.36.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.SimpleLoggerFactory
at org.springframework.util.Assert.instanceCheckFailed(Assert.java:702)
at org.springframework.util.Assert.isInstanceOf(Assert.java:621)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:294)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:118)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:232)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:213)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:79)
at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:56)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:56)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:299)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:132)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
... 71 more


오류가 발생한 원인

현재 내가 프로젝트를 하면서 spring-boot-starter-logging을 의존성추가하여 사용을 진행하고 있다.

로그의 경우 SimpleLoggerFactory라는게 문제의 원인이 된 것 같아 일단 Gradle을 뒤져보기로 하였다.

 

slf4j로 검색할 때 결과다.

 

처음에 발생했던 embedded-redis의 의존성이 문제가 되었다. 해당 오류는 내가 처음이 아닐꺼 좀더 찾아보니...

 

https://rogal.tistory.com/entry/Embedded-Redis-%EB%A5%BC-%EC%93%B0%EB%A9%B4%EC%84%9C-%EA%B2%AA%EC%9D%80-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0%EB%B0%A9%EC%95%88

 

Embedded Redis 를 쓰면서 겪은 문제와 해결방안

key-value의 데이터 베이스가 필요할 때 redis를 사용한다. 스프링에서 Embedded Redis를 의존하여 쓸 일이 있었는데 문제와 해결을 몇가지 기록하려고 한다. 1. 의존성 문제 - slf4j logger 중복 구현으로 인

rogal.tistory.com

해당 포스트에서 동일한 오류를 찾을 수 있었다.

 

0.7.3에서부터 발생한 오류라고 한다.....아직까지도 방치중이라고...


해결방법은?

위 포스트에서 남겨줬던 깃 Issue로 들어가 확인해보면 아래의 방법을 사용한 것으로 보인다.

compile ('it.ozimov:embedded-redis:0.7.3') { exclude group: "org.slf4j", module: "slf4j-simple" }

Gradle에서의 설정을 해당 의존성에서 slf4j를 제외하면 될 것 같다.

 

 

나의 경우엔 버전이 매우 중요했던 것은 아니었다 보니, 0.7.3에서 난 오류라고? 를 생각했어서 버전을 0.7.2로 다운그레이드 시켜봤으며, slf4j-simple의 의존성이 제거된 것을 볼 수가 있었다.

 

테스트 결과는? 성공을 했다..오....

 

꼭 다운그레이드 없이 제거만 해도 괜찮을 것 같다.

728x90
Comments