본문 바로가기
SPRING

Validator 클래스에서 Service객체 의존성 주입 방법

by J데빌 2020. 6. 29.

Validator클래스를 통해 유효성 검사를 할 경우 데이터베이스(디비) 접근을 통해 값을 비교해야 되는 경우가 있다. 이런 경우 커스텀 어노테이션을 통해 ConstraintValidator인터페이스를 구현하여 VO객체에 특정 변수 또는 클래스에 직접 선언하여 유효성 검사하는 방법도 있지만 Validator에서 직접 Service클래스를 의존성 주입을 하여 디비에 접근 후 유효성 검사를 하는 방법도 있다. 하지만 필드 주입으로 의존성 주입을 하면 Service클래스에서 java.lang.NullPointerException 에러를 반환하면서 동작이 제대로 되지 않는다. 그래서 생성자 주입을 이용하면 정상적으로 동작하는 것을 볼 수 있다.

controller클래스

@Resource(name = "homeService")
private HomeService homeService;

@RequestMapping(value = "/form/process", method = RequestMethod.POST)
public String formProcess(@Valid HomeVO homeVO, BindingResult bindingResult) throws Exception {
	new MgmtBbsConfigValidator(homeService).validate(homeVO, bindingResult);
	if (bindingResult.hasErrors()) {
		return "form";
	}
	return "redirect:/";
}

Validator클래스

public class HomeValidator implements Validator {

	private final HomeServcie homeServcie;
	public HomeValidator(HomeServcie homeServcie) {
		this.homeServcie = homeServcie;
	}
	
	@Override
	public boolean supports(Class<?> clazz) {
		return HomeVO.class.isAssignableFrom(clazz);
	}
	
	@Override
	public void validate(Object target, Errors errors) {
		
		HomeVO homeVO = (HomeVO) target;
        	
		if (homeServcie.isExistId(homeVO.getId())) {
			errors.rejectValue("id", "중복오류", "이미 존재하는 아이디입니다.");
		}
	}
}

 

댓글