대학원 일기

클린 아키텍처(Clean Architecture) 소개 본문

Computer programming/Book

클린 아키텍처(Clean Architecture) 소개

대학원생(노예) 2023. 7. 29. 05:47

클린 아키텍처

대학원을 가기 전, 프로그래밍의 구조와 설계에 대해 공부하고 싶어 선배의 추천(?)으로 인해 대표적인 클린 아키텍처를 읽어보게 되었다. 업로드는 챕터별로 할 예정이다.

클린 아키텍처

클린 아키텍처를 소개하기 전, 당연한 사실이지만 모든 개발자는 코드를 잘 짜려고 한다. 이와는 다르게 초보 개발자들은 구조와 설계에 대한 지식은 없으므로 무작정 설계와 코드를 작성한다. 이러한 시스템은 나중에 업데이트나 유지보수하는데 드는 비용이 계속적으로 스노우볼처럼 증가한다. 이를 막기 위해서는 구조와 설계에 대해 알아야하고, 공부해야 한다. 

 

내가 책을 보면서 눈에 띈 문장이 있었다. 

"현대의 대다수 개발자는 뼈 빠지게 일한다. 하지만, 그들의 뇌는 잠에 취해 있다. 훌륭하고 깔끔하게 잘 설계된 코드가 중요하다는 사실을 알고 있는 바로 그 뇌가 잠자고 있다."

이 문장은 시스템의 설계는 무시하고, 단순히 시스템의 완성을 앞당기려고만 한다는 것이다.

(실제로 대학교에서 경험해봤으니 너무 공감이...)

시스템의 완성을 위해서 아무렇게나 개발하면 나중에 코드를 수정하거나 후임 개발자가 들어와서 볼 때 아주 난처해지는 상황이 발생한다. 이를 위해서는 무조건적으로 기초 공사를 확실하게 해야한다.

 

서론이 길었다. 이제 클린 아키텍처에 대해 말하겠다.

 

 

1부 소개

클린 아키텍처에 1부는 '설계와 아키텍처란?'과 '두 가지 가치에 대한 이야기'로 1~2장으로 구성되어 있다. 1부 전, 옮긴이의 글이나 추천사, 서문 등은 가까운 서점에서 한 번 읽어보길 바란다. 좋은 내용들 많다.

 

 

1장 설계와 아키텍처

설계와 아키텍처의 차이가 있는가? 

저자는 "아무런 차이가 없다."라고 말한다.

'아키텍처'는 고수준의 세부사항과 분리된 무언가를 가르킬 때, '설계'는 저수준의 구조 또는 결정 사항 등을 가르킬 때.

책에서 말하는 '설계'는 쉽게 이해가 간다. 무엇인지 알고, 쉽게 생각할 수 있으니까.

그에 반면에, 아키텍쳐는 모호하게 설명을 해주었다. 그냥 아키텍처는 큰 관점, 설계는 작은 관점으로 이해했다.

집으로의 예시를 들면, 일반 가구, 콘센트, 문 위치 등은 설계인 것이고, 아키텍처는 집 도면, 집의 형태, 방의 배치 등이다.

이처럼 설계와 아키텍처는 개별로 존재할 수 없는 것이고, 이 둘의 경계 또한 불분명하다. 둘 다 중요한 것이다.

 

이렇게 중요한 설계와 아키텍처의 목표는 무엇일까?

간단하다.

이는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력. 즉, 비용을 최소화하는 것이다. 

이 말은 책에서 설계의 중요성을 말하는 종착지인 셈이다.

책에서는 현대까지 다양하게 경영된 제품들을 소개하였다. (좋은 제품, 안좋은 제품)

우선, 좋지 않은 제품. 설계를 대충 짠 코드는 제품을 유지하는 데 드는 비용이 대부분 우상향이었다. 제품이 출시하고 들어오는 수입은 대부분 유지보수로 빠진다는 얘기이다. 이런 제품은? 나중에가서 무조건 서비스 종료하게 되어있다. 

그에 비해, 좋은 제품은 갈수록 시스템을 유지보수하는 데 드는 비용이 하향하는 그래프를 보여준다. 이는 초반에 기초 공사를 잘해 유지보수하는데 초기 인력만큼의 비용이 들어간다는 것이다.

좋지 않은 제품은 유지보수 할 것이 많으니 점점 인력을 추가하는 것이고, 좋은 제품은 유지보수가 간단하니 초기의 인력만으로도 충분한 것이다. 이처럼 초기 설계는 매우 중요하다.

 

시스템의 품질과 미래를 생각한다면, 소프트웨어 아키텍처의 품질을 고민해야 한다. 

소프트웨어 아키텍처를 심각하게 고민하면서 좋고 나쁜 아키텍처를 구분하고 이해한다면, 미래의 비용은 최소화하고 생산성을 최대화할 수 있을 것이다. 

 

이 책은 훌륭하고 깔끔한 아키텍처가 무엇인지 설명하고, 이를 통해 소프트웨어 개발자가 장기간에 걸쳐 수익을 창출하는 시스템을 만들 수 있게 하고자 한다. (1인 개발이 된다는 거네)

 

 

2장 두 가지 가치에 대한 이야기

소프트웨어 시스템은 두 가지 가치를 제공한다.

이는 바로 "행위와 구조" 이다.

 

우선, 행위는 말 그대로 코딩하는 것이다. 코딩. 코딩. 코딩. 

과연 컴공 학부생, 부트캠프 수강생같은 초보 개발자들은 구조를 생각할 틈이 있을까?

경험하기로는 '절대 아니다.' (물론, 특출난 몇 명은 제외하고)

일반적으로 대부분 그냥 코딩. 말 그대로 머리부터 부딪힌다. 그냥 only 행위만 하는 것이다. 

헌데? 이러한 생각은 많은 프로그래머가 이를 따른다. 

대부분의 프로그래머는 '행위와 구조'를 안다. 하지만? 직접 실무에 들어가면서 중소나 중견에서 큰 규모의 작업을 할 때, 구조를 신경 쓰는 것은 연차가 오래된 개발자일 것이다. 그들은 요구사항들을 개발하여 구현하고, 버그를 수정하는 일이 자신의 직업이라고 인지하게 되는 것이다. 이러면 안된다.

 

이제 그 중요한 구조에 대해 말해볼까? 

내가 생각하는 '구조'에 대해 말하기 전, 책은 구조(structure)를 소프트웨어(software)라는 단어와 관련있다고 한다. 소프트웨어의 soft는 '부드러운'의 의미를 가진다. 구조라는 가치는 sofr에서 존재한다고 한다.

소프트웨어가 본연의 목적을 추구하려면 부드러워야만 한다. 이는 변경하기 쉬워야 한다는 뜻이다. 소프트웨어의 개발 비용의 주된 요인은 변경사항의 범위와 형태의 차이가 있다. 변경 사항이 클수록 비용이 커지고, 작을수록 비용이 작아지는 것이다. 

 

두 가치 중에서 더 높은 가치는 무엇일까??

기능이냐?? 설계냐??

시스템 동작이 먼저냐?? 시스템을 더 쉽게 변경하는 게 먼저냐??

 

대부분의 사람은 업무 관리자는 시스템이 먼저 동작하는 것이 먼저라고 생각한다. 이는 완전히 틀린 것이다. 업무 관리자는 무조건 '변경 가능한 시스템'을 선택한다. 

책에서는 단순하게 양 극단의 사례를 검토하는 방식을 소개한다.

[기능 중심]

"완벽하게 동작하지만 수정이 아예 불가능한 프로그램을 내게 준다면, 이 프로그램은요구사항이 변경될 때 동작하지 않게 되고, 결국 프로그램이 돌아가도록 만들 수 없게 된다. 따라서, 이러한 프로그램은 거의 쓸모가 없다."

[설계 중심]

"동작은 하지 않지만 변경이 쉬운 프로그램을 내게 준다면, 나는 프로그램이 돌아가도록 만들 수 있고, 변경사항이 발생하더라고 여전히 동작할 수 있도록 유지보수할 수 있다. 따라서, 이러한 프로그램은 앞으로도 계속 유용한 채로 남는다."

 

기능 중심으로 될 경우, 수정으로 드는 비용이 수정으로 창출되는 비용보다 큰 경우가 발생한다. 이는 위 기능 중심처럼 결국 수정이 현실적으로 불가능해지는 것이다. 

기업에서는 두 가지 가치의 균형을 맞추기 위해 개발자를 뽑고 비용을 쓰면서까지 조화를 맞추는 것이다. 

 

후기

클린 아키텍처의 1부는 설계의 중요성을 알리는 것 같다. 하지만, 설계만이 중요한 것이 아닌 소프트웨어 시스템의 두 가치인 행위와 구조가 조화롭게 균형을 유지하는 것이 중요하다고 말하는 것 같다.

대부분의 초보 개발자는 행위에 치우쳐 있으므로 설계를 공부하고, 꾸준히 생각해야 한다.

 

Comments