본문 바로가기

마주쳤던 이슈 기록

#1. 초기 SQL 파일 - duplicate Error

프로젝트 개발 당시, 애플리케이션에 필요한 초기 데이터를
수동으로 .sql 파일로 생성하여 MySQL의 DB에 넣도록 작업을 진행했었다.
이 과정에서 생성해둔 초기 데이터 .sql 들을 MySQL과 연동 할 때 duplicate Error 발생. 
이 Error를 해결했던 과정에 대해 정리를 하고자 한다.

[원인]

Spring Boot를 최초 실행 시, application.yml에 설정해둔 대로
생성해둔 .sql 파일들이 연동된 MySQL의 DB에 자동으로 기입되지만
재실행 할 경우,
최초 실행 당시 DB에 기입된 데이터가 남아있는데 application.yml에 설정에 의해
동일한 .sql 파일들을 MySQL DB에 또 넣으려고 하기 때문에 중복 에러 발생.


[해결]
최초 실행, 두번째 실행, 세번째 실행에 application.yml 설정을 달리하여
단계별로 테이블만 생성, 테이블 column 값 생성, 생성된 테이블, column 유지 로 나누어서 DB 관리.

1.application.yml에서
ddl-auto : create // 빈 테이블 생성
sql.init.mode:never // 테이블의 Value 비운채로 생성.
테이블 만들고 내용은 다 밀어준다.

spring:
  datasource:
    url: jdbc:mysql://main001.ctmvpylzede6.ap-northeast-2.rds.amazonaws.com:23306/main001
    username: david
    password: 001mainproject
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: create
#      ddl-auto: update
#      ddl-auto: none
    show-sql: true
    properties:
      hibernate:
        format_sql: true
#        hbm2ddl:
#          import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
#    open-in-view: false
  sql:
    init:
#      mode: always
      mode: never
#      mode: embedded
      encoding: UTF-8
      separator: ";"
      data-locations: classpath:/db/*

2. ddl-auto : update or none // 테이블에 변경사항이 있을 경우만 수정 or 건들지 않음
sql.init.mode:always // 1번에서 생성해둔 빈 테이블에 value들을 채운다.

spring:
  datasource:
    url: jdbc:mysql://main001.ctmvpylzede6.ap-northeast-2.rds.amazonaws.com:23306/main001
    username: david
    password: 001mainproject
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
#      ddl-auto: create
      ddl-auto: update
#      ddl-auto: none
    show-sql: true
    properties:
      hibernate:
        format_sql: true
#        hbm2ddl:
#          import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
#    open-in-view: false
  sql:
    init:
      mode: always
#      mode: never
#      mode: embedded
      encoding: UTF-8
      separator: ";"
      data-locations: classpath:/db/*

3.
ddl-auto : none // 테이블 관련 건들지 않음
sql.init.mode:never // 컬럼 값 건들지 않음.
채워진 데이터의 value들(초기 데이터 적용은) 이제는 건들 필요가 없기 때문에 이대로 유지.

spring:
  datasource:
    url: jdbc:mysql://main001.ctmvpylzede6.ap-northeast-2.rds.amazonaws.com:23306/main001
    username: david
    password: 001mainproject
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
#      ddl-auto: create
#      ddl-auto: update
      ddl-auto: none
    show-sql: true
    properties:
      hibernate:
        format_sql: true
#        hbm2ddl:
#          import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
#    open-in-view: false
  sql:
    init:
#      mode: always
      mode: never
#      mode: embedded
      encoding: UTF-8
      separator: ";"
      data-locations: classpath:/db/*

'마주쳤던 이슈 기록' 카테고리의 다른 글

#3. Spring Security 순환 참조 에러  (0) 2023.05.01
#2. OAuth2 구현시 CORS 에러  (0) 2023.05.01
제네릭 Integer vs Int 차이  (0) 2022.11.22
생성자  (0) 2022.11.22
더블콜론  (0) 2022.11.22