Learn to share,Share to learn

Clean Architecture란 무엇이고 어떤식으로 작성해야할까? 본문

Kotlin/Architecture

Clean Architecture란 무엇이고 어떤식으로 작성해야할까?

Rogue One 2023. 11. 25. 15:58

이 부분에 관해선 이전부터 많은 관심을 가지고 공부하곤 했다. 투병전인 2021년에는 이정도는 아니였던거같은데 요새는 정말 많은곳에서 사용한다. 학생 프로젝트에서도 볼수 있을정도로..

일단 2021년 당시 내가 공부했던 내용을 함께 보자.

2021년 5월 8일, 5월 9일

주말이다. 주말은 깃허브 예제 코드를 보며 공부하기로 마음먹었다.

내 주된 개발툴은 Flutter, 디자인 아키텍쳐는 클린 아키텍쳐로 정해 공부하기로 했다.(지금은 kotlin이 되었다)

우선 클린아키텍쳐에 대해 이해를 하기 위해 다음의 글을 먼저 읽었다.

woowabros.github.io/tools/2019/10/02/clean-architecture-experience.html

 

주니어 개발자의 클린 아키텍처 맛보기 - 우아한형제들 기술 블로그

안녕하세요 딜리버리플랫폼팀 송인태입니다.

woowabros.github.io

medium.com/@justfaceit/clean-architecture%EB%8A%94-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%84%EC%99%80%EC%A3%BC%EB%8A%94%EA%B0%80-1-%EA%B2%BD%EA%B3%84%EC%84%A0-%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%A0%95%EC%9D%98%ED%95%B4%EC%A4%80%EB%8B%A4-b77496744616

 

Clean Architecture는 모바일 개발을 어떻게 도와주는가? - (1) 경계선: 계층 나누기

How Clean Architecture Assists Mobile Development - Part 1. Boudaries: Defining Layers

medium.com

클린 아키텍쳐를 공부할때 가장 쉽게 찾아볼수 있는 과녁 모형이다. 클린 아키텍쳐에서 가장 중요한점은 각 계층을 규칙적으로 나눠, 업무로직과 데이터 로직이 뒤섞이지 않게하여 코드의 수정을 쉽게하고, 모듈의 변경이 다른 모듈을 변경시키지 않게 독립성을 제공한다는 점이다.

3개의 계층으로 나누어, 각 계층별로 역할을 담당하여 코드를 작성하면 코드 전반적인 이해가 간단해진다는점을 이미 몸으로 느낀바가 있었다.

인턴으로 참여한 프로젝트는 대규모 사용자가 참여하는 커뮤니티 프로젝트였다. 당연히 수많은 기능들과 데이터 처리, API관리 등의 코드를 작성했는데 이러한 아키텍쳐 덕분에 특정 코드들의 작성만으로도 기능을 구현할수 있었다.

 

내가 경험하고 이해한 클린 아키텍쳐의 간단한 구조는 이렇다.

실제 유저들이 사용하는 페이지들은 page폴더로 모두 모아 각 페이지당 view, controller, presenter로 나누어 진다.(변형된 MVC 디자인 패턴이였다) 이름에서 알수 있듯이 view는 유저가 직접 보는 페이지를 그리고, controller 는 view에서 작성된 메소드의 기능을 구현하고, presenter에 뷰에서 받은 parameter를 정리(validation check 등) 해 보내는 역할을 한다. presenter는 Usecase에 연결되어 데이터의 처리를 담당한다. 이때, 유스케이스가 필요로 하는 데이터 저장/수정 등의 기능을 제공하는 클래스인 Repository 또한 함께 연결되어 보내줌으로써, 위의 모델과 같이 데이터를 처리할수 있게 해준다.

 

Usecase는 파라미터로  구현된 메소드로 view에서 부터 받은 parameter를 보내고, 그 결과값을 oncomplete, onerror등으로 받아 Controller에 다시 보내주는데, 이때 Controller는 사용자 인터페이스를 업데이트하거나, 오류가 발생했을 때 사용자에게 적절한 피드백을 제공한다. 이 과정에서 유연성과 모듈성이 높은 클린 아키텍처의 장점이 잘 드러나며, 각 계층의 책임이 명확히 분리되어 시스템의 전체적인 안정성과 확장성이 향상된다.

 

6월 10일

TDD를 알아볼수록 복잡하고 적용이 쉽지 않다는게 보인다. 톡방의 어떤분은 플라톤의 이데아 같은 느낌이라고 하시는데 흠.. 확실히 이상적이고 복잡하지만 적용하고 사용할수만 있다면 장기적으로 좋은 부분이 있을것같다. 하지만 프레임워크와 방법론 등은 모두 도구일뿐이다. 닭잡는 칼도 있고 소잡는 칼도 있는데, 아직 내게는 소잡는 칼같이 느껴진다. 

https://wooaoe.tistory.com/33 TDD 설명이다. 일단 좀더 고려해보며 패턴에 대해 보고 있는데, 개념을 알겠지만 좀 투머치 하다는 생각도 좀 들고..

 

https://github.com/ShadyBoukhary/flutter_clean_architecture

 

ShadyBoukhary/flutter_clean_architecture

Clean architecture flutter: A Flutter package that makes it easy and intuitive to implement Uncle Bob's Clean Architecture in Flutter. This package provides basic classes that are tuned to work...

github.com

클린 아키텍쳐의 리드미를 잘 읽어보면 도움되는 부분이 많다는 조언을 들어 읽어보고있다. 특히 아래 링크와 함께 읽으니 더욱 도움이 된다.

https://yrok.tistory.com/entry/%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%84%A4%EA%B3%84%EC%9D%98-%EC%9B%90%EC%B9%99Clean-Architecture-5%EB%B6%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-20%EC%9E%A5

 

클린 아키텍처:소프트웨어 구조와 설계의 원칙(Clean Architecture) - 5부 : 아키텍처 (20장)

[20장] 업무 규칙 애플리케이션을 업무 규칙과 플러그인으로 구분하려면 업무 규칙이 실제로 무엇인지를 잘 이해해야만 한다. 업무 규칙은 사업적으로 수익을 얻거나 비용을 줄일 수 있는 규칙

yrok.tistory.com

 

6월 11일

글에 앞서 클린 아키텍쳐 요약본을 먼저 알아보고 시작하자

https://peter-cho.gitbook.io/book/11/clean-architecture/1

 

클린 아키텍처 일부 요약

 

peter-cho.gitbook.io

 

https://genieker.tistory.com/123를 다시보며 클린아키텍쳐의 개념에대해 다시 생각해 톡방에 질문을 하게되었다. 좋은 대화가 많이 나와 간략하게 정리하고 중략도 하며 작성해보았다. 이해를 위해 Q는 나뿐만 아니라 다른 질문자분들도 모두 포함해 Q로 적고, 문맥에 따라 어느정도 편집을 했다. 

 

Q: 고수님들 질문이 생겨 왔습니다. 클린 아키텍쳐는 프레임워크인가요 아키텍쳐인가요? MVC,MVVM과 같은 디자인 패턴을 이용해 클린 아키텍쳐라는 프레임워크 기법을 지키며 플러그인이라는 컴포넌트들을 사용해서 개발하는거라고 이해하고 있었는데 제 이해가 맞을까요? 아키텍쳐는 이 모든것을 아울러서 아키텍쳐라고 하는걸까요??

A: [김] 클린 아키텍쳐는 아키텍쳐로 보는게 맞는데, 제 생각엔 용어가 좀 기존의 아키텍쳐랑 다르다고 봐요

A: [루] 클린 아키택처는.. 아키텍처입니다. 일단 저자가 아키텍처라고 했으니까요.
그리고 프레임워크는 기법이 아닙니다? 또 플러그인은 아키텍처의 원론과 무관하고 플러터에서 구현상의 요소에 속할 것이라고 추정합니다.


Q: 음.. 그럼 클린 아키텍쳐에서 사용하는 프레임워크는 어떤부분인가요?

A: [루]  프레임워크는 잊어요. 사실 프레임워크도 아키텍처 이상으로 모호한 개념이라서.

그리고 클린아키텍처는 구조에 대한 이론이라서 프레임이 존재하지 않... 지 않아요?

A: [김]  클린아키텍쳐를 따른 프레임워크는 있어도 클린아키텍쳐는 프레임워크가 아니다, 이 말이 적절하지 않을까욤


A: [루]  그러씁니다.
극단적으로 말하면, 클린아키텍처는  재료의 배치와 순서와 방법을 통짜로 설명하는 백선생님 유투브같은거고.
프레임워크는 도구와 재료를 제공하는 밀키트같은건데 굉장히 극단적인 구분이라서. 이걸로 이해하면 안됩니다.

 

A: [김]  제가 예전에 디자인 패턴이랑 아키텍쳐랑 뭐가 다르냐고 질문 올렸던적이 있었는데 링크를 참고하세요
https://stackoverflow.com/questions/4243187/whats-the-difference-between-design-patterns-and-architectural-patterns

 

What's the difference between design patterns and architectural patterns?

When we read about design patterns on the internet we note that there are 3 categories: Creational Structural Behavioral But when we create the architecture of a software, then we think about MVP...

stackoverflow.com

 

A: [김]  그리고 MVC 와 MVVM은 디자인 패턴이 아니예요

Q: 디자인패턴 맞지않나요?

A: [김] 아키텍쳐로 보는게 맞아요, 보내드린 링크보시면..

저는 디자인 패턴을 반복되는 문제 해결에 대한 패턴이라고 보고 아키텍쳐는 소프트웨어의 구조 구성을 이야기 하는건데, MVC 나 MVVM은 소프트웨어 구조 구성을 결정하는거잖아요
그래서 디자인 패턴이 아니라 아키텍쳐로 보는게 맞는다는거죠. 보내드린 링크에서도 MVC는 아키텍쳐 중 하나 라고 이야기 하고 있어요

A: 아키텍쳐는 설계도짜는거고 디자인패턴은 설계도를그릴때 패턴화시킨것?

https://mingrammer.com/translation-10-common-software-architectural-patterns-in-a-nutshell/

 

[번역] 10가지 소프트웨어 아키텍처 패턴 요약

10 Common Software Architectural Patterns in a nutshell을 번역한 글입니다. 대형 엔터프라이즈 규모의 시스템들은 어떻게 설계되었는지에 대해 궁금해 한 적이 있나요? 우리는 주요 소프트

mingrammer.com

 

A: 아키텍쳐 = 설계도, 디자인패턴 = 공법  이란 얘기를 어디서 들었습니다.


A: [루] 그리고 디자인패턴과 아키텍처는 포함 불포함을 고려할 이야기가 아니고, MVC 와 MVVM 이 클린아키텍처에 포함되지 않는 개념이라는 것을 아셔야합니다.

그 세 개념은 각각독립적인 개념이니까요.


A: [김] 개념적으론 독립될순 있지만 실제 구현단에서는 섞어서 쓰는게 많아서 헷갈리는 요소가 많은듯해요

A: [루] 그리고 패턴, 디자인패턴, 아키텍처 는 나눠서 다뤄야할 문제고.  아키텍처랑 클린아키텍처도 구분해서 보셔야하는부분이라는거죠.


A: [김] 네 저도 동의합니당ㅎㅎ. 아키텍쳐 패턴 > 디자인 패턴 이거는 일수도 있고 아닐수도 있어서 [루]님 말씀처럼 분리해서 보시는게 맞는듯해요


Q: 아키텍처와 클린 아키텍처도 구분해서 보아야 하는 이유가 잘 이해가 안갑니다 ㅠㅠ

 

A: [루] 아키텍쳐의 종류 중 하나가 클린 아키텍쳐라는 말입니다.
구분안하다 보면 클린아키텍처를 말하면서 아키텍처에 대한 이야기를 하고 아키텍처라고 쓸 위치에 클린아키텍처를 쓰게 되면 대화가 산으로 가거든요.


Q: 그럼 아키텍쳐 종류 중에 디자인 패턴이 있는게 아니라, 아키텍쳐가 디자인 패턴보다 상위의 개념 이라시는거죠? 개념상으로! 


A: [루]  예 대충 그렇게 생각하고 있어요.

중요 부분만 요약해보자면, 클린 아키텍쳐는 상위 개념의 아키텍쳐이고, 하위의 개념으로 디자인 패턴이 있는것이다. MVC와 MVVM은 개념,정의적인 부분으로 보면 아키텍쳐라고 할수 있다. 상세 내용은 위를 한번 읽어보면 좋겠다.

 

(지금은 MVVM으로 구현을 하며 무슨뜻인지,무슨말을 하려하셨던건지 알게되었다.)

 

클린 아키텍쳐를 공부하다보니, 그 내부의 규칙들에 대해서도 알게되었다.

https://yrok.tistory.com/entry/%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%84%A4%EA%B3%84%EC%9D%98-%EC%9B%90%EC%B9%99Clean-Architecture-3%EB%B6%80-%EC%84%A4%EA%B3%84-%EC%9B%90%EC%B9%99?category=828277 

 

클린 아키텍처:소프트웨어 구조와 설계의 원칙(Clean Architecture) - 3부 : 설계 원칙

좋은 소프트웨어 시스템은 깔끔한 코드로부터 시작한다. 좋은 벽돌로 좋은 아키텍처를 정의하는 원칙이 필요한데, 그게 바로 SOLID다. SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법,

yrok.tistory.com

위에도 적었던 블로그인데, 글들을 모두 읽어보면 좋을것같다. 이중에서도 설계원칙에 대해 공부하고 있다. 좋은 소프트웨어 시스템은 깔끔한 코드로부터 시작한다. 좋은 벽돌로 좋은 아키텍처를 정의하는 원칙이 필요한데, 그게 바로 SOLID다. SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법을 설명해준다. 여기에서 클래스는 단순히 함수와 데이터를 결합한 집합을 가리킨다.

 

SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 아래와 같도록 만드는 데 있다.

-변경에 유연하다.

-이해하기 쉽다.

-컴포넌트의 기반이 된다.

‘중간 수준’이라 함은 프로그래머가 이들 원칙을 모듈 수준에서 작업할 때 적용할 수 있다는 뜻이다.

 

https://dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99

 

SOLID 원칙

프로그래밍 설계를 하다보면 객체지향 5대원칙 또는 SOLID 원칙이란 단어를 들어본 적이 있을 것이다. 당시에 구글링을 하여 찾아보았지만 프로그래밍 내공이 부족하여 잘 이해가 되지 않았다.

dev-momo.tistory.com

전통적인 MVC,MVVM,MVP에 대해서도 공부했는데, 내가 실무에서 겪은 방법과는 조금 차이가 있었다. 하지만 일단 클린 아키텍쳐에 대해서는 감을 잡았다.

 

여기까지다. 생각보다 공부와 정리를 잘 해 뒀었구나 싶다.

현재는 MVVM을 이용하고 적당히 data,view들을 모으고 분리한 정도인데 이번기회에 클린아키텍쳐로 리팩토링할 예정이다. 
현재 내 목표는

  1. AI레포지토리부분을 Corutine을 이용해 리팩토링
  2. 제트팩 컴포즈를 이용해 선언형 UI로 뷰 부분을 더 명확히 작성
  3. Volley에서 Retrofit로 변경
  4. 클린 아키텍쳐로 변경
  5. DI - Dagger Hilt

이렇게가 있다. 일단 제트팩 컴포즈부터 쉽게 뚝딱 바꾸고 아키텍쳐 변경을하고, 12번을 하고 마지막으로 5번을 할생각이였는데, 여러 오픈소스와 프로젝트들을 보니 클린 아키텍쳐로 변경이 최우선 과제로 바뀌었다. 그다음이 DI, 그다음이 제트팩컴포즈다. 제트팩 컴포즈는 단순히 띡 변경할수 있는게 아니였다.. 그래도 리싸이클러뷰가 간단해지는거는 맘에 드는데 상태관리도 필요한거같고.. 일단은 오케이. 클린아키텍쳐부터 적용해보자.