Root Project의 docker-compose.yml
version: '3.8'
services:
redis:
image: redis:latest
container_name: redis-container
ports:
- 6379:6379
volumes:
- redis-data:/var/lib/redis
restart: always
volumes:
redis-data:
member-service 모듈의 application.yml
server:
port: 8081
spring:
application:
name: member-service
# Redis
data:
redis:
host: redis
port: 6379
모놀리식에서 제대로 동작했던 Redis가 MSA 구현을 위해 멀티모듈로 찢고 나서 갑자기 다음과 같은 에러가 발생
java.net.UnknownHostException: 알려진 호스트가 없습니다 (redis) at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na] at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933) ~[na:na] at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1543) ~[na:na] at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:852) ~[na:na] at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1532) ~[na:na] at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1384) ~[na:na] at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1305) ~[na:na] at java.base/java.net.InetAddress.getByName(InetAddress.java:1255) ~[na:na] at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:156) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:153) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) ~[na:na] at io.netty.util.internal.SocketUtils.addressByName(SocketUtils.java:153) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.DefaultNameResolver.doResolve(DefaultNameResolver.java:41) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:61) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:53) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:55) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:31) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:106) ~[netty-resolver-4.1.111.Final.jar:4.1.111.Final] at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:220) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:47) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:988) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:515) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:428) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:485) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.111.Final.jar:4.1.111.Final] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
구글링을 해도 마땅한 이유를 찾지 못하였고, ChatGPT, Claude에 물어보면 다른 네트워크이기 때문이라고 함
1. spring.data.redis.host를 redis → redis-container로 변경 : 실패
server:
port: 8081
spring:
application:
name: member-service
# Redis
data:
redis:
host: redis-container
port: 6379
2. spring.data.redis.host를 redis → localhost로 변경 : 실패
server:
port: 8081
spring:
application:
name: member-service
# Redis
data:
redis:
host: localhost
port: 6379
- 에러가 해결되고 정상적으로 동작하였으나 Redis에 정상적으로 저장되지 않음
3. Local 컴퓨터의 Redis 삭제 : 성공
- 원인 : docker의 redis가 아니라 내 local 컴퓨터의 redis에 저장이 되었기 때문
- 해결 : 로컬 redis를 삭제하고 나니 docker redis에 정상 저장
- 의문 : 다른 사람들은 로컬에 Redis를 깔면 docker-compose.yml의 port 설정인 6379:6379에서 충돌이 나기 때문에 로컬 포트를 다른 걸로 바꿔서 6479:6379처럼 해주어야 했다고 하는데, 왜 정상적으로 실행이 됐는지 알 수 가 없음
결론 : Root Project와 member-service는 다른 네트워크
- 기존에 모놀리식으로 진행을 했을 때는 같은 네트워크 였기 때문에 application.yml에서 'spring.data.redis.host=redis'라고 하여도 docker-compose.yml에 있는 service 이름(redis)과 연결? 맵핑?이 잘 되었음
- 하지만, MSA를 위해 멀티 모듈로 나누면서 Root Project와 member-service는 다른 네트워크가 되었기 때문에 ChatGPT나 Claude가 제안한 아래의 방법처럼 docker-compse.yml에서 하나로 묶어주어야 하는 것 같음
version: '3.8'
services:
redis:
image: redis:latest
container_name: redis-container
ports:
- 6379:6379
volumes:
- redis-data:/var/lib/redis
labels:
- "name=redis"
- "mode=standalone"
restart: always
networks:
- app-network
member-service:
build:
context: ./member-service
dockerfile: Dockerfile
container_name: member-service-container
ports:
- 8081:8081
depends_on:
- redis
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
redis-data:
728x90
'Various Error' 카테고리의 다른 글
[IntelliJ] 인텔리제이 기본 패키지 인식 불가 에러 (0) | 2024.09.10 |
---|---|
[JSON Serialize] HttpMediaTypeNotAcceptableException (0) | 2024.09.02 |
[HMAC-SHA] WeakKeyException (0) | 2024.08.27 |
[Spring Cloud/API Gateway] Spring Reactive Web (0) | 2024.08.27 |
[IntelliJ / FeignClient] 의존성 추가 후 어노테이션 인식 불가 (0) | 2024.08.22 |