일반적인 3-Tier 구조로 웹 애플리케이션을 만든다고 가정할 때,
Controller - Service - Repository 모두에서 입력값 검증(Validation)을 수행할 수 있다. Controller에서 @Valid annotation을 사용한다던지.. 그런 것들 말이다. 그렇게 해도 문제는 없다.
그러나 각 계층에서의 검증 코드는 사실 비슷비슷한데, 그 비슷한 코드들을 모든 계층에 위치시키는 것은
생산성 측면에서 불편하기도 하고, 오류 발생 가능성도 높아진다. 사실 입력값에는 아무 문제가 없는 상황이었는데, 검증 코드 어딘가에서 잘못 작성한 코드가 있어서 오류가 발생한 것임을 알게 된다면 짜증나지 않겠는가?
그리고 비슷한 작업을 모든 계층에서 여러번 수행하니 성능 측면에서도 손해보는 부분이 있을 것이다.
그럼 어디에서 검증하는 것이 제일 적절한건가?
이 질문에 대한 답은 여러 의견이 있을텐데, Controller보다는 Service 계층에서의 Validation을 권장하는 의견이 있다. 이유는 여러 Controller에서 공통의 Service 메소드를 사용하는 경우가 있을 수 있는데, 따라서 입력값을 처음 받는 Controller보다는 해당 비즈니스 로직을 수행하는 Service 내에서 수행하는 것이 좀 더 적합하다는 것이다.
그런데, 사실은 validation을 위한 최적의 장소는 Service 계층보다 Model 생성자 내부다. Model 객체는 어떤 계층에서든 만들어질 수 있고, 모든 계층을 통과할 수 있는 존재다. 따라서 애초에 Model 객체가 만들어질 때 검증 절차를 수행하면, 어떤 계층에서 생성하던지, 어떤 계층으로부터 넘어오던지 신경쓰지 않고 해당 객체를 안전하게 사용할 수 있게 된다.
결론은 Controller - Service - Repository를 넘나드는 객체, 즉 Model 객체의 생성자 부분이야말로 입력값 검증의 최적의 장소라고 할 수 있다. 물론 의견 차이가 있을 수 있는 부분이다.
'Spring Framework' 카테고리의 다른 글
Spring MVC — HandlerMethodArgumentResolver 사용하기 (0) | 2019.05.03 |
---|---|
@Transactional의 noRollbackFor 속성 (0) | 2019.05.02 |
IoC / DI (1) | 2019.03.07 |
Spring MVC 동작원리 / 구성요소 (0) | 2019.03.07 |
Spring Boot / JSP jstl 관련 에러 (An invalid XML character 등) (0) | 2018.11.27 |
댓글