인프런 커뮤니티 질문&답변

종운님의 프로필 이미지
종운

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

생성자 검증

작성

·

434

0

안녕하세요 우빈님!

빌더 패턴 사용 시 생성자 검증을 어떻게 하는 것이 좋을까에 대한 질문을 드리고 싶습니다..!

변경 가능성이 있는 도메인 검증을 진행 할 때 빌더 패턴이 적용 된 private 생성자에서 검증을 진행하나요?

저 또한 정적 팩토리 메서드를 즐겨썼었는데 Builder를 사용하고나니 어느 위치에서 검증을 하는게 좋을까에 대한 의문이 생기더라구요.

기본적으로는 보통 정적 팩토리 메서드에서 생성자 검증을 진행하게 되면 도메인에서 검증을 위한 private 메서드가 전부 static이 되어야하는데 이게 옳은가? 라는 의문이 들기도 하고

그렇다고 private한 빌더 쪽에 생성자 검증을 하려고 하니 외부 세계에 영향을 받는 가령 클라이언트로 부터 입력받은 시간이 현재 시간 이전 일 수 없습니다. 라는 테스트를 수행해야 할 때 외부로부터 계속해서 LocalDateTime.now() 를 전파받아서 구현을 해야하는데 이 필드를 생성자에 추가하는 것도 아닌 것 같고..

이러한 고민 속에서 결국 생성자에서 진행됐어야 할 검증을 서비스 로직에서 도메인의 검증 메서드를 따로 호출하였는데 서비스 로직에서 검증 메서드를 호출하는 것 또한 좋은 방법은 아닌 것 같다는 생각이 들었습니다.

이러한 상황에서 우빈님은 보통 어떤 방식을 택하시는지 궁금합니다 ㅎㅎ

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 종운님! :)
좋은 고민이네요 ㅎㅎ

저도 한때 고민했던 내용인데, 이것도 결국 트레이드 오프를 고려하여 선택해야 하는 문제인 것 같습니다.

만약 필요에 따른 여러 개의 정적 팩토리 메서드를 둔다면, 공통적인 검증 로직은 생성자에서 검증하는 것이 자연스러울 것 같은데요.
현재시간이라던가, 외부로부터 받는 파라미터에 의존한 검증을 해야한다면 팩토리 메서드에서 검증하는 것이 더 나아보입니다. (저는 private static 메서드가 생기는건 크게 신경쓰지 않고 있어요 ㅎㅎ)

더 나아가서 말씀하신 것처럼 서비스에서 검증하는 방식도 사용할 수 있을 것 같아요.
비즈니스 로직을 전개하는 곳이 서비스 레이어이니 현재시간에 대한 검증 자체를 비즈니스 로직으로 보고 서비스에 책임을 할당하는 것도 상황에 따라 적절할 수 있을 것 같습니다.

정답이 있는 것은 아니라서, 구현하시는 내용에 따라 선택하시면 될 것 같아요 ㅎㅎ

감사합니다. :)

0

안녕하세요 종운 님!

빌더 패턴을 사용할 때 생성자 검증을 어떻게 하는 것이 좋을지에 대한 질문입니다.

보통 빌더 패턴을 적용한 클래스의 생성자는 private 접근 제어자로 만들어집니다. 이 경우 생성자에서 검증을 진행하는 것은 어렵습니다. 대신에 빌더 클래스에서 검증을 진행하는 것이 일반적입니다.

빌더 클래스에서는 필요한 필드를 설정할 때마다 해당 값의 유효성을 검증하면 됩니다. 이를 위해 빌더 클래스 내부에 private 메서드를 추가하여 검증을 수행할 수 있습니다. 검증에 실패한 경우에는 예외를 던지거나 기본값을 설정하는 등의 처리를 할 수 있습니다.

또한, 외부로부터 입력받아야 하는 값을 생성자에서 직접 받아야 하는 경우도 있을 수 있습니다. 이 경우 빌더 클래스에서 입력받은 값을 검증하여 유효한지 확인한 후, 생성자에서 사용하면 됩니다.

서비스 로직에서 강제로 도메인의 검증 메서드를 호출하는 것은 일반적으로 좋은 방법은 아닙니다. 대신에 빌더 패턴을 사용하여 생성할 때에 이미 필요한 검증이 수행되도록 하는 것이 바람직합니다.

제가 흔히 사용하는 방식은 빌더 클래스 내부에서 검증을 진행하고, 필요한 검증이 생성자에서 이루어져야 하는 경우에는 빌더 클래스에서 예외를 던지거나 기본값을 설정하도록 하는 것입니다.

감사합니다!

종운님의 프로필 이미지
종운

작성한 질문수

질문하기