[바미] 클린 아키텍처 소프트웨어 구조와 설계의 원칙
원래는 클린 아키텍쳐보다 멘먼스 미신이라는 책을 먼저 읽고 싶었으나, 바쁜 출근길 확인하지 않고 집은 책이 하필 클린 아키텍처 였다.
책에서 다시 설명해준 SOLID 원칙은 소프트웨어 설계의 기본을 다시 알려주었는데 내가 기존에 알고 있었던 SOLID 원칙과는 조금씩 다른 형태였고, 내가 오해하던 부분들을 각 원칙을 구체적으로 설명하며, 이를 어떻게 실제 소프트웨어 설계에 적용할 수 있는지를 사례를 통해 보여준 부분이 매우 유익했다.
먼저 단일 책임 원칙 (Single Responsibility Principle)은 각 클래스가 하나의 책임만 가져야 한다는 원칙이다. 이를 통해 클래스의 변경이 하나의 이유에 의해서만 발생하도록 하고, 코드의 응집도를 높일 수 있었음을 배웠다.
그리고 개방-폐쇄 원칙 (Open/Closed Principle)은 소프트웨어는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다는 원칙이다. 이를 통해 기존 코드를 수정하지 않고도 기능을 추가할 수 있도록 설계하는 방법을 배웠다.
그리고 리스코프 치환 원칙 (Liskov Substitution Principle)은 서브 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다는 원칙이다. 이를 통해 상속 관계에서의 일관성을 유지할 수 있었음을 배웠다.
그리고 인터페이스 분리 원칙 (Interface Segregation Principle)은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리해야 한다는 원칙이다. 이를 통해 인터페이스를 사용하는 클래스들이 꼭 필요한 메서드만 구현하도록 할 수 있었음을 배웠다.
그리고 의존 역전 원칙 (Dependency Inversion Principle)은 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 원칙이다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있다는 것을 배웠다.
'소프트웨어는 닳지 않지만, 펌웨어와 하드웨어는 낡아 가므로 결국 소프트웨어도 수정해야 한다'는 부분에 깊이 공감했다.
내가 최근에 이직한 회사는 IoT와 같은 하드웨어도 다루기 때문에, 하드웨어의 변화에 따라 소프트웨어를 지속적으로 수정하고 유지보수해야 하는 필요성을 항상 느끼고 있었다. 소프트웨어가 물리적으로 닳지 않더라도, 환경의 변화와 새로운 요구사항에 맞춰서 계속해서 개선되어야 한다는 점이 중요하게 다가왔다.
이 책을 통해 배운 SOLID 원칙을 기반으로 소프트웨어를 설계하는 법을 머리속에 되새기며 내가 담당하고 있는 프로젝트에서도 더 견고하고 유지보수하기 쉬운 코드를 작성하려고 노력하려 한다.
그 중에서도 의존 역전 원칙을 적용하여 모듈 간의 결합도를 낮추고, 변화에 유연하게 대응할 수 있는 구조를 만드는 것이 중요하다는 것을 늘 머리속으로는 알았지만 그것을 실천하기가 굉장히 어려운 게 사실이다.
그리고 Java의 개념을 사용하여 설계하는 예시 부분이 주였기 때문에 주 언어가 Java가 아닌 나에게는 아쉬웠던 부분이 있었다. 하지만 내가 알고 있었던 SOLID 원칙이나 디자인 패턴들을 재해석해주는 부분이 너무 좋았고, 내가 개발하고 있는 분야의 코드를 어떻게 설계하면 좋을지에 대해 명쾌하게 설명하는 부분도 인상적이었다.
'빨리 가는 유일한 방법은 제대로 가는 것이다. ','프로그램은 소프트웨어로서 계속해서 변할 수 있다.',
'구조를 명확히 잡지 못하면 비용이 발생하고, 먼 미래에 불상사가 일어날 수 있다.', '내가 프로젝트를 수정하기 어렵다고 느낀 이유는 구조가 잡히지 않았기 때문이다.', '아키텍처를 설계할 때 중요한 것은 모든 가능성을 열어두는 것이다.'
'DB, 프론트, 서버, REST와 같은 내용들을 지금 미리 결정할 필요는 없다.'
'프로그램은 장치 독립성이 중요하며 범용적으로 작성되어야 한다.', '소프트웨어 아키텍처는 선을 긋는 기술이며, 저자는 이를 경계라고 표현한다. ', '선은 관련이 있는 것과 없는 것 사이에 긋고, 이를 조작하기 위해 의존성 역전을 사용한다.',
'선을 그어 서로를 분리시켜 독립성을 얻는 것이 중요하다.', ' 업무 규칙은 프로그램이 작동하는 핵심적인 기능이다.',
'업무 규칙은 UI나 DB와 같은 저수준의 관심사로 인해 오염되면 안 된다.' , '가장 독립적이며 가장 많이 재사용할 수 있는 코드여야 한다.' , '의존성 규칙에 따라 소스 코드 의존성은 반드시 안쪽으로, 고수준의 정책을 향해야 한다.',
'서로는 서로가 하는 일을 모르며, 분리되어 있고, 일을 시킬 때는 인터페이스를 통해 작업한다.',
와 같이 의존성 역전과 컴포넌트의 분리를 통한 독립성을 강조한 점이 특히 인상적이었다.
이 책을 통해 얻은 지식을 실제 프로젝트에 적용하고, 앞으로도 꾸준히 공부하며 더욱 견고한 소프트웨어를 설계할 수 있도록 노력해야겠다.