https://github.com/naver/fixture-monkey/pull/1036#discussion_r1739620057

성아님의 코멘트

register한 ArbitraryBuilder를 initialize하는 과정이 재귀적으로 일어나서 다르게 처리합니다.

register한 타입의 ArbitratyBuilder를 생성하는 것도 동일한 Fixture Monkey 인스턴스에서 일어나기 때문에 재귀루프를 종료시킬 base case를 정의해주어야 합니다.

initializeNamedArbitraryBuilderMap를 호출할 당시에 base case가 정의가 안되서 두 번째 객체가 의도대로 생성이 안되는 것입니다.

위에 내용을 이해하시고 아래 코드를 살펴보시면 이해하실 수 있을겁니다!

재귀함수와 비슷한 경우라고 생각하시면 됩니다. 값과 값을 조합하는 객체가 두 가지 경우로 달라집니다. 앞서 말씀드렸듯이 재귀함수는 종료하는 base case가 필요합니다. 값을 생성하는 경우(Wrapper class)가 base case이고 값을 조합하는 경우(객체)가 그 외의 case입니다.

트리로 생각하면 리프 노드와 그 외의 노드로 나뉜다고 보셔도 될 것 같습니다. 리프 노드는 wrapper class이고, 그 외의 노드는 자식인 노드들의 조합으로 만들어집니다. 요 개념을 이해하시면 위의 코멘트들이 어떤 의미인지 이해가 되실 것 같습니다.

SimpleObject와 같은 경우 재귀를 통해 안에 있는 필드들의 값이 생성이 됨

이때 Wrapper Class는 재귀를 통해 생성하는 것이 아니라 한 번만 실행되면 됨.

그러므로 재귀 함수를 종료하는 basecase가 필요했던 것이다.

예상하건데 match API에서 일치를 해서 생성이 되는 것이 base case가 될 것.