도라에몽주머니

소프트웨어 아키텍처 ; 어니언 아키텍처 본문

Study

소프트웨어 아키텍처 ; 어니언 아키텍처

에몽쓰 2024. 7. 23. 16:23

사내에서 진행하는 테스트 코드 작성 그랑프리에 참여했다. 결과적으로 시간 내에 구현하지 못해 입상하진 못했지만 팀 멤버들과 코드 회고를 하며 이번 그랑프리에 사용된 백엔드 아키텍처가 어니언 아키텍처(Onion Architecture) 라는 것을 알 게 되었다.

그냥 구현과 재사용성을 위해 코드를 나누어두었다고만 생각했는데 이러한 소프트웨어 아키텍처를 따라 작성되었다니,,,

잊기 전에 내 블로그에 정리해보려고 한다.

 

소프트웨어 아키텍처

우선, 소프트웨어 아키텍처란 무엇일까?

위키피디아에 따르면 소프트웨어 아키텍처소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙 이다.

기본 원리

  • 모듈화 : 소프트웨어의 성능을 향상하거나 시스템의 수정 및 재사용, 유지관리 등이 용이하도록 시스템의 기능들을 모듈 단위로 나누는 것
  • 추상화 : 문제의 전체적이고 포괄적인 개념을 설계한 후, 차례로 세분화해 구체화 하는 것
  • 단계적 분해 : 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법
  • 정보 은닉 : 한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법

중요성

그렇다면 소프트웨어 아키텍처는 개발에 있어서 왜 중요한 것일까? 어찌되든 코드를 작성해 하나의 서비스나 시스템이 완성되면 끝 아닌가?

소프트웨어가 커지고 성장하게 되면 아래 두 가지 문제가 발생할 수 있다.

  • shared understanding : 지식의 공유. 즉, 프로젝트 팀원 간 프로젝트에 대한 이해도를 잘 공유하는 것이 어려움.
  • hard to change : 한번 결정된 것은 변경하기 어려움.

그렇기 때문에, 우선적으로 아키텍처 디자인을 결정한다면 지식의 공유가 용이해지고 기존의 소스코드를 플랫폼화 하는 등의 과정을 통해 바꾸기 어려운 것들을 바꾸기 쉽게 할 수 있다.

종류

일반적으로 많이 사용되는 10가지 소프트웨어 아키텍처 패턴은 아래와 같다.

  1. Layered-pattern
  2. Client-server pattern
  3. Master-slave pattern
  4. Pipe-filter pattern
  5. Broker pattern
  6. Peer-to-peer pattern
  7. Event-bus pattern
  8. Model-view-controller pattern
  9. Blackboard pattern
  10. Interpreter pattern

정보처리기사 시험에서도 한번 본것같은 패턴들이,,,

 

어니언 아키텍처

그렇다면 어니언 아키텍처란 무엇일까? 어니언 아키텍처(Onion Architecture)애플리케이션의 기능과 목적에 따라 애플리케이션의 코드를 계층화하는 접근 방식을 의미한다.

 

Onion, 즉 양파는 중심을 여러개의 껍질이 감싸고 있듯이 어니언 아키텍처도 중앙 코어를 여러 겹의 레이어로 겹치고 있는 형태를 띈다. 가장 바깥쪽 레이어를 통과해야만 코어(중심) 에 접근할 수 있으며 외부에서 내부로 결합 흐름을 가지는 아키텍처이다.

https://dev.to/barrymcauley/onion-architecture-3fgl

계층 구성

도메인 모델, 도메인 서비스, 애플리케이션 서비스, 인프라 총 4개의 레이어로 구성된다.

  • 도메인 모델(Domain Model Layer) : 데이터 구조에 중점을 둠. 이 시스템에서 어떠한 데이터가 필요한지 등을 간략하게 정의.
  • 도메인 서비스(Domain Service Layer) : 이 시스템에서 반드시 구현해야되는 기능을 추상화 함. 이 계층에서 구현할 필요는 없으며, 애플리케이션 서비스 계층이나 인프라 계층에서 구현해야 하는 기능들을 추상화 함.
  • 애플리케이션 서비스(Application Service Layer) : 이 시스템(애플리케이션) 의 비즈니스 로직을 실행하는 애플리케이션 로직을 구성함. 예를 들면, try-catch 문을 사용해 에러 처리를 한다던지 등의 구현이 이 계층에서 이루어짐.
  • 인프라(Infrastructure Layer) : 실질적인 기능을 작성하는 곳이라고도 볼 수 있음. 데이터베이스, API, 외부 서비스 등 외부 엔티티와 통신하는 부분이 이 계층에서 작성됨.

장점

  • 확장성 : 모듈식 레이아웃을 사용하기에 애플리케이션 확장에 용이함. 기존에는 특정 코드를 수정하면 그 코드에 영항을 받는 다른 부분까지 수정이 필요했지만 어니언 아키텍처는 독립적 구성요소를 가지므로 이러한 문제가 발생할 가능성이 적음.
  • 테스트 가능성 : 각 계층을 독립적으로 분리하므로 각 구성 요소의 기능을 검증하는 단위 테스트가 가능해짐. 또한, 더 간단히 오류를 찾고 수정할 수 있음.
  • 유지 보수성 : 각 계층이 고유한 기능을 갖고, 인터페이스를 통해 다른 계층과 통신하기 때문에 다른 계층에 영향을 주지 않고 유지 보수가 가능함.
  • 유연성 : 계층이 분리되어 있어, 다른 시스템 구성요소를 변경하지 않고도 구성 요소를 교체하거나 업데이트 할 수 있음.

'Study' 카테고리의 다른 글

[Google Colaboratory] 구글 코랩으로 시크릿(Secrets) 관리하기  (0) 2024.07.19
[GitHub] GitHub Actions 란?  (0) 2024.05.29
[CI/CD] CI/CD 란 무엇일까?  (0) 2024.05.29
[Git] 깃(Git)과 깃허브(Github)  (0) 2024.05.18
[App] Monaca란?  (0) 2024.05.07