본문 바로가기

Various Error

[Redis] java.net.UnknownHostException

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