Skip to content

Commit

Permalink
Post: 클린아키텍처 글 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
yiyb0603 committed Jan 25, 2024
1 parent 574597e commit 90ff15d
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions posts/Develop/clean-architecture.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
title: Clean Architecture, 간단하게 알아보기
description: 소프트웨어 아키텍처 중 하나인 클린아키텍처에 대해서 알아봅시다.
createdAt: 2024-01-25
thumbnail: /images/posts/develop/clean-architecture/thumbnail.png
---

안녕하세요! 오늘은 소프트웨어 아키텍처 중 하나인 `클린아키텍처(Clean Architecture)`에 대해서 알아보겠습니다.

저는 지금까지 프론트엔드 개발을 하면서 `클린아키텍처`를 접해볼 일이 없어서 잘 모르고 있었는데, 다른 분야(모바일, 서버)쪽 에서는 클린아키텍처를 사용하는곳이 많더라고요. 저는 그래서 이참에 클린아키텍처의 개념을 알아보았고, 이를 토대로 정리해보겠습니다.

## 1. 클린아키텍처란? 🔍

`클린아키텍처``로버트 C. 마틴`이 제안한 아키텍처로, 소프트웨어의 수많은 아키텍처 중 `추상화 개념`으로 **관심사를 분리시키고 의존성을 낮추는것을 목적**으로 한 아키텍처 입니다.

![클린아키텍처 구조](/images/posts/develop/clean-architecture/structure.png)

위의 이미지는 클린아키텍처를 나타내는 구조 사진으로, 한번쯤은 다들 보셨을겁니다. 동그란 원에서 제일 안에 위치한 계층도 있는 반면에 제일 바깥에 위치한 계층도 볼 수 있는데요. 계층의 위치에 따라서 어떤 특징이 있는걸까요?

<br />

클린아키텍처의 기본적인 원리는 `종속성 규칙(Dependency Rule)`을 지키는 것인데요. 이 `종속성 규칙`을 지키기 위해서 클린아키텍처는 위 사진의 동그란 원모양 계층에서 **바깥쪽 -> 안쪽** 방향으로만 가리켜야 한다는 특징을 가집니다.

위 사진을 예로 들었을때 **빨간색 영역은 노란색 영역을 참조할 수 있지만, 노란색 영역은 빨간색 영역이 누군지 모르는 특징**을 지닙니다. 코드로 비유하자면, **빨간색 영역의 코드를 변경했을때 노란색 영역의 코드를 변경해서는 안된다**라고 알 수 있습니다.

<br />

따라서 `고수준 정책(High level policy)``저수준 정책(Low level policy)`의 변경에 영향을 받지 않아야 한다는 규칙을 가집니다.

> `고수준 정책`: 애플리케이션의 핵심 비즈니스 규칙과 로직을 정의, UI 및 프레임워크에 영향을 받지 않음 (Entities, UseCases)
> `저수준 정책`: 시스템의 구체적인 세부사항을 다루며 변화가 잦은 UI, 프레임워크 등의 영역
또한 객체지향 설계 원칙에 해당하는 `SOLID`도 규칙에 해당합니다. [(SOLID 원칙이란?)](<https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)>)

## 2. 계층별 특징 🪜

![클린아키텍처 구조](/images/posts/develop/clean-architecture/structure.png)

그렇다면 이 클린아키텍처의 구조에 나와있는 각 계층들인 Entities, UseCases 등등의 계층이 무엇이며, 각 특징들에 대해서 알아보겠습니다.

### 2-1. 엔티티 (Entities)

흔히 `도메인 계층`으로 불리며 애플리케이션의 핵심 데이터 구조 또는 DB나 네트워크 통신을 통해서 가져오려는 데이터 객체 혹은 타입들이 위치해있습니다.

가장 안쪽에 위치한 계층이기에 의존성을 갖지않고, 다른 계층의 변경에대해 영향을 받지 않아야합니다.

<br />

만약 ``이라는 데이터를 DB나 네트워크에서 가져오는 서비스라면, 책이 갖는 속성(제목, 지은이, 출판사 등)들에 대한 정보가 작성된 클래스, 타입 등이 엔티티 계층에 해당됩니다.

### 2-2. 유즈케이스 (UseCases)

흔히 `애플리케이션 계층`으로 불리며 애플리케이션에서 사용될 수 있는 모든 비즈니스 로직을 의미합니다. (쉽게말하자면 시스템이 사용자에게 제공하는 각종 기능들을 의미합니다.)

<br />

만약 `도서관` 시스템을 만든다라고 가정했을때 들어갈 수 있는 기능은 아래처럼 존재할 수 있습니다.

- 회원가입, 로그인
- 내가 대출한 책 목록 가져오기
- 책 대출 및 반납하기
- 책 목록 가져오기
- ... (중략)

위처럼 사용자에게 제공하는 모든 기능을 유즈케이스에서 로직을 작성할 수 있습니다.

그리고 한가지 예외가 있는데, 애플리케이션의 특정 기능 컨셉이 변경되는경우에 유즈케이스에 영향을 받을 수 있습니다.

### 2-3. 인터페이스 어댑터 (Interface Adapters)

인터페이스 어댑터 계층은 `유즈케이스``UI, 프레임워크 계층`의 사이에 위치하여 **데이터를 변환하는 역할**을 수행합니다.

<br />

외부에서 들어오는 데이터는 유즈케이스와 엔티티에서 처리하기 쉽게 변환하고, 외부로 나가는 데이터는 외부 인터페이스에서 처리하기 쉽게 변환합니다. (컨트롤러, 프레젠터, 게이트웨이 등)

### 2-4. 프레임워크와 드라이버 (Framework & Driver)

흔히 `인프라 계층(Infrastructure)`으로 불리며 DB, UI, 프레임워크 등의 세부정보를 나타내는 계층입니다.

<br />

가장 외부에 위치한 계층이기에 시간이 지남에따라 자주 구성이 변경된다는 특징이 있으며, 내부 계층에 영향을 주어서는 안됩니다.

## 3. 마치며 📌

오늘은 클린아키텍처란 무엇이며, 각 계층이 갖는 특징을 간단하게 알아봤습니다.

<br />

이번에 클린아키텍처를 공부하며, 코드로 프론트엔드 프로젝트에 실제로 적용해보는것은 제가 더 학습이 필요할것 같다는 생각이 들더라고요. [느슨한 결합](https://yozm.wishket.com/magazine/detail/1926)[의존성 주입](https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85) 활용을 상황별로 알맞게 할 수 있도록 더 공부를 해봐야겠습니다. 😀

<br />

이상으로 글을 마치도록 하겠습니다. 글 읽어주셔서 감사합니다!
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 90ff15d

Please sign in to comment.