728x90
반응형
SMALL
SMALL

 

우선, 나는 스프링 부트로 만든 애플리케이션을 MySQL과 Docker Compose로 컨테이너를 구동한다. 내 docker-compose.yml 파일은 다음과 같다.

 

version: '3.8'

services:
  app:
    image: 'tbell-mm-backend:latest'
    build: .
    env_file:
      - ".env"
    ports:
      - ${SERVICE_PORT}:${SERVICE_PORT}
    container_name: tbell-mm-backend
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:${MYSQLDB_PORT}/${MYSQLDB_DATABASE}?useSSL=false
      - SPRING_DATASOURCE_USERNAME=${MYSQLDB_USER}
      - SPRING_DATASOURCE_PASSWORD=${MYSQLDB_ROOT_PASSWORD}
      - SPRING_JPA_PROPERTIES.HIBERNATE.DIALECT=org.hibernate.dialect.MySQLDialect
      - SPRING_JPA_HIBERNATE_DDL_AUTO=none
      - TZ=Asia/Seoul
      - _JAVA_OPTIONS=-Xmx15g
    volumes:
      - ./log:/app/log
    networks:
      mm-network:

  db:
    container_name: tbell-mm-mysql
    image: mysql:5.7
    restart: always
    env_file: ./.env
    environment:
      - MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
      - MYSQL_DATABASE=$MYSQLDB_DATABASE
    ports:
      - ${MYSQLDB_PORT}:${MYSQLDB_PORT}
    volumes:
      - mysqldb-volume:/var/lib/mysql
      - ./bak:/var/lib/backup
    networks:
      mm-network:

  backup:
    image: mysql:5.7
    container_name: tbell-mm-mysql-backup
    env_file:
      - ".env"
    depends_on:
      - db
    volumes:
      - ./bak:/var/lib/backup
    command: >
      bash -c "
      while true; do
        sleep 60
        mysqldump -h mysqldb -u$$MYSQLDB_USER -p$$MYSQLDB_ROOT_PASSWORD $$MYSQLDB_DATABASE > /var/lib/backup/$$(date +%Y-%m-%d-%H-%M-%S).sql
        echo ""Backup done at $$(date +%Y-%m-%d_%H:%M:%S)""
        sleep 14400
      done
      "
    environment:
      MYSQLDB_USER: ${MYSQLDB_USER}
      MYSQLDB_ROOT_PASSWORD: ${MYSQLDB_ROOT_PASSWORD}
      MYSQLDB_DATABASE: ${MYSQLDB_DATABASE}
      TZ: Asia/Seoul
    networks:
      mm-network:

volumes:
  mysqldb-volume:

networks:
  mm-network:
    driver: bridge

 

 

위 설정으로 Docker Compose를 실행하면 마주하는 MySQL과 Spring과의 연결 에러가 나타난다. 최초에는 어떤 작업을 해줘야 하냐면 MySQL 유저를 생성하고 내가 연결하려는 데이터베이스에 접근 권한을 허용해야 한다.

 

다음은 모든 외부 접근을 허용하게 하는 유저를 만드는 것이다. 사실 좋은 방법은 아니다. 정확히 어디서 접근할지 판단 후 그 IP만 허용해주는게 더 좋은 방식일 것.

create user 'username'@'%' identified by 'password';

grant all privileges on dbname.* TO 'username'@'%';

flush privileges;

 

이렇게 유저를 만들면 이제 해당 유저를 통해 스프링에서 데이터베이스로 접근할 수 있게 된다.

 

다음은, 가끔 이상한 MySQL 에러가 발생하는데 이러한 에러가 그 경우 중 하나다.

java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='

 

이건 이제 테이블 별로 인코딩이 서로 다르기 때문에 발생하는 에러라고 하는데 이를 해결하는 방법은 인코딩을 설정해주는 것.

SET collation_connection = 'utf8_general_ci';

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

 

마지막 테이블에 적용하는 건 테이블 전체에 해줘야 한다.

728x90
반응형
LIST

+ Recent posts