| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- GridLayout
- Position
- oracle
- 상속
- css 기초
- 예제
- 반응형 웹 프로젝트
- ObjectOutputStream
- html 프로젝트
- rnn
- CSS
- 퍼셉트론
- 사전학습
- 반응형웹
- iframe 태그
- 메서드
- java
- FlowLayout
- 미디어쿼리
- Database
- html 기초
- 파이썬
- BorderLayout
- HTML
- inline
- 푸리에 변환
- FFT
- FileWriter
- Codility
- g검정
- Today
- Total
도라에몽주머니
소프트웨어 아키텍처 ; 어니언 아키텍처 본문
사내에서 진행하는 테스트 코드 작성 그랑프리에 참여했다. 결과적으로 시간 내에 구현하지 못해 입상하진 못했지만 팀 멤버들과 코드 회고를 하며 이번 그랑프리에 사용된 백엔드 아키텍처가 어니언 아키텍처(Onion Architecture) 라는 것을 알 게 되었다.
그냥 구현과 재사용성을 위해 코드를 나누어두었다고만 생각했는데 이러한 소프트웨어 아키텍처를 따라 작성되었다니,,,
잊기 전에 내 블로그에 정리해보려고 한다.
소프트웨어 아키텍처
우선, 소프트웨어 아키텍처란 무엇일까?
위키피디아에 따르면 소프트웨어 아키텍처란 소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙 이다.
기본 원리
- 모듈화 : 소프트웨어의 성능을 향상하거나 시스템의 수정 및 재사용, 유지관리 등이 용이하도록 시스템의 기능들을 모듈 단위로 나누는 것
- 추상화 : 문제의 전체적이고 포괄적인 개념을 설계한 후, 차례로 세분화해 구체화 하는 것
- 단계적 분해 : 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법
- 정보 은닉 : 한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법
중요성
그렇다면 소프트웨어 아키텍처는 개발에 있어서 왜 중요한 것일까? 어찌되든 코드를 작성해 하나의 서비스나 시스템이 완성되면 끝 아닌가?
소프트웨어가 커지고 성장하게 되면 아래 두 가지 문제가 발생할 수 있다.
- shared understanding : 지식의 공유. 즉, 프로젝트 팀원 간 프로젝트에 대한 이해도를 잘 공유하는 것이 어려움.
- hard to change : 한번 결정된 것은 변경하기 어려움.
그렇기 때문에, 우선적으로 아키텍처 디자인을 결정한다면 지식의 공유가 용이해지고 기존의 소스코드를 플랫폼화 하는 등의 과정을 통해 바꾸기 어려운 것들을 바꾸기 쉽게 할 수 있다.

종류
일반적으로 많이 사용되는 10가지 소프트웨어 아키텍처 패턴은 아래와 같다.
- Layered-pattern
- Client-server pattern
- Master-slave pattern
- Pipe-filter pattern
- Broker pattern
- Peer-to-peer pattern
- Event-bus pattern
- Model-view-controller pattern
- Blackboard pattern
- Interpreter pattern
정보처리기사 시험에서도 한번 본것같은 패턴들이,,,
어니언 아키텍처
그렇다면 어니언 아키텍처란 무엇일까? 어니언 아키텍처(Onion Architecture) 란 애플리케이션의 기능과 목적에 따라 애플리케이션의 코드를 계층화하는 접근 방식을 의미한다.
Onion, 즉 양파는 중심을 여러개의 껍질이 감싸고 있듯이 어니언 아키텍처도 중앙 코어를 여러 겹의 레이어로 겹치고 있는 형태를 띈다. 가장 바깥쪽 레이어를 통과해야만 코어(중심) 에 접근할 수 있으며 외부에서 내부로 결합 흐름을 가지는 아키텍처이다.

계층 구성
도메인 모델, 도메인 서비스, 애플리케이션 서비스, 인프라 총 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 |