반응형

한줄 요약

경계를 잘나눠라, 인터페이스를 잘 활용해서 의존성을 잘 조절해라. 그것이 변동성을 줄이는 나쁜 아키텍쳐를 피할 수 있다. 정답 아키텍쳐는 없다. 오답을 제거해 나가는 아키텍쳐만 있을 뿐. 클린한 아키텍쳐는 모르겠지만,  Dirty한 아키텍쳐를 피하는게 클린 아키텍쳐다.

 소프트웨어는 과학이다.

 나는 소프트웨어가 수학. 정답이 있는 줄 알았다. 하지만,  틀렸다. 좋은 소프트웨어를 만드는 것, 버그가 없는 소프트웨어를 만들기 위해선 오답을 제거하는 방식으로 가야한다. 물론, 처음에 버그가 없는 소프트웨어를 설계하는 것도 중요하다. 하지만,  방향은 정답이 있는 완벽한 소프트웨어가 아니라,  오답없는 소프트웨어로 가는 것이 초점이다.

 정답이 있다고 믿는 것이 아니라,  끊임없이 오답을 제거하려는 시도와 노력이 더 중요하다. 그 노력에 좋은 소프트웨어가 탄생하는 것이다.

이미 소프트웨어의 정답은 순차, 분기, 반복에서 끝났다. 

거짓임을 증명하는 테스트가 실패하면 그것은 '충분히' 참이라고 여길 수 있다. (항상 올바른 참은 없다. 과학에서의 이론과 법칙이 있듯이, 그것도 얼마든지 뒤집어질 수 있다.)

 과학을 수학화하는 노력에서 새로운 과학과 더 정교한 이론과 법칙이 탄생하듯, 소프트웨어도 완벽을 위해 노력하는 것이지 완벽 그 자체는 존재하지 않는다는 사실을 알았다.

 

클린한 소프트웨어의 본질

 변동성을 줄이는 것이다.

 즉, 의존성을 줄여 호환 가능하게 함이다. 만약 소프트웨어가 이 본질이 없다면 그것은 하드웨어나 다름없다. 딱딱한 소프트웨어가 된다. 줄이고 줄여서 결국 남게되는 건 업무규칙, 엔티티, 유스케이스가 남게될 것이다. 이것은 매우 중요하다.

다형성과 인터페이스가 의존성 역전을 만들어준다.

 캡슐화, 상속, 다형성은 사실 C에도 다 있다. 다만 OO(Object-Oriented)의 장점은 다형성에서의 실수 (함수포인터로 인한 잘못된 주소 참조)를 많이 줄여준다는 점에 있다. 여기,  이 다형성, 인터페이스가 의존성 역전을 만들어준다. 의존성 역전은 우리에게 호환성을 주고 변동 가능성을 매우 줄여준다. 이것으로 인해 소프트웨어가 장족의 발전을 했다고 해도 과언이 아니다.

 

 틀린 아키텍쳐는 있다.

SOLID원칙을 아예 준수하지 않는 소프트웨어.

하드웨어, 프레임워크, 데이터베이스, UI를 바꾸면 시스템 코드까지 다 바꿔야하는 소프트웨어.

기능하나 바뀌었는데 내부 로직까지 다 바꾸어야하는 소프트웨어.

컴포넌트 간, 모듈 간에 의존도가 너무 커서 수정하는 데 오랜 시간이 걸리는 소프트웨어.

 

업무 규칙에 대한 경계를 나누고, 적절하게 의존성을 역전하면 된다.

 

업무 규칙이 중요하다.

결국 어떻게 돈을 버는 지, 비즈니스 룰이 중요하다. 그것이 소프트웨어 아키텍쳐를 어떻게 구성해야할까를 결정짓는 핵심 본질이다. 아키텍쳐에 업무규칙이 녹아들어가야한다.

 

 경계를 구현하는 비용(인터페이스 설계) < 무시할 때 감수할 비용

이럴 때는 경계를 만들고(인터페이스를 설계) 작업을 해야 한다.

 

 먼저 동작하게 만들어라. 그리고 올바르게 만들어라. 그리고 빠르게 만들어라.

기능이 되게하라. 그리고 리팩터링해라. 그리고 효율을 고려해라.

 

 계층기반,  기능기반,  포트-어댑터기반,  컴포넌트 패키지 기반.

 

 

 

반응형