# [Docker] Spring boot, mySQL, redis 컨테이너 동시에 띄우기

2024. 12. 13. 15:01개발/Docker

🌞 2024.12.13 Fri

본 포스팅은 SpringBoot, mysql, redis 를 동시에 적용해 도커 컨테이너 생성하는 내용을 다룹니다.

세가지 이미지를 동시에 띄워서 해보자.

1. Spring dependency 에 redis 의존성 추가

1.1 <build.gradle> 추가 (gradle)

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

1.2 <pom.xml> 추가 (maven)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

1.3 application.yml(gradle) setting (JDBC)

# 📝 < application.yml>
spring:
  datasource:
    url: jdbc:mysql://my-db:3306/mydb
    username: root
    password: qwer1234
    driver-class-name: com.mysql.cj.jdbc.Driver
  data:
    redis:
      host: my-cache-server
      port: 6379

1.3 application.yml(Maven) setting (JDBC)

# 📝📝📝<application.properties> 📝📝📝
  spring.mvc.view.prefix=/WEB-INF/views/
  spring.mvc.view.suffix =.jsp
  spring.mvc.static-path-pattern=/resources/**
  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  spring.datasource.url=jdbc:mysql://my-db:3306/apple_store?serverTimezone=Asia/Seoul&autoReconnect=true&useSSL=false
  spring.datasource.username=root
  spring.datasource.password=qwer1234
  productimage.upload.directory=src/main/resources/static/image

** host localhost 가 아니라 compose 에 있는 service 이름 임.

1.4 Redis config 생성. 및 Main controller 에서 wiring

// < RedisConfig.java>
  @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;
    }
  }

** Eclipse 로 코드 복사 할때 cmd shift o 를 누르면 알아서 임포트 를 자동완성해줌.
** 맨위에 해당 파일 임포트는 삭제하면 에러가 남.

// < AppController.java>
@RestController
public class AppController {

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;

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

1.5 Compose file 에서 health 체크 추가

#- <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