2016-06-10 1 views
2

프로젝트에서 Spring 데이터 및 Bean 유효성 검사와 함께 Spring Boot (1.3.3.RELEASE)를 사용하고 있으며 예상치 못한 (적어도 저에게) 동작을 발견했습니다. User 엔티티와 UserRepository (JpaRepository를 확장 한 인터페이스)가 있습니다. 나는이 같은 전화 걸 때 : 새와 잘못된 사용자에스프링 데이터 JPA 저장 방법이 왜 즉시 검증되지 않았습니까?

userRepository.save(user); 
logger.info("User saved with id", user.getId()); 

를 로거가 호출 사용자가 ID를받은 것을 알 수있다. 아무 것도 지속되지 않고 로깅 후 끝에 ConstraintViolationException이 throw됩니다.

하지만로 변경하는 경우 :

userRepository.saveAndFlush(user); 
logger.info("User saved with id", user.getId()); 

ConstraintViolationException 바로 발생하고 로거 라인에 도달하지 없구요.

로거 전에 예외가 발생하는 두 번째 동작은 userRepository.save() 메서드를 호출 할 때 발생해야하는 것이라고 생각합니다.

무엇이 잘못 되었나요? 내 프로젝트에 대해 뭔가? 아니면 콩 유효성 검사가 작동하는 방법에 대한 내 이해?

답변

2

데이터 액세스 계층 내에서 유효성 검사를 트리거하는 것은 나쁜 디자인이며 근본적으로 나쁜 아이디어라고 주장합니다. 그렇게하는 것은 기본적으로 인스턴스를 저장하고 (결국 실패) 인스턴스를 깨뜨린 (잘못된 상태에서) 모든 코드가 항상 깨져 있음을 의미합니다. 그것이 중간 비즈니스 로직을 실패하게 만들지 않았다면, 손가락이 엇갈 렸습니다!

이 접근법은 일반적으로 매우 유용합니다. 간단한 CRUD 시나리오는 기본적으로 중개가 없으므로 실패 할 수 있습니다. 필드는 null이지만 등으로해서는 안됩니다. 그러나 그 오류들 사이에 논리를 추가하기 시작하면 (예 : 전자 메일 주소가 올바른 형식이 될 것으로 기대하는 등의) 논리가 깨지게됩니다. .

차라리 당신이 기본적으로 검증 누락 발견 할 수 있도록 근본적으로되는 예외가 잘못된 상태로 점점 사용자 입력이 수신되는 경우에 매우 가까운 매핑 레이어를 추가에서 개체를 방지하는 강력한 도메인 모델을 구축하는 것이 좋습니다 것 매핑 단계에서 발생합니다.

잠재적으로 오염 된 사용자 데이터를 허용하는 계층에서 JSR-303을 사용할 수 있습니다. 그러나 그것은 확실히 당신이 당신의 도메인 모델에서 사용해서는 안되는 것입니다.

1

플러시 전략과 ID 생성기에 따라 DB에 실제로 삽입 될 수 있습니다 (경우에 따라 달라질 수 있음). 그리고 Hibernate의 경우 삽입/업데이트/삭제 (귀하의 경우 연기가 연기 됨) 직전에 유효성을 검사합니다. BeanValidationEventListener 및 해당 방법 onPreInsert(), onPreUpdate()onPreDelete()의 출처를 참조하십시오.

관련 문제