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
'Troubleshooting' 카테고리의 다른 글
MySQL Pretty Print in Command Line (2) | 2024.02.16 |
---|---|
Gradle로 빌드할 때 JAVA_HOME 따로 지정하기 (0) | 2024.02.14 |
PostgreSQL 선택적 외부 접근 허용 (4) | 2023.12.05 |
java.lang.OutOfMemoryError: Java heap space (2) | 2023.11.30 |
Process ID가 보이지 않는 Process 종료하기 (2) | 2023.11.01 |