생성자 검증
524
작성한 질문수 21
안녕하세요 우빈님!
빌더 패턴 사용 시 생성자 검증을 어떻게 하는 것이 좋을까에 대한 질문을 드리고 싶습니다..!
변경 가능성이 있는 도메인 검증을 진행 할 때 빌더 패턴이 적용 된 private 생성자에서 검증을 진행하나요?
저 또한 정적 팩토리 메서드를 즐겨썼었는데 Builder를 사용하고나니 어느 위치에서 검증을 하는게 좋을까에 대한 의문이 생기더라구요.
기본적으로는 보통 정적 팩토리 메서드에서 생성자 검증을 진행하게 되면 도메인에서 검증을 위한 private 메서드가 전부 static이 되어야하는데 이게 옳은가? 라는 의문이 들기도 하고
그렇다고 private한 빌더 쪽에 생성자 검증을 하려고 하니 외부 세계에 영향을 받는 가령 클라이언트로 부터 입력받은 시간이 현재 시간 이전 일 수 없습니다. 라는 테스트를 수행해야 할 때 외부로부터 계속해서 LocalDateTime.now() 를 전파받아서 구현을 해야하는데 이 필드를 생성자에 추가하는 것도 아닌 것 같고..
이러한 고민 속에서 결국 생성자에서 진행됐어야 할 검증을 서비스 로직에서 도메인의 검증 메서드를 따로 호출하였는데 서비스 로직에서 검증 메서드를 호출하는 것 또한 좋은 방법은 아닌 것 같다는 생각이 들었습니다.
이러한 상황에서 우빈님은 보통 어떤 방식을 택하시는지 궁금합니다 ㅎㅎ
답변 2
1
안녕하세요, 종운님! :)
좋은 고민이네요 ㅎㅎ
저도 한때 고민했던 내용인데, 이것도 결국 트레이드 오프를 고려하여 선택해야 하는 문제인 것 같습니다.
만약 필요에 따른 여러 개의 정적 팩토리 메서드를 둔다면, 공통적인 검증 로직은 생성자에서 검증하는 것이 자연스러울 것 같은데요.
현재시간이라던가, 외부로부터 받는 파라미터에 의존한 검증을 해야한다면 팩토리 메서드에서 검증하는 것이 더 나아보입니다. (저는 private static 메서드가 생기는건 크게 신경쓰지 않고 있어요 ㅎㅎ)
더 나아가서 말씀하신 것처럼 서비스에서 검증하는 방식도 사용할 수 있을 것 같아요.
비즈니스 로직을 전개하는 곳이 서비스 레이어이니 현재시간에 대한 검증 자체를 비즈니스 로직으로 보고 서비스에 책임을 할당하는 것도 상황에 따라 적절할 수 있을 것 같습니다.
정답이 있는 것은 아니라서, 구현하시는 내용에 따라 선택하시면 될 것 같아요 ㅎㅎ
감사합니다. :)
0
안녕하세요 종운 님!
빌더 패턴을 사용할 때 생성자 검증을 어떻게 하는 것이 좋을지에 대한 질문입니다.
보통 빌더 패턴을 적용한 클래스의 생성자는 private 접근 제어자로 만들어집니다. 이 경우 생성자에서 검증을 진행하는 것은 어렵습니다. 대신에 빌더 클래스에서 검증을 진행하는 것이 일반적입니다.
빌더 클래스에서는 필요한 필드를 설정할 때마다 해당 값의 유효성을 검증하면 됩니다. 이를 위해 빌더 클래스 내부에 private 메서드를 추가하여 검증을 수행할 수 있습니다. 검증에 실패한 경우에는 예외를 던지거나 기본값을 설정하는 등의 처리를 할 수 있습니다.
또한, 외부로부터 입력받아야 하는 값을 생성자에서 직접 받아야 하는 경우도 있을 수 있습니다. 이 경우 빌더 클래스에서 입력받은 값을 검증하여 유효한지 확인한 후, 생성자에서 사용하면 됩니다.
서비스 로직에서 강제로 도메인의 검증 메서드를 호출하는 것은 일반적으로 좋은 방법은 아닙니다. 대신에 빌더 패턴을 사용하여 생성할 때에 이미 필요한 검증이 수행되도록 하는 것이 바람직합니다.
제가 흔히 사용하는 방식은 빌더 클래스 내부에서 검증을 진행하고, 필요한 검증이 생성자에서 이루어져야 하는 경우에는 빌더 클래스에서 예외를 던지거나 기본값을 설정하도록 하는 것입니다.
감사합니다!
private 상수 테스트 관련 질문
0
83
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
126
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
161
2
테스트 문서화 질문입니다
0
105
2
단위테스트 질문이 있습니다
0
96
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
103
2
ERD 가장자리에 있는 도메인 테스트 질문
0
89
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
135
2
OrderCreateRequest DTO에 대해서 궁금한점
0
102
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
156
2
계층 관련 질문이 있습니다.
0
139
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
124
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
135
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
228
2
Service+Repository 통합테스트 관련 질문입니다.
0
150
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
185
2
test 용 .yml
0
90
2
throws Exception
0
80
2
카페키오스크 클래스 문의 ,,
0
89
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
174
2
테스트 코드에서 필요한 생성자
0
138
1
tearDown 순서
0
116
2
@Builder 생성자 private
0
136
2
@DisplayName gradle / intellJ
0
93
2





