1. Issue Description
Redis와 Spring Boot를 Docker에 띄워서 구현했던 Refresh Token 기능을 테스트해보려고 했는데, Connection이 거절되었다는 예외가 발생했다.
Caused by: java.net.ConnectException: Connection refused
여러 문제가 있었다.
1. Redis Container는 작동하는데 로컬에서 Redis Container로 DB 연결이 되지 않음
- bind 옵션을 풀어주어야 했다. 기본적으로 외부 접속이 안 되게끔 설정이 되어 있는 것 같았다.
- 도커 Redis 설정 파일 redis.conf 파일을 만들어 bind 0.0.0.0 으로 설정해서 외부 접속을 허용하였다.
2. RedisConfig.Java 파일에서 port를 따로 지정해주지 않은 것
- RedisStandaloneConfiguration에서는 자동으로 port가 6379로 입력되는데 나는 Redis 컨테이너를 6378 포트에서 사용하려고 했다.(로컬 Redis DB와 port가 겹치지 않게 하기 위해)
- 어쩐지 포트를 6378로 지정했는데 localhost:6379로 접속이 안된다고 로그에 찍히더라..
@EnableRedisRepositories
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.port}")
private int redisPort; // port를 지정해주지 않아서 접속이 안되었던 것.
@Value("${spring.data.redis.password}")
private String redisPassword;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
redisConfiguration.setPort(redisPort);
redisConfiguration.setPassword(redisPassword);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisConfiguration);
return lettuceConnectionFactory;
}
}
이 글은 이 외의 다른 문제에 대해 작성했다.
2. 원인 추론
위 문제들까지는 해결했는데 그래도 localhost:6378로의 접속이 되지 않는다고 나왔다. 구글에서 검색해보니 잘 나오질 않았는데 위의 문제들을 다 StackOverFlow에서 해결해서 StackOverFlow에 직접 검색을 해 봐야겠다고 생각했다.
spring redis docker not connect 로 검색을 했더니 꽤 나와 비슷한 글이 많았고, 도커 컨테이너 자체의 IP를 사용하라는 글이 가장 많았다. 하지만 예전에 PostgreSQL을 연결할 때도 도커 컨테이너 자체의 IP를 사용해보려다가 뭐가 잘 안되어서 다른 글을 읽던 와중에 이런 댓글을 읽게 되었다.
😲😲!!! 뭐라고..? localhost가 컨테이너에서 작동하지 않는다고...??
대신 host.docker.internal을 사용해야 한다고..!!
위에서 port 설정을 해주지 않으면 자동으로 6379로 세팅되는 것처럼 host도 마찬가지로 기본적으로 "localhost"로 설정된다. 혹시 해서 RedisConfig에 host 필드를 설정하고 Docker에서의 Redis host 설정을 위와 같이 host.docker.internal로 바꿔주었다.
3. 해결
다음과 같이 RedisConfig를 설정해 주었다.
@EnableRedisRepositories
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String redisHost;
@Value("${spring.data.redis.port}")
private int redisPort;
@Value("${spring.data.redis.password}")
private String redisPassword;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
redisConfiguration.setHostName(redisHost);
redisConfiguration.setPort(redisPort);
redisConfiguration.setPassword(redisPassword);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisConfiguration);
return lettuceConnectionFactory;
}
}
로컬에서는
- host : localhost
- port : 6379
도커에서는
- host : host.docker.internal
- port : 6378
로 호스트와 포트를 설정해 주었다.
4. 결과
다음과 같이 요청결과도 잘 받고 도커 내의 Redis DB에도 해당 Refresh Token이 잘 저장됨을 확인할 수 있었다! Docker Redis 적용 성공~! 🎉🎉
'STUDY > Trouble Shooting' 카테고리의 다른 글
Docker PostgreSQL에서 정렬이 이상하게 되는 문제 (2) | 2024.09.02 |
---|---|
Timestamped ZonedDateTime 오류 (0) | 2024.05.22 |
만료된 토큰에서 토큰에 저장된 정보를 가져올 수 없는 오류 (0) | 2024.05.22 |
Slack Webhook을 이용한 메시지 미리보기가 안되는 오류 (0) | 2024.05.22 |
GraphQL - mutation 실행 시 필드 값이 null로 들어오는 오류 (0) | 2024.04.18 |