본문 바로가기

Back-End/Docker

SpringBoot, MySQL, Redis 컨테이너 동시에 띄우기

저번 SpringBoot와 MySQL 동시에 연결하기에서 이어지는 상태입니다.

1. Spring Boot 프로젝트에 Redis 연결 코드 추가하기

# build.gradle

...

dependencies {
	...
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
# application.yml

spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  data:
    redis:
      host: localhost
      port: 6379
#RedisConfig

@Configuration
public class RedisConfig {

  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
  }
}
# AppController

@RestController
public class AppController {

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;

  @GetMapping("/")
  public String home() {
    redisTemplate.opsForValue().set("abc", "def");
    return "Hello, World!";
  }
}

 

compose.yml

services:
  my-server:
    build: .
    ports:
      - 8080:8080
    depends_on:
      my-db:
        condition: service_healthy
      my-cache-server:
        condition: service_healthy  
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - 3306:3306
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping" ]
      interval: 5s
      retries: 10
  my-cache-server:
    image: redis
    ports:
      - 6379:6379
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 5s
      retries: 10

2. Docker 컨테이너 띄워보기

$ ./gradlew clean build
$ docker compose down
$ docker compose up --build -d

위 명령어로 실행하면 에러가 발생한다. Connection refused 에러가 발생한 이유는 Redis와 연결이 잘 안 됐기 때문이다. 왜 안됐는 지 application.yml 파일을 다시 한 번 살펴보자. 

# application.yml

spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb
    username: root
    password: pwd1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  data:
    redis:
      host: localhost # 이걸 이제 쓰면 안됨
      host: my-cache-server
      port: 6379

각 컨테이너는 각자의 네트워크를 가지고 있기 때문에 localhost가 아니라 Redis가 실행되고 있는 컨테이너로 통신을 해야 한다. Redis가 실행되고 있는 컨테이너 주소는 service 이름으로 푠현한다고 했다. compose.yml에서 Redis가 실행되고 있는 컨테이너의 service 이름을 my-cache-server 라고 이름을 붙였다.

$ ./gradlew clean build
$ docker compose down
$ docker compose up --build -d

위와 같이 코드를 수정한 뒤에 다시 실행시키면 실행이 잘 될 것이다.