JPA hibernate 설정

inzZoo·2023년 3월 26일
0

졸업프로젝트공부

목록 보기
2/3

졸업프로젝트를 진행하면서 공부한 내용 정리!



🤔 데이터베이스 스키마 설정

hibernate.ddl-auto 속성

  • create : 실행될 때 기존 테이블을 삭제 + 새로 생성 (DROP + CREATE)

  • create-drop : CREATE 속성에 어플리케이션을 종료할 때 생성한 DDL을 제거하는 옵션 추가 (DROP + CREATE + DROP)

  • update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정

  • validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음

  • none : 자동 생성 기능을 사용X

🚨 주의할 점
개발 초기 : create, create-drop, update
배포/운영 : validate, none

개발 초기에는 테이블 매핑관계가 자주 바뀔 수도 있고 만약 테스트 데이터가 쌓이는 것을 보기 싫다면 create, create-drop을 쓰는 것이 좋다. (나도 그랬다ㅎ)
하지만 예를 들어, 유저 한 명을 저장해놓고 그에 관한 기능들을 테스트하고 싶을 때는 update를 사용해도 좋다!
하지만 배포/운영 단계에서는 무조건 validate혹은 none을 사용해야 한다! 왜냐하면 다른 옵션들은 엔티티 간의 매핑 관계를 바꿀 수도 있는 옵션이고 테이블이 날라갈 수도 있는 옵션이기 때문에 테이블 간 매핑 관계만 비교하는 validatenone을 사용해야 한다.


여담으로, jpa를 사용해서 개발할 때 create나 create-drop 옵션을 사용해서 개발한다면 FK때문에 테이블이 drop될 때 오류를 뱉으면서 데이터가 테이블이 drop되지 않을 수도 있다!
Error executing DDL "alter table pet drop foreign key~"

위와 같은 오류가 뜨면서 제대로 drop되지 않을 수도 있다.
그럴 때는 ddl-auto속성을 update로 바꿔주면 해당 오류가 뜨지 않는다.
하지만 위에서 얘기한 대로 update의 경우에는 테이블에 저장되었던 데이터들을 지워주지 않으므로 테이블에 저장된 데이터를 지우고 싶거나 createcreate-drop속성을 개발하는 동안에는 유지하고 싶다면

set foreign_key_checks = 0;
drop table pet;
truncate pet;
set foreign_key_checks = 1;

foreign_key_checks속성을 잠시 풀어줘서 FK설정을 풀고 테이블을 drop하거나 truncate로 테이블의 데이터를 밀어버리고 다시 foreign_key_checks속성을 설정해주면 된다!
(createcreate-drop옵션은 테이블을 다시 생성해주니까 굳이 다시 foreign_key_checks속성을 설정 안 해도 괜찮다ㅎ)



참고자료

jpa hibernate의 ddl 자동생성 옵션과 초기화 전략 그리고 Error DDL 해결 방법
[JPA] Hibernate 엔티티(Entity) 매핑하기
[Error] TransientPropertyValueException: object references an unsaved transient

profile
달리는 두치~뿌꾸뿌꾸 빵빵

0개의 댓글