높은 추상화 수준에서 클린코드 유지하기
이번 장은 어떻게 하면 높은 추상화 수준(= 헬렌카지노 수준)에서도 깨끗함을 유지할 수 있는지 그 방법에 대해 설명한다. 하지만 자바와 스프링 AOP와 같은 자바 프레임워크, AspectJ 언어라는 것에 빗대어 설명하기 때문에 나의 이해에 한계가 있을뿐더러 사실 기반의 정보 요약은 그다지 유의미할 것 같지도 않아 느낀 점 위주로 기록해보려 한다.
일단 처음부터 복잡성은 죽음이라는 인용문 언급하면서 독자들 또 잔뜩 겁주고 시작하는 밥 선생님(클린코드의 저자).. 소프트웨어 팀을 도시에 비유하는 면이 흥미로웠다. 도시는 큰 그림을 그리는 사람과 각 분야를 관리하는 작은 그림의 사람들이 팀을 이뤄 효율적으로 돌아가는데 그에 반면 소프트웨어를 제작할 때는 헬렌카지노을 비슷한 수준으로 관심사를 분리하거나 추상화를 이뤄내지 못한다고 비판한다. 계획도시가 있다면 비계획도시도 있는 거 아니겠습니까 선생님..
어쨌든 간에 처음부터 답이 나오는데 그것은 적절한 추상화와 모듈화라고 말씀하시는 듯했다. 결국 모든 헬렌카지노이 풀어나가야 할 문제는 관심사라는 건데, 관심사를 분리하지 않으면 테스트하기도 힘들고 객체가 무거워지고, 단일 책임 원칙을 깨고, 복잡해지고, 복잡해지면 곧 죽음이라는 것이다.
특히 대다수 헬렌카지노은 시작 단계-보통 main 함수라고 부르는 곳-에서부터 관심사를 분리하지 않아 불행이 시작된다.
getService는 MyServiceImplementService가 실제로 필요할 때까지 객체를 생성헬렌카지노 않고, 어떤 경우에도 null포인터를 반환헬렌카지노 않지만, MyServiceImpl생성에 필요한 파라미터들을 getService의 파라미터로 받아야 하는 문제와 MyServiceImpl를사용헬렌카지노 않는 상황에서도 이 의존성을 해결헬렌카지노 않으면 컴파일이 안 되는 문제가 있다.
그렇기 때문에 밥 선생님은 헬렌카지노 제작과 사용을 분리하라고 말씀하시는데, main 함수에서 헬렌카지노에 필요한 객체를 생성한 후에 애플리케이션에 넘기고 / 애플리케이션은 그저 객체를 사용하도록 하라는 것이다. 즉 애플리케이션은 main이나 객체가 생성되는 과정을 전혀 모른다는 뜻이다.
만약 객체가 생성되는 시점을 애플리케이션이 결정해야 헬렌카지노면 추상 팩토리 패턴을 사용해서 의존성을 한 방향으로 제어헬렌카지노. 애플리케이션은 객체가 생성되는 구체적인 방법은 모르지만 main 쪽에 있는 Factory구현체에서 알고 있으며 인터페이스를 열어두어 인스턴스가 생성되는 시점을 완벽하게 통제헬렌카지노.
그래서 이다음에는 제작과 사용을 분리하기 위해 의존성 주입 메커니즘을 언급하고, IoC에 대해서도 언급헬렌카지노. 이런 초기화 지연이라던가, 팩토리 패턴, DI 같은 것들은 꼭 정답이라기보다 최적화 기법 중 하나일 뿐이고 결국 중요한 것은 상황에 따라 내가 도구로 적절히 활용할 수 있는지 체화와 활용에 달려있으며, 섣부른 최적화는 아닌지 고민하고 또 판단하는 의사결정의 중요성에 있다는 생각이 들었다.
확장에 대해 언급하신 부분은 참 재밌었는데, 챕터 초반에 도시를 예로 들으셨으니 여기도 계속 무언가 건설에 대한 예시로 이어가신다. 군락은 마을로, 마을은 도시로 성장헬렌카지노며 처음에는 좁거나 사실상 없던 길들도 점차 넓어지는데 성장에는 고통이 따른다고 하셨다.세상에 참 쉬운 일이 없다.
확장 공사로 도로를 통제하고 차가 막히면 "이럴 거면 왜 처음부터 넓게 만들지 않은 거야?"라고 자문하지만 '처음부터 올바르게' 헬렌카지노을 만들 수 있다는 믿음은 미신이다. 내일은 새로운 스토리에 맞춰 헬렌카지노을 조정하고 확장하면 된다. 이것이 반복적이고 점진적인 애자일 방식의 핵심이라며.
많은 개발자들의 공감을 사는 문장이 아닐까 하는 생각이 들었다. 나도 동료들과 머리를 맞대고왜 처음부터 이렇게 안 했을까, 이참에 싹 바꾸면 좋지 않을까 얘기하면서도 당시에는 최적의 판단을 하여 개발하였음을 믿고, 오늘날의 코드가 점진적인 헬렌카지노 개선에 기여하도록 조정하는 걸 반복했던 경험이 있으니 말이다. 하지만 그럼에도 사전 계획이 필요하다는 것은 맞는 말이다. 점진적으로 발전하기 위해 관심사를 적절히 분리하기 위한 계획이 필요하다. 그렇지 않으면 아키텍처가 유기적으로 성장할 수 없다.
이런 걸 보면 소프트웨어는 어쩌면 한 인간과도 같다는 생각이 들기도 한다. 처음에는 관심사 분리랄 게 없는 간단한 기능만 하는 헬렌카지노이었는데 변수와 함수가 많아지고 기능이 생기고 객체를 분리하고 아키텍처가 구축되며 유기적으로 성장하는 것처럼 말이다. 책에서 흥미로웠던 구절이 있었는데 헬렌카지노의 관심사를 분리하면서, 모듈화를 하면서 때때로 '마지막 순간까지 결정을 미루는 방법'이 최선이라는 부분이었다. 최대한 정보를 모아 최선의 결정을 내리기 위해서다. 성급한 결정은 불충분한 지식으로 내린 결정이기 때문에 더 고민하고 더 탐험하도록 권장한다.
헬렌카지노 역시 깨끗해야 한다. 깨끗하지 못한 아키텍처는 도메인 논리를 흐리며 기민성을 떨어뜨린다. 헬렌카지노을 설계하든 개별 모듈을 설계하든, 실제로 돌아가는 가장 단순한 수단을 사용해야 한다는 사실을 명심하자.
P.S헬렌카지노은 도메인 특화 언어가 필요하다는 부분에서떠오른 생각
→ swift로 DSL만드는 아래 wwdc 영상 살펴볼 것.