Recent Posts
Recent Comments
Adsense
Archives
Visitor
Today
Total
관리 메뉴

Annotation

전자정부프레임워크 데이터 유효성 검증 (Spring Validation) 본문

Java

전자정부프레임워크 데이터 유효성 검증 (Spring Validation)

devs 2017. 8. 24. 11:43


전자정부프레임워크 데이터 유효성 검증 (Spring Validation)


매우 오랫만에 포스팅을 합니다.

그동안 일도 하고 배스 낚시에 빠져서 블로그는 관심도 없었네요..^^;

간만에 포스팅을 해야겠다 싶어서 글을 써봅니다.

이번 주제는 데이터 유효성 검증 (Validation) 입니다.

여러가지 단어를 사용 할 수 있겠지요?

파라미터 검증, 데이터 검증 등..

저는 데이터 검증이라는 단어를 사용하겠습니다.

Bean 검증의 등장! JSR-303

예전에 스프링을 사용하기 전에는 객체 검증이 쉽지 않았습니다.

손이 많이 가고, 조건문이 꽤나 많이 들어갔었지요.

예를 들자면 사용자 계정, 이름을 전달 받는 가정하에 다음과 같이 코딩하였습니다.

String userId = request.getParameter("userId");
String userNm = request.getParameter("userNm");

if(userId == null || "".equals(userId)){
	...적절한 예외 처리...
}

보시는 것 처럼 클라이언트에게 전달 받은 파라미터를 조건문을 통하여 검증하였습니다.

그리고 자바 스펙 요구서(Java Specification Request > JSR) 303번.

Bean Validation의 등장으로 객체 검증은 더이상 귀찮고 불편한 작업이 아니게 되었습니다.

하단부에 자세히 말씀드리겠지만 검증 절차를 간단히 설명드리면 다음과 같습니다.

클라이언트 요청 > 컨트롤러 진입 > 객체 검증 > 검증 결과 확인

상당히 간단하고 실제 코드를 보시면 더욱 간결함을 느끼실 겁니다.

1. 의존성 라이브러리 추가 (pom.xml)

스프링의 모든 시작과 끝은 설정이죠^^;

데이터 검증에 사용되는 어노테이션은 매우 다양합니다.

자바 기본패키지에도 포함되어 있고, 스프링, 하이버네이트에서 제작된 어노테이션들이 존재합니다.


    javax.validation
    validation-api
    1.1.0.Final


    org.hibernate
    hibernate-validator
    5.2.2.Final

이렇게 두가지 라이브러리를 추가해 줍니다.

2. 유효성 검증을 담당해줄 빈 등록

이제 유효성을 검증해주는 역활을 해줄 빈을 적절한 위치에 등록합니다.



	


 <-- 이 구문은 버그입니다. 무시해주세요 :(

이렇게 빈을 등록하시고 driven을 통하여 어노테이션 사용을 활성화 합니다.

3. Vo 내부 필드에 어노테이션 등록

이제 Vo 내부에 존재하는 필드에 어노테이션을 등록합니다.

간단하게 위에 예시 들었던 두가지 필드를 사용하겠습니다.

public class UserVo {

	@NotNull(message="아이디를 입력해 주세요.")
	@NotEmpty(message="아이디를 입력해 주세요.")
	@Size(min=5, max=30, message="아이디는 5자 이상, 30자 이하로 입력해주세요.")
	private String userId;

	@NotNull(message="사용자명을 입력해 주세요.")
	@NotEmpty(message="사용자명을 입력해 주세요.")
	@Size(min=1, max=30, message="사용자명은 최대 30자까지 입력 할 수 있습니다.")
	private String userNm;

	...Getter, Setter...
}

위에서 사용된 어노테이션은 세가지며 간략한 설명은 다음과 같습니다.

@NotNull > Null을 허용하지 않습니다.

@NotEmpty > 공백을 허용하지 않습니다.

@Size > 길이를 설정 합니다.

공통으로 들어가는 message 프로퍼티는 검증방식에 어긋날 경우 리턴해줄 문구입니다.

검증방식에 대한 어노테이션은 다시한번 자세하게 포스팅하겠습니다.

4. 컨트롤러에서 검증 설정

이제 마지막 단계 입니다.

1, 2, 3번의 설정을 통하여 기본 환경을 설정했다면

이제 실제로 검증을 해볼 단계입니다.

@Controller
public class UserController {

	@Resource
	private Validator validator;

	@InitBinder
	private void initBinder(WebDataBinder binder){
		binder.setValidator(this.validator);
	}

	@RequestMapping(value = "/edit.json")
	public void edit(Model model, @ModelAttribute @Valid UserVo param, BindingResult br) throws Exception {
		String msg = null;

		if(br.hasErrors()){
		    List errors = br.getFieldErrors();
		    for(FieldError error : errors){
		    	msg = error.getDefaultMessage();
		    }
		}
		
		...결과 참고하여 적절한 후처리...

	}
}
 <-- 이 구문은 버그입니다. 무시해주세요 :(

먼저 5번 라인처럼 Validator 빈을 의존성 주입합니다.

그리고 8번 라인과 같이 바인더를 설정합니다.

(InitBinder는 필수 사항이 아닙니다. 바인더에 대한 설명은 이번 주제와 다르므로 다른 포스팅에 하겠습니다 ^^;)

마지막으로 핵심부분인 13번 라인 @Valid 부분입니다.

기존에 @ModelAttribute 를 통하여 Bean에 데이터 바인딩을 하셨을 텐데,

@Valid 를 추가하여 데이터를 검증하겠다는 의미가 부여됩니다.

그리고 생소하신 BindingResult 객체는 검증 결과를 알려주는 객체입니다.

컨트롤러의 핵심 내용을 정리해보면 다음과 같습니다.


1. @Valid 어노테이션을 추가하여 Bean 유효성 검증하도록 설정

2. BindingResult 객체의 .hasErrors()를 통하여 문제가 있을 경우 Vo에 설정한 message 프로퍼티 추출

3. 적절한 후처리


저의 경우 form 필드를 거의 사용하지 않습니다.

GIS 특성상 페이지 이동이 거의 없기 때문에..

ajax를 통하여 비동기 통신을 하기 때문에 유효성 검증에 실패 할 경우 해당 메시지만 json 으로 응답합니다.

5. 마치며

생소하여 어렵게 느껴지실 수 있겠지만 사실 핵심은 설정이 끝입니다. ^^;

라이브러리 설정, 의존성 주입, 검증방식 설정, 검증결과 도출..

만약 Bean 검증 방식을 사용하지 않는다면 또 예전 처럼 반복작업을 하겠지요.

예전에 서블릿 필터를 통하여 객체 검증을 한번 시도해보려는 생각을 할때 쯤 스프링을 시작했습니다.

방대한 설정과 생소한 코드 모양에 적응이 쉽지는 않았지만,

어느정도 적응 되고 나서는 정말 편하다고 느껴졌습니다.


이번 포스팅으로 많은 개발자 분들께 도움이 되면 좋겠습니다.

긴글 읽어주셔서 감사드리고

지적, 질문글은 언제든지 환영합니다.

감사합니다.



Comments