반응형

Mssql을 사용하여, 대부분의 로직이 Stored Procedure에 들어있는 상황으로, 웹서버는 게이트웨이 역할로 사용하고, 최대한 자동화가 되도록 구성함. 그러다보니, 클라이언트가 보내는 파라미터 조차도 자동화되어, 바로 DB로 넘어가버렸고, 파라미터 검증 절차가 없으니, 유효하지 않은 파라미터가 와도, 서버단에서 에러코드를 리턴해버리는 게 아니라, 무조건 DB 통신을 하는 것이 문제였음.

(물론, mssql이라도 CRUD만 할 뿐, 로직은 최대한 서버단으로 빼는 게 맞고, 이후 프로젝트부터는 그렇게 진행중)

 

DB통신을 막아보자 하여, 웹에서 검증할 수 있는 코드를 추가함.

 

1. Spring Framework의 Argument Resolver단에서 파라미터를 받아와서, 파싱하여 일일히 비교. (현재 구조가, Argument Resolver를 커스터마이징해서 모든 요청들이 들어올 수 있도록 되어 있는 구조) 

 - 예외상황이 너무나도 많으며, 심지어 검증 코드상에 문제가 있는 경우가 많아서 다른 방법을 찾아보도록 함.

 

2. 그러다보니, javax.validation-api에서 지원하는 Annotation만으로 간단하게 값들을 검증할 수 있는 매우 강력한 라이브러리 발견  

 - Hibernate Validator!! (http://hibernate.org/validator/

 

3. 별다른 고민 없이, 1에서 작성한 코드는 싹 날려버리고, Pojo클래스들을 작성하여 어노테이션들을 적용.

 - 서버에서 라이브러리 로딩도 잘 했고, 서버 Start에 성공했지만, 테스트 결과 fail

 

4. Servlet 설정에서 LocalValidatorFactoryBean을 Bean으로 등록해주고, 해당 validator를 불러와서 validate 메소드를 실행

 - validation에 실패한 개수만큼 Set<ConstraintViolation<T>>형식으로 리턴이 되며, 에러처리 등을 위해서는 size로 비교하니, 원하는대로 동작함.

 

5. @NotNull의 경우 String은 잘되지만, primitive type에서는 동작하지 않음.

 - 정상적인 현상이며, primitive type은 default가 0이기 때문에, Null이 될 수 없으므로, 해당 값의 Null 체크를 위해서는

  int -> Integer, long -> Long 등 과 같이 reference type으로 변경해 주어야 함. 

 

 

성능상에도 큰 문제는 없는 것 같고, 잘 사용중 ㅎㅎ. 파라미터 검증이나 값 검증이 필요한 분들은 도입해보시는걸 추천드립니다. 

반응형

'개발 > JPA, Hibernate' 카테고리의 다른 글

[Hibernate] Custom Validator  (0) 2016.06.11
[Hibernate] ddl-auto  (0) 2016.06.11
[Hibernate] Entity 선언 시 주의점  (0) 2016.06.11
[Spring Data Jpa] limit와 ordering  (1) 2016.06.11
[Spring Data Jpa] custom query 적용  (0) 2016.06.11
,