연수 마지막 주차에 eGov를 사용해 개발하게 되었다.
그 중에 Validation을 걸어야하는 일이 생겼고, 평소에 하던대로 @Valid를 컨트롤러에 걸었는데 작동이 되지 않았다. 이를 해결하기 위해 공부하면서 배운 점들을 정리해보겠다.
eGov 프레임워크는 기본적으로 Apache Commons Validator를 기반으로 하는 XML 기반의 검증 시스템을 사용한다. 이는 마치 검사관이 체크리스트를 들고 각 항목을 하나씩 확인하는 것으로 비유 할 수 있다.
<!-- eGov Validation 설정 예시 -->
<form-validation>
<formset>
<form name="itaComVO">
<field property="coTelno" depends="required,mask">
<arg0 key="연락처"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9]{2,3}[0-9]{3,4}[0-9]{4}$</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
특징:
Spring의 Bean Validation은 JSR-380 표준을 구현한 어노테이션 기반의 검증 시스템이다. 이는 마치 자동화된 센서가 각 지점을 실시간으로 모니터링하는 것과 같다.
public class ItaComVO {
@Pattern(regexp = "^\\d{2,3}\\d{3,4}\\d{4}$",
message = "올바른 전화번호 형식이 아닙니다")
private String coTelno;
@NotBlank(message = "회사명은 필수 입력항목입니다")
private String coNm;
}
특징:
앞서 말한 것 처럼, eGov는 기본적으로 xml을 통한 검증 방식을 설정해놓았고, 스프링의 기본 검증 방식인 Valid에 이 설정이 덮어씌워지면서 아예 작동하지 않는 것이였다.
이를 해결하기 위해서는 추가적인 설정이 필요하다.
먼저 pom.xml에 필요한 의존성을 추가해주어야 한다.
<!-- Bean Validation API -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- Expression Language -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>3.0.3</version>
</dependency>
/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml 파일에 다음 설정을 추가한다.
<!-- Spring MVC에서 @Valid 활성화 -->
<mvc:annotation-driven validator="springValidator"/>
<!-- JSR-303 Validator 설정 -->
<bean id="springValidator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
이제 컨트롤러에서 @Valid를 사용할 수 있다
@Controller
public class ItaComController {
@RequestMapping("/itaCom/insertItaCom.do")
public String insertItaCom(
@Valid @ModelAttribute("itaComVO") ItaComVO itaComVO,
BindingResult bindingResult,
Model model) {
if (bindingResult.hasErrors()) {
return "addressbook/tma/ita/itaCom/ItaComRegister";
}
// 저장 로직
}
}
JSP 페이지에서 검증 오류를 표시하는 방법:
<form:form modelAttribute="itaComVO">
<div>
<label>연락처</label>
<form:input path="coTelno"/>
<form:errors path="coTelno" cssClass="error"/>
</div>
</form:form>
eGov 프레임워크에서는 내가 커스터마이징을 해주어야 두 가지 검증 방식을 함께 사용할 수 있다.
@Controller
public class ItaComController {
@Autowired
private DefaultBeanValidator beanValidator; // eGov validator
public String insertItaCom(
@Valid @ModelAttribute("itaComVO") ItaComVO itaComVO, // Spring validation
BindingResult bindingResult) {
// Spring @Valid 검증
if (bindingResult.hasErrors()) {
return "error-view";
}
// 추가로 eGov 검증도 수행 가능
beanValidator.validate(itaComVO, bindingResult);
if (bindingResult.hasErrors()) {
return "error-view";
}
// 검증 통과 후 처리
return "success-view";
}
}
새로운 기능 개발 시에는 @Valid 사용을 권장
레거시 시스템 유지보수 시에는 기존 방식 유지
두 방식을 혼용할 경우 명확한 기준 설정
이러한 장단점이 존재하지만, 결국 SI는 프로젝트에서 정해진 기술 또는 전년도 사업에 쓰던 기술을 써야한다.(그래서 레거시 한듯)
실무에서 @Valid써보는 날이 오기를 .................