Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

사적인 블로그

[ISSUE] Grails dbCreate 속성 - create, create-drop, update, validate, none 본문

Troble Shooting

[ISSUE] Grails dbCreate 속성 - create, create-drop, update, validate, none

DevYeri 2024. 12. 31. 13:49

이슈

DataSource.groovy에 들어있는 dbCreate 속성값에 대해 알아보자.

안알아봤다가 도메인에서만 컬럼을 추가하고 실행시켰는데

HibernateException: Missing column: description in db.table_name

 

이라는 에러를 만났다.

constraints값도 넣고, mapping도 했는데 머가 문제니!했더니

 

원인

DataSource.dbCreate 에 명시된 DB관리 옵션에서 수정된 도메인 값을 리얼 DB에서도 변경시키는 권한이 없는 문제였다.

(기존에는 DataSource.dbCreate 옵션으로 update를 사용했기에 문제가 없었다가, 변경하면서 발견됨)

environments {
    development {
        dataSource {
	        dbCreate = validate
            ...
       	}
    }
}

 

해결

내 경우 dbCreate 속성validate로 되어있어 데이터베이스 스키마를 변경하지 않고, 도메인 클래스 정의와 데이터베이스의 일관성을 확인하여 성실하게 달라!다르다고!하며 에러를 뱉어준건데

DB에 직접 컬럼을 alter문으로 추가하며 일치시켜줘서 문제가 해결되었다.

 


지식

dbCreate 주요 옵션

  1. create
    • 애플리케이션이 실행될 때 기존 데이터베이스를 삭제하고, 도메인 클래스에 따라 새 스키마를 생성
    • 기존 데이터 모두 삭제
    • 사용 사례: 초기 개발 단계나 테스트용으로 적합
  2. create-drop
    • 애플리케이션이 실행될 때 스키마를 생성, 애플리케이션이 종료되면 스키마를 삭제
    • 기존 데이터는 모두 삭제됨
    • 사용 사례: 단위 테스트나 일회성 실행을 위해 적합
  3. update
    • 도메인 클래스와 비교하여 데이터베이스 스키마를 자동으로 변경
    • 기존 데이터는 유지되지만, 복잡한 변경(예: 열 이름 변경 등)은 처리되지 않을 수 있음
    • 사용 사례: 개발 단계에서 유용하지만, 프로덕션 환경에서는 권장되지 않음.
  4. validate
    • 데이터베이스 스키마를 변경하지 않고, 도메인 클래스 정의와 데이터베이스의 일관성을 확인
    • 일치하지 않을 경우 오류를 발생
    • 사용 사례: 프로덕션 환경에서 데이터베이스와 도메인 간 일관성을 보장하기 위해 사용.
  5. none
    • 데이터베이스 스키마를 변경하거나 검증하지 않음
    • 사용 사례: 데이터베이스 스키마가 수동으로 관리되는 경우.

  • 개발 환경: create, create-drop, update를 주로 사용.
  • 프로덕션 환경: validate 또는 none을 권장.