일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- junit
- Enum
- F-Lab
- 회고
- ngrinder
- Java
- 네이버클라우드
- docker
- Scheduler
- 에프랩
- 네이버 클라우드
- React
- NCP
- NooBLoL
- Thymeleaf
- ncloud
- papago
- OrientalUnity
- navercloud
- Database
- NaverCloudPlatform
- Naver Cloud
- Naver Cloud Platform
- Pinpoint
- spring boot
- DBDocs
- object storage
- mybatis
- spring
- AssertJ
- Today
- Total
DevJong12
[Issue] Embedded-redis의 slf4j 의존성 이슈 본문
개요
프로젝트의 기능 구현 진행을 위해 Redis를 셋팅하면서 문제가 발생하였다. 정확히는 Test의 설정과 관련된 의존성 문제이며, 해결하는 과정을 기록한 포스트이다.
설정 및 테스트 코드
먼저 설정의 경우 아래의 포스트를 참고하였다.
테스트 케이스의 경우에는 작동여부만 판단하기 위해 작성했으며, 아래의 포스트의 케이스를 가져와서 사용하였다.
- 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의 의존성이 문제가 되었다. 해당 오류는 내가 처음이 아닐꺼 좀더 찾아보니...
해당 포스트에서 동일한 오류를 찾을 수 있었다.
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의 의존성이 제거된 것을 볼 수가 있었다.
테스트 결과는? 성공을 했다..오....
꼭 다운그레이드 없이 제거만 해도 괜찮을 것 같다.
'프로젝트 > NoobLoL' 카테고리의 다른 글
[refactor]MyBatis에서의 Enum활용기 (By.boolean) - 1편 (1) | 2022.09.30 |
---|---|
[Issue]Static주소를 입력시 발생하는 No Handler Exception (0) | 2022.09.21 |
[refactor]Integer의 equals와 ==의 차이점 (0) | 2022.09.11 |
[Issue] 회원가입 인증 메일의 방식 수정 (0) | 2022.09.10 |
[Issue] H2사용시 ON DUPLICATE KEY UPDATE 오류사항 (0) | 2022.09.09 |