작성
·
22
1
안녕하세요,
24강 수강중에 궁금한점이 생겨 문의 남깁니다.
야믈파일에 설정한 ddl-auto옵션 관련해서 validate로 값을 바꾼 뒤 몇가지 테스트를 해보았습니다.
age필드를 완전히 제거
name필드를 named 명칭으로 변경.
name필드의 column()안에 들어가는 속성값들을 변경.
이렇게 3가지를 해보았는데 실질적으로 테이블과 일치하지 않는다 라며 서버를 실행하지 않는 경우는 2번 name필드가 다른 명칭으로 변경되었을 때 한가지 경우더라구요.
age는 nullable이라 아에 필드가 명시되지 않아도 일치한다고 판단하는걸까요?
column 어노테이션 안에 들어가는 값들은 감지하지 못하는게 맞나요?
답변 2
1
안녕하세요 영욱님! 🙂 좋은 질문 감사드립니다. 결론부터 말씀드리면 validate
과정에서는 JPA에 있는 column을 기준으로 DB에 해당 column이 존재하는지를 확인하고 있습니다. 때문에 꼭 nullable 필드가 아니더라도 DB에 column이 더 많다면 검증 과정에서 애플리케이션 부팅 과정을 중단하지 않을겁니다.
또한 Column
에 들어가는 속성 값 중 type과 같이 조금 중요한(?) 일부 설정은 함께 검증해주는 것으로 알고 있는데 그 외 설정들은 검증하지 않는 경우가 있습니다.
실제 검증 로직은 AbstractSchemaValidator 에서 확인하실 수 있는데요
(table.getColumns 에서 가져오는 column이 JPA Entity의 column입니다. 물리 테이블을 기준으로 비교하고 있지 않죠.)
저는 개인적으로 validate
를 사용하지 않고 직접 DDL 변경을 챙겨주는 편을 선호합니다. 🙂
그 이유는 확인해보신 것처럼 validate
자체가 완벽하지 않을 뿐더러 DB schema를 완벽하게 관려하려면 (비록 MySQL 8.0부터는 유료이지만) flyway라는 툴이 조금 더 나을 수 있기 때문이죠.
flyway보다 직접 DDL 변경을 챙겨주는 것을 선호하는 이유는 flyway를 사용함으로써 flyway 규칙을 따라야만 해서 오히려 유연함이 떨어지는 경우가 종종 있고, 유료 솔루션을 사용하는 것에 대해 조직 단위 설득이 어려운 이유도 있습니다.
이렇게 직접 옵션을 꼼꼼하게 확인해보시다니 대단하시네요~! 😊
또 궁금한 점 있으시면 편하게 질문 남겨주세요. 감사합니다. 🙇
0
안녕하세요, 김영욱님, 인프런 AI 인턴입니다.
ddl-auto
옵션은 JPA에서 Entity 클래스와 데이터베이스 테이블 간의 매핑 상태를 제어하는 중요한 설정입니다.
ddl-auto 옵션의 validate 모드: validate
모드는 JPA 엔티티 정의와 데이터베이스 테이블 간의 스키마 일치를 검증합니다. 즉, 엔티티의 필드가 데이터베이스 테이블의 컬럼과 정확히 일치하는지를 확인하는데 사용되며, 일치하지 않을 경우 애플리케이션이 오류를 발생시키고 서버가 시작되지 않습니다.
각 테스트의 결과 설명:
age 필드를 완전히 제거한 경우: age
필드가 nullable였다면, 데이터베이스 스키마에는 해당 필드가 존재하지 않아도 validate
모드에서 오류를 발생시키지 않을 가능성이 높습니다. 이는 데이터베이스 레벨에서 필드 유무에 대한 검증을 엄격하게 하지 않기 때문일 수 있습니다.
name 필드를 named 명칭으로 변경한 경우: 필드 이름이 변경되면 엔티티와 데이터베이스 간의 매핑이 맞지 않게 되어, validate
모드에서 일치하지 않는 것으로 판단하고 오류를 발생시킵니다.
column 어노테이션 안의 속성값 변경: @Column
어노테이션 내의 속성(예: length, nullable 등)은 이름과 동일한 컬럼 속성을 가진다고 가정합니다. 하지만, ddl-auto=validate
옵션은 필드의 속성 값들보다는 필드 이름과 타입에 주로 맞춰 검증을 수행하기 때문에, 속성들이 변경되었어도 그 자체로 오류를 발생시키지 않는 경우가 많습니다.
관련된 질문과 답변에서 더 자세한 설명을 확인하시려면 아래의 링크를 참고해 주세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
상세한 답변 감사합이다!!😀