Clean Architecture는 애매하다

Siyoon's dev blog·2024년 7월 3일

1. 소프트웨어 아키텍처가 필요한 이유

개발자들이 회사에서 가장 많이 하는 업무가 무엇일까?

필자를 포함한 대부분 개발자들은 신규 프로젝트 생성하며 아키텍처를 설계한 경험 보다는 이미 존재하는 기능을 유지 보수한 경험이 더 많을 것이다.

필자가 최근에 본 클린 아키텍처 발표 영상에서 유지 보수에 대해 아주 명쾌하게 정의해주는데, 발표자분께서는 유지 보수기존에 있던 기능을

  1. 더 정확하고 (버그 수정)
  2. 더 빠르고 (성능 개선)
  3. 더 많이 (기능 추가)

시키는 것이라고 정의하였다.

아마 회사에서 신규 프로젝트를 한번도 경험하지 못한채 유지보수를 해온 개발자도 많을 것이다.

그래서인지 생각해보면 필자도 현재까지 구조를 잘 짜는 공부보다는 기능을 더 잘 구현할 수 있는 법을 공부하는데 비중을 두었다. (그렇다고 기능을 잘 구현하는가? 흠..)

소프트웨어가 제공하는 가치를 크게 기능구조로 두가지로 나누었을 때 비단 우리에게 익숙한건 기능이겠지만, Clean-Architecture의 저자 로버트 C 마틴은 기능보다 구조를 강조한다.

클린 아키텍처

저자가 기능보다 구조를 강조하는 뒷받침 근거로

1) 기능이 잘동작하지만 구조가 엉망인 프로그램과 2) 기능이 부족하지만 구조가 잘짜여진 프로그램 을 비교해보았을 때,

당장은 전자 시스템이 더 좋다고 느낄 수 있지만, 길게 봤을때는 유지 보수하는데 리소스가 너무 많이 들어 결국 다 엎어버리고 다시 개발하는 경우가 생길 수 있다는 것이고, 실제로 그런 사례가 흔하다.

쉽게 말해, 기능구조에 의지한다.

프로젝트를 처음 생성하는 개발자들이 아키텍처 설계를 잘해놓았다면 아마 개발자 수요는 현재보다 더 떨어졌을수도 있겠다.

2. 좋은 아키텍처를 어떻게 만들까?

구조가 잘 짜여진 좋은 아키텍처란 무엇일까?

프로젝트를 함께 진행하는 개발자들이 코드를 쉽고 빠르게 파악하고, 쉽게 변경할수 있는 규칙들을 _(대표적으로 패러다임, SOLID 설계 원칙, 컴포넌트 응집성, 결합성 원칙) 잘 지킨다면 그게 좋은 아키텍처일 것이다.

안타깝게도 대부분 개발자들은 저 원칙을 알면서도 실제 프로젝트에 적용하는게 쉽지 않다는 것을 경험해봤을것이다.

그렇기 때문에 우리는 전 세계 개발자들이 많이 사용하는 대표적인 아키텍처인 레이어드 아키텍처, 헥사고날 아키텍처, 클린 아키텍처에 대해 공부해야 한다.

대표 아키텍처들은 수십년 개발을 해온 개발의 대가들에 의해 설계된 아키텍처고 우리가 따라하는 것만으로도 앞에 나열된 좋은 아키텍처를 위한 원칙들이 대부분 지켜지기 때문이다.

3. 어떤 아키텍처를 사용해야 할까?

레이어드 아키텍처

레이어드 아키텍처는 현업에서 가장 많이 사용되는 아키텍처다.
이유는 다른 아키텍처들에 비해 구조가 단순하기 때문이다. 때문에 많은 개발자들이 익숙하게 접근하여 구조를 비교적 쉽게 이해할 수 있다.

레이어드 아키텍처의 단점으로는, 데이터베이스 주도 설계이기 때문에 비즈니스 요구 사항을 담고 있는 도메인에 대해 아키텍처만으로는 파악할 수 없다는 것이다.

클린 아키텍처

클린 아키텍처는 `도메인` 계층이 중심이다. (의존성 역전을 사용하여 영속성 계층이 도메인 계층을 의존하도록 설계한다.)

쉽게 말해, 도메인이 세부 사항에 의존하지 않도록 설계하여 비즈니스 규칙에 집중하기 쉽다.

클린 아키텍처의 단점으로 계층을 이해하기 복잡하다는 것, 애매해서 찾아보면 레퍼런스가 적다는 것이 있다.

클린 아키텍처의 핵심 포인트 2가지

  • 중요도에 따라 계층을 나눈다.
  • 의존성의 방향은 항상 안쪽으로 고수준을 향한다.

클린 아키텍처를 처음 접했을 때 단번에 이해되지 않는 이유가 위 두가지 포인트 외에는 규칙이 없기 때문이다. (케바케 상황이 너무 많다..)

잘 설계하고 있는지 판단하기 애매한 경우에는 이를 판단할 명확한 기준이 필요하다.

  1. 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력 최소화에 유리한가?
  2. 소스 코드 의존성이 안쪽으로, 고수준 정책을 향하고 있는가?
  3. 세부사항이 변경되어도 도메인(핵심 규칙)에 변경이 없는가?
  4. 테스트하기 쉬운가?
  5. 각각의 아키텍처 원칙들을 잘 지키고 있는가?

위 5가지 질문에 부합하는 설계를 하다보면 분명 클린 아키텍처의 장점을 최대로 활용하는 프로젝트를 만들 수 있을 것이다.

4. 결론

비록 시간이 오래 걸릴지라도 레이어드 아키텍처클린 아키텍처를 둘 다 공부해보고 프로젝트 성격에 맞는 아키텍처를 선택해야 최대의 효율을 낼 수 있다고 생각한다.

어떤 것을 선택할때는 trade-off를 따져야 하며, 그러기 위해 모든 선택 옵션을 공부하고 사용해보자.

profile
직접 글을 쓰는 지루함을 즐기기 위한 블로그

0개의 댓글