검증 로직의 위치에 대해 리뷰어님과 논의 하면서 VO를 도입하게 되었다.
나🤦🏻♀️: 하나의 입력에서 검증 해야 하는 것들을 하나의 클래스에서 처리 하는 것이 의미 있다고 생각했다.
But, 이렇게 구현했을 때 유효성을 검증하는 위치가 제각각이라는 문제가 있었다.
예를 들어, Car의 이름들을 입력을 받고 ',' 로 String을 분리하는 과정을 지나 Car의 이름을 저장하게 된다면 split하기 전과 후 둘다 검증 클래스에 의존하게 된다.
의존적이라는 것은 A 클래스에서 B를 생성할 때, A 클래스에서 B 클래스의 메소드를 호출 할 때, A가 B에 의존한다고 한다.
가령, 아래와 같은 상황이다.
class Calculator {
Adder adder = new Adder();
public void calculate(){
adder.add();
}
}
class Adder {
public void add() {
}
}
Calculator 클래스에서 Adder 클래스를 생성하고 add라는 메소드를 호출한다.
add라는 메소드를 호출 할 때, Adder에 메세지를 보낸다 또는 의존한다 라고 말할 수 있는데, add()의 기능은 Calculator에서 수행해야하는 기능이지만 Adder라는 클래스에게 위임을 하여 메소드를 구현한다.
Adder뿐만 아니라 Calculator클래스에서 run메소드를 호출할 때도 부분에서도 수정을 해야한다.
class Calculator {
Adder adder = new Adder();
public void calculate(){
adder.add(1,1);
}
}
class Adder {
public void add(int number1, int number2) {
}
}
바로 나의 코드는 이것이 큰 문제였다.
검증 로직이 추가되거나 삭제되거나 수정된다면, 해당 도메인과 검증 클래스 모두 변경을 해야하므로 SRP에 어긋나게 된다.
유효성 검증에서 가장 중요한 것은 도메인이 불완전한 상태로 생성 및 사용되지 않도록 하는 것이다.
분리해서 객체가 스스로 검증하게 하는 것이 좋지 않을까?🏋️
도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체, 즉 값을 나타내기 위해서 쓰이는 객체
VO는 객체의 불변성을 보장해야한다.
아주 이해가 쏙쏙 되네요!