urinaner / sejong-dibb

3 stars 0 forks source link

도커 문제 해결 #110

Closed pillow12360 closed 1 day ago

pillow12360 commented 2 days ago

작업 내용

Pull Request: Docker Compose 설정 개선

변경 사항 요약

MySQL과 Spring Boot 애플리케이션 간의 안정적인 연결을 보장하기 위한 Docker Compose 설정 개선

상세 변경 내용

version: '3'
services:
  db:
    image: mysql:8.0
    container_name: dibb-db-dev
    environment:
      MYSQL_ROOT_PASSWORD: dibb2024
      MYSQL_DATABASE: dibb
    ports:
      - "3307:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./backup.sql:/docker-entrypoint-initdb.d/backup.sql
    networks:
      - dev-network
    # 추가된 healthcheck 설정
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pdibb2024"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  backend:
    container_name: dibb-backend-container-dev
    build: .
    ports:
      - "8082:8080"
    environment:
      SPRING_PROFILES_ACTIVE: docker-dev
      SPRING_DATASOURCE_URL: jdbc:mysql://dibb-db-dev:3306/dibb?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: dibb2024
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
      # 추가된 JPA 설정
      SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: org.hibernate.dialect.MySQLDialect
      SPRING_JPA_SHOW_SQL: "true"
      SPRING_JPA_PROPERTIES_HIBERNATE_FORMAT_SQL: "true"
      SPRING_JPA_DEFER_DATASOURCE_INITIALIZATION: "true"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./src:/app/src
    networks:
      - dev-network
    restart: unless-stopped

networks:
  dev-network:
    driver: bridge

volumes:
  db-data:

주요 변경사항

  1. DB 헬스체크 추가

    • MySQL 서버의 상태를 주기적으로 확인하는 healthcheck 설정 추가
    • 10초 간격으로 체크, 최대 5번 재시도
    • 초기 시작 시 30초의 유예 기간 설정
  2. JPA 설정 개선

    • Hibernate Dialect 명시적 설정
    • SQL 로깅 활성화로 디버깅 용이성 향상
    • 문자 인코딩 UTF-8 설정
  3. 의존성 관리 개선

    • depends_on 조건을 healthcheck 기반으로 변경
    • DB가 완전히 준비된 후에만 백엔드 서비스 시작
  4. 컨테이너 재시작 정책

    • restart: unless-stopped 추가로 장애 시 자동 복구 지원

테스트 완료 사항

스크린샷

컨테이너 (스프링부트, db) 정상 실행 확인

image

Swagger 요청 로직 성공

image

Closes #108

pillow12360 commented 2 days ago

Docker Compose 환경 데이터베이스 동기화 요구사항

개요

현재 Docker Compose 환경의 데이터베이스가 실제 서비스 데이터베이스와 동기화되지 않아 테스트 결과의 정확성이 떨어지는 문제가 발생하고 있습니다.

문제

요구사항

1. 데이터베이스 백업 자동화

2. 최신 백업 파일 로드

3. 데이터 덤프 및 로드 스크립트 제공

기대 효과

pillow12360 commented 1 day ago

도커 db 문제 해결완료

image

Docker & Spring Boot 환경설정 문제 해결

1. 발생한 문제

  1. 테이블 생성 순서 오류

    ERROR 1146 (42S02) at line 1: Table 'dibb.department' doesn't exist
    • 외래키 참조 관계가 있는 테이블들의 데이터 삭제/삽입 순서 오류
    • 자식 테이블이 부모 테이블 참조 불가
  2. Hibernate Dialect 설정 오류

    Unable to determine Dialect without JDBC metadata
    • MySQL 연결 및 Dialect 설정 부재

2. 문제 해결 방법

  1. Docker Compose 설정

    version: '3'
    services:
    db:
    image: mysql:8.0
    container_name: dibb-db-dev
    environment:
      MYSQL_ROOT_PASSWORD: dibb2024
      MYSQL_DATABASE: dibb
    ports:
      - "3307:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./src/main/resources/data.sql:/docker-entrypoint-initdb.d/2-data.sql
    command: 
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
  2. 데이터베이스 초기화 스크립트

    • schema.sql: 테이블 생성
    • data.sql: 데이터 삽입
    • 실행 순서 보장: 파일명 앞에 숫자 prefix 추가
  3. Spring Boot 설정 (application.yml)

    spring:
    datasource:
    url: jdbc:mysql://db:3306/dibb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: root
    password: dibb2024
    driver-class-name: com.mysql.cj.jdbc.Driver
    
    jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    hibernate:
      ddl-auto: none
    defer-datasource-initialization: true
    
    sql:
    init:
      mode: always

3. 테이블 정의 및 데이터 삽입 요구사항

  1. 테스트 데이터 필요성

    • API 엔드포인트 테스트를 위한 기본 데이터 필요
    • 데이터 조회, 수정, 삭제 등의 기능 테스트
    • 외래키 참조 관계 테스트
  2. 개발 환경 일관성

    • 모든 개발자가 동일한 초기 데이터로 작업
    • 테스트 결과의 일관성 보장
    • 코드 리뷰 및 버그 재현 용이
  3. 데이터 구조 문서화

    • 테이블 구조와 관계를 SQL로 명시
    • 실제 데이터 예시를 통한 스키마 이해도 향상
    • 새로운 개발자의 온보딩 용이

4. 실행 및 테스트 방법

# Docker 컨테이너 및 볼륨 제거
docker-compose -f docker-compose-dev.yml down -v

# 새로 빌드 및 실행
docker-compose -f docker-compose-dev.yml up --build

# API 테스트
curl http://localhost:8082/api/board?page=0&size=1&sort=

5. 향후 고려사항

  1. 데이터 마이그레이션 전략

    • Flyway 또는 Liquibase 도입 검토
    • 버전 관리 가능한 마이그레이션 스크립트
  2. 테스트 데이터 관리

    • 환경별 데이터셋 구분 (개발/테스트/운영)
    • 테스트 데이터 생성 자동화 도구 검토
  3. 보안

    • 데이터베이스 접근 제어
    • 민감 정보 암호화
    • 환경변수 관리

이 문서는 추후 비슷한 문제 해결이나 신규 개발자 온보딩에 참고할 수 있도록 보관하시기 바랍니다.