Fundamentals2020. 2. 5. 23:52

A, B 라이브러리가 있다.

A와 B가 모두 사용자에게 보이지만, A는 B에 종속적이라고 알고 있기 때문에 사용자는 A만 이용하려 한다.

사용자는 A의 a 함수를 호출하며 A는 내부적으로 B의 b 함수를 이용한다.

 

 

 

사용자가 위와 같이 a 함수를 사용했다고 하자. 리턴 값은 true였다. 그러나 실제로 아무 것도

수행되지 않았다.

 

사용자는 왜 이러는지 한참을 고민한다. 자기 코드에 문제가 있는 건 아닌가 하고...

그러나, 디버깅 결과는 많은 공부가 되었다.

 

A의 a 함수 호출 시 내부에서 호출되는 B의 b 함수를 이용하려면, 그 전에 아래와 같이 B를 초기화해줘야 했다.

하지만, 사용자는 이 사실을 몰랐던 것이다.

 

 

 

이 문제는 사실 B 라이브러리의 버그이다.

이 경우 B가 초기화 되기 전에 b 함수를 실행한다면, 리턴 값으로 true를 주는 것은 엄연한 버그다.

 

즉, 초기화가 되지 않은 상태에서, 아래의 수행 결과는 당연히 false여야 한다는 것이다.

 

 

 

그래야 사용자는 함수 호출이 왜 실패 했는지를 되짚어 볼 수 있다.

 

하지만, 

 

근본적인 문제는 버그에 있다기 보다는 라이브러리 설계에 있다고 할 수 있다.

 

사용자는 

 - A를 이용함에 있어 B의 기능이 필요한 점을 모를 수 있고,

 - B의 존재를 안다고 해도 초기화를 해야 하는지 역시 모를 수 있다.

 

물론 A의 API 설명서에 이런 내용을 명시한다면야 사용자의 잘못이라고 할 수 있겠으나,

현업에 종사하다 보면 API 설명서가 제대로 되어 있는 라이브러리를 찾아보기란 애인을 사귀는 것 만큼이나매우 어렵다.

 

 

위와 같은 문제를 해결하기 위해 본인이 생각하는 solution은

 

1. 사용자는 A를 사용하므로, A의 초기화가 필요하단 사실은 쉽게 짐작할 수 있다.

2. 그러므로, A의 초기화 함수 내부에 B의 초기화도 같이 수행하도록 한다.

3. B의 초기화 시 외부 인자가 필요하다면, A 초기화 함수 인자에 해당 인자들을 포함하도록 한다.

 

도식화하면 아래와 같다.

 

 

 

본인은 현업에 종사하면서 이 원칙을 가지고 개발에 임하고 있다. 

누가 알아주는 것은 아니지만, 자기 만족이랄까... 

 

하지만, 내가 생각하는 것이 꼭 정답은 아니므로, 자신의 가진 생각과 잘 융화 시키는 것이 더욱 유익하리라 생각한다.

 

 

- Review 2020. 2. 5

 . 다시 읽어보니 감회가 새롭다. 역시 탄탄한 기초는 매우 중요하다. 마지막 줄의 유보적인 코멘트는 빼고 싶을 정도로 옳은 방식이다. 이런 올바른 생각들이 켜켜이 쌓여 현재의 나를 만든 것이라고 믿는다.

 . 파사드(Facade) 패턴의 일부 개념에 대한 설명이므로, 패턴명도 붙여 보았다.

 

Posted by JMAN