유효성 검증을 위한 VO도입

주리링·2022년 2월 18일
0

우테코 생존기

목록 보기
1/17
post-thumbnail

검증 로직의 위치에 대해 리뷰어님과 논의 하면서 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라는 클래스에게 위임을 하여 메소드를 구현한다.

이 상황에서 class Adder의 run 메소드의 매개변수가 생긴다면 어떻게 될까?

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에 어긋나게 된다.


🙋🏻‍♀️ 이 때 Car class에 name에 대한 검증 로직을 넣는 것이 맞을까?

유효성 검증에서 가장 중요한 것은 도메인이 불완전한 상태로 생성 및 사용되지 않도록 하는 것이다.

그런데 검증 해야 하는 부분이 필드에 있다면? 심지어 여러개 라면?

분리해서 객체가 스스로 검증하게 하는 것이 좋지 않을까?🏋️

그래서 도입했다 VO!

VO(Value Object)

VO란?

도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체, 즉 값을 나타내기 위해서 쓰이는 객체

VO는 객체의 불변성을 보장해야한다.

  • equals & hash code 메서드를 재정의 해야한다.
    • 값을 나타내기 위해서만 사용하므로 내부의 상태가 같다면 같은 값이여야한다.
  • setter가 없어야한다.
    • VO의 존재이유는 값을 나타내기 위해서인데, 값이 계속 변한다면 이는 무의미하다.
    참고참고
    https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/

https://youngjinmo.github.io/2021/04/dto-vo-entity/

profile
코딩하는 감자

4개의 댓글

comment-user-thumbnail
2022년 2월 18일

아주 이해가 쏙쏙 되네요!

1개의 답글
comment-user-thumbnail
2022년 3월 22일

왜 도입했다고만 하고 안보여줘요? 궁금하게
보여줄때 까지 숨 참을게요 흡!

1개의 답글