-
Spring) 아키텍처(2) 소프트웨어 아키텍처란?Spring 2024. 11. 4. 20:16
개요
지난글에서 모듈과 멀티모듈에 대해 공부해보았습니다.
이번 글에서는 소프트웨어 아키텍처에 대해 알아보고 지난번에 공부한 멀티모듈의 기본개념을 활용하여 어느 아키텍쳐에 반영할것인지에 대한 작성을 해볼 예정입니다.
소프트웨어 아키텍처를 이해하고 있어야 하는 이유
흔한 주니어 개발자 서버 구조 저같은 주니어 개발자같은경우 서버를 개발하면 보통 기능구현에 대해 중점적으로 생각하지, 트레픽에 대해 생각해본적이 없었을것입니다. (저만 그럴수도)
예를들어 단순 게시판 기능을 만들더라도 이 게시판에 1000만명이 몰린다면?
이러한 단순한 질문 하나에도 굉장히 "많은 처리 기술"이 존재합니다.
주니어를 넘으려면 이러한 문제를 이해하고 극복해 나가야할것입니다.
여기서 문제는 회사에 소속해있기때문에 "많은 처리 기술"에 대해 혼자서 적용하면 이미 서버는 터지고 서비스는 망하고 고객은 줄어들것입니다.
그렇기에 공통된 아키텍처를 통해 "많은 처리 기술"을 함께 개발함으로써 위와같은 상황을 쉽게 극복하는 상황을 만들어야합니다.특히 백엔드 개발자가 소프트웨어 아키텍처를 이해하는 것은 단순히 기능 구현을 넘어 애플리케이션의 유지보수성, 확장성, 성능을 향상시키는 데 필수적입니다. 이를 통해, 더 나은 품질의 소프트웨어를 만들고 문제 해결 능력을 높이며, 팀의 효율적인 협업과 기술 혁신을 지원할 수 있습니다.
아래는 백엔드 개발자가 소프트웨어 아키텍처를 이해해야 하는 주요 이유들입니다.1. 유지보수성과 확장성을 고려한 코드 작성
객체지향을 공부해봤다면 알아야할 SOLID 원칙 - 모듈화: 각 기능을 독립된 모듈로 나누어 개발하고, 필요할 때만 해당 모듈을 수정하도록 하여 유지보수 비용을 낮춥니다.
- 확장성: 데이터베이스 구조, 마이크로서비스 아키텍처, API 게이트웨이 등 확장성을 고려한 아키텍처를 설계함으로써, 애플리케이션이 성장할 때 성능 문제를 줄일 수 있습니다.
2. 비기능적 요구사항 충족
- 성능 최적화: 데이터 처리량이 많은 경우, 분산 처리, 캐싱, 데이터베이스 샤딩 등을 통해 성능을 최적화할 수 있습니다. 아키텍처를 통해 애플리케이션의 병목 지점을 파악하고 이를 효율적으로 해결할 수 있습니다.
- 보안성: 각 계층의 보안 요구사항에 맞춰 설계하여, 예를 들어 사용자 데이터는 서비스 계층에서 처리하고, 보안이 필요한 정보는 암호화하여 데이터베이스에 저장하는 방식으로 보안을 강화할 수 있습니다.
- 장애 대응력: 시스템의 고가용성(HA)과 이중화 구성을 통해 장애 발생 시에도 서비스를 계속 제공할 수 있도록 설계할 수 있습니다.
3. 효율적인 문제 해결과 디버깅
전체적인 아키텍처를 이해하지 못한다면... - 시스템 전반 이해: 각 구성 요소가 어떻게 상호작용하는지 이해하고 있어, 특정 모듈에서 발생한 문제가 전체 시스템에 어떤 영향을 미칠지 판단할 수 있습니다.
- 디버깅과 성능 튜닝: 시스템 내 병목 현상이나 리소스 낭비가 발생하는 지점을 파악해, 데이터베이스 튜닝이나 코드 최적화 등을 통해 성능을 개선할 수 있습니다.
4. 팀 내 협업 및 커뮤니케이션 향상
아키텍처 없이 개발한다면 - 설계 의도 공유: 각 구성 요소가 설계된 이유와 그것이 시스템에 미치는 영향을 이해함으로써, 설계 의도를 명확하게 파악하고 이를 다른 팀원들과 공유할 수 있습니다.
- 공동 목표 달성: 성능, 보안, 확장성 등의 요구사항을 충족하기 위한 목표를 팀 차원에서 공유하고 이를 달성하는 데 있어 개발자 간 협업이 원활해집니다.
5. 미래 기술 적용과 혁신적 개발 가능성
소프트웨어 아키텍처를 잘 이해하고 있으면 새로운 기술이나 디자인 패턴을 애플리케이션에 적용할 때 더 쉽게 혁신을 도입할 수 있습니다. 새로운 아키텍처 패턴이나 기술 스택 도입 시, 기존 아키텍처와 어떻게 통합하고 최적화할 수 있을지 명확하게 이해할 수 있습니다.
소프트웨어 아키텍처란?
소프트웨어 아키텍처는 시스템의 구조와 이를 구성하는 요소 간의 관계, 상호작용을 설계하는 과정과 그 결과물을 의미합니다. 단순히 코드나 기능을 작성하는 것이 아니라, 시스템이 어떻게 구성되고 각 요소들이 어떻게 상호작용하며 변화와 확장에 대응할 수 있을지 미리 계획하는 상위 설계 개념입니다.
소프트웨어 아키텍처의 핵심 요소
- 구성 요소 (Components)
시스템을 구성하는 독립적인 기능 단위입니다. 서비스, 모듈, 서브시스템 등으로 나눌 수 있으며, 각 구성 요소는 특정 기능을 담당합니다. - 관계 (Relationships)
각 구성 요소들이 어떻게 상호작용하는지를 정의합니다. 데이터 흐름, 통신 방식, 의존성 등이 포함되며, 효율적인 데이터 전달과 역할 분담이 가능하도록 설계합니다. - 제약 조건과 원칙 (Constraints and Principles)
시스템 설계에 영향을 주는 특정 제약이나 규칙을 정의합니다. 보안, 성능, 확장성, 유지보수성 같은 요구사항을 고려하여 시스템 전반의 안정성과 일관성을 보장합니다.
소프트웨어 아키텍처의 역할
아키텍처는 개발팀에게 명확한 설계 지침을 제공하고, 시스템의 품질, 유연성, 확장성, 성능을 보장하는 데 중요한 역할을 합니다. 아키텍처 설계는 또한 시스템 내 여러 문제를 미리 예측하고 해결할 수 있도록 돕습니다.
- 확장성: 시스템이 더 큰 트래픽이나 데이터량을 처리할 수 있도록 준비합니다.
- 성능: 자원 사용을 최적화하여 빠르고 효율적인 시스템을 유지합니다.
- 유지보수성: 변화에 잘 대응하도록 구성하여 수정과 업그레이드가 용이하게 만듭니다.
- 보안성: 보안 요구사항을 반영하여 정보 유출이나 외부 공격으로부터 보호합니다.
소프트웨어 아키텍처는 여러가지가 존재하지만, 이번글에서는 가장 대표적인 아키텍처인 Monolithic Architecture 와 MSA 에 대해 작성하려고 합니다.
소프트웨어 아키텍처 종류
여러 글을 보면 여러가지 아키텍처가 그냥 단순하게 소프트웨어 아키텍처라고 퉁쳐서 크게 전달하는게 많습니다.
하물며 gpt 에게 물어봐도 그냥 아키텍처라는것 모두를 알려주는데 모든곳에서 혼동이 생기고있습니다.
제가 찾아보았을때는 "소프트웨어 아키텍처" 라는건 너무나도 큰 개념이라 이곳저곳에 들어가있지만 서버입장에서 바라보았을때 크게 2가지 개념이 존재하는것으로 보여집니다.
1. 시스템 전체의 구조적 방식
시스템 전체의 구조적 방식은 시스템의 구성 요소를 어떻게 배치하고 상호작용하게 할지에 대한 방식을 정의합니다. 이는 애플리케이션의 성능, 유지보수성, 확장성 등에 큰 영향을 미칩니다. 대표적인 구조적 방식은 아래와 같습니다.
1)모놀리식 아키텍처 (Monolithic Architecture)
2) 마이크로서비스 아키텍처 (Microservices Architecture)
3)서비스 지향 아키텍처 (Service-Oriented Architecture, SOA)
등등....
자세한 내용는 다음글에 작성하겠습니다.
2. 애플리케이션 내부의 코드 구성 방식
애플리케이션 내부의 코드 구성 방식은 코드를 논리적으로 구성하고 기능별로 분리하여 애플리케이션의 유지보수성과 확장성을 높이는 데 중점을 둔 아키텍처 패턴입니다. 애플리케이션이 커지더라도 코드의 복잡성을 관리하고, 각 부분을 독립적으로 개발, 테스트, 배포할 수 있도록 돕습니다. 대표적인 코드 구성 방식은 다음과 같습니다.
1. 계층형 아키텍처 (Layered Architecture)
2) 헥사고날 아키텍처 (Hexagonal Architecture)
3) 클린 아키텍처 (Clean Architecture)
출처 : https://www.aslog.kr/clean-architecture 등등....
자세한 내용는 다음글에 작성하겠습니다.
결론
많은 경우 학원, 학교, 회사 등 여러 환경에서 아키텍처에 대한 깊이 있는 이해 없이도 관습적으로 Dto, Service 같은 패턴을 사용하게 됩니다. 이로 인해 아키텍처가 탄생한 배경과 목적, 그리고 이를 통해 이루고자 하는 개발 방식에 대한 이해가 부족한 상태에서 단순히 형식에 따라 코드를 작성하게 되는 경우가 많습니다. 이러한 접근은 결국 시스템의 구조와 의도를 고려하지 않은 채로 기능을 추가하게 만들고, 결과적으로 프로젝트가 확장되거나 유지보수 단계에 이르렀을 때 큰 문제를 야기할 수 있습니다.
따라서 아키텍처의 개념과 원리를 제대로 공부하고 이해하여, 현재와 미래의 개발 과정에서 발생할 수 있는 문제를 사전에 예방하는 것이 중요합니다. 이를 통해 자신뿐만 아니라 다른 개발자들도 코드를 쉽게 이해하고 유지보수할 수 있는 환경을 조성할 수 있을 것입니다. 다음 장에서는 이러한 아키텍처의 개념과 목적을 더욱 자세히 설명할 예정입니다.
'Spring' 카테고리의 다른 글
Java) 클래스 파일과 바이트 코드 (0) 2024.11.14 Spring) 아키텍처(3) 모노리스 VS MSA (4) 2024.11.08 Spring) 아키텍처(1) 모듈, 멀티모듈 (3) 2024.11.02 Java) Checked Exception, Unchecked Exception 그리고 Error (0) 2024.09.01 Spring) @Autowired 와 생성자 주입(Constructor Injection) (0) 2024.08.27