입력값 검증을 InputView에서 할까? VS Domain에서 할까?

2024. 1. 11. 12:17우아한테크코스/프리코스

결론 : 비기능적 요구사항은 InputView에서 진행한다. 기능적 요구사항은 Domain에서 진행한다.

  • 비기능적 요구사항은 빈값, 숫자인지여부 등을 의미한다.
  • 기능적 요구사항은 해당 객체 생성 후 중복되는 값이 있는지 등을 의미한다.

1차 시도 : 숫자야구부터 크리스마스 프로모션까지 입력을 받자마자 domain클래스에서 객체 생성 전에 validate메소드를 실행한 후, 객체를 생성하도록 하였다. 이러다 보니, 특정 domain클래스에 SRP원칙(단일 책임 원칙)을 적용하지 못하는 일이 발생하였다. 특정 domain클래스에 너무 많은 기능이 작성되는 문제가 발생하였다.

  • domain에서 validate를 작성함 → SRP원칙을 준수하지 못함.

2차 시도 : 우아한 형제들 기술 블로그 (정상 어드민 시스템) 글을 참조하여 자동차 경주 미션(2차) 때 wrapper클래스를 이용하였다. 이후 로또(2차) 때도 wrapper클래스를 이용하려 하였으나, 멤버변수마다 wrapper를 생성하게 되어, 많은 클래스가 생겨버리는 단점과 클래스마다 제대로 된 네이밍을 하기가 어려워졌다.

  • wrapper를 이용하여 wrapper클래스에 validate를 작성함 → 멤버변수마다 wrapping하였기때문에 많은 클래스의 생성 및 제대로 된 클래스 네이밍을 하기 어려워짐.

3차 시도 : 로또(2차)때 view패키지에 validator패키지를 생성 후 비기능적 요구사항은 공통검증(Validator), 자식검증(XXValidator)를 생성하니, 위 문제들을 해결할 수 있었다.