프로젝트 개발 당시, 애플리케이션에 필요한 초기 데이터를
수동으로 .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 |