안녕하세요~! toma🍅 입니다.
여러분들 혹시 소프트웨어 아키텍처와 디자인 패턴에 대해 알고 계신가요?
프로젝트를 하면서 MVC, MVVM, 클린 아키텍쳐 등등을 들어본 적이 있고 또 사용해본적이 있는데요... 누가 정확히 이런 키워드에 대해서 설명하라고하면..음..ㅎㅎ
사용하면서도 그 의미에 대해 모르고 있는 건 아무래도 바람직하지 않으니, 이번 포스팅에서 간단하 정리해보려고 합니다!
- 소프트웨어 시스템의 기본 구조와 그러한 구조 및 시스템을 만드는 분야
- 각 구조는 소프트웨어 요소, 이들 간의 관계, 요소와 관계의 속성으로 구성
- 시스템 및 개발 프로젝트의 청사진 역할을 하며 설계 팀이 실행하는 데 필요한 작업을 제시함
1. 모듈화
시스템의 기능들을 모듈 단위로 나누는 것 _ 이때 모듈 개수는 적당히. 너무 많을 경우 통합 비용이, 너무 적을 경우 모듈 하나의 개발 비용이 많이 들게 됨.
2. 추상화
전체적이고 포괄적인 개념 설계 -> 차례로 세분화 / 구체화
3. 단계적 분해
문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키며 분할
4. 정보 은닉
한 모듈 내부에 포함된 절차와 자료를 숨기며 독립적 수행을 가능캐 해, 다른 모듈이 접근하거나 변경하지 못하게 하기
그니까 소프트웨어 시스템의 구조라는 건 이름에서부터 알겠는데, 확실히 감이 오지 않네요.
그래서 계속 서치하면서 Refactoring의 저자인 마틴 파울러가 소프트웨어 아키텍쳐의 중요성에 대해 말하는 영상을 보게 되었습니다.
개발자로서 프로젝트에 참여할 때 가장 어려운 점 두가지는
지식을 공유하는 것
과 결정을 바꾸는 것
인데요.
아키텍쳐나 디자인에 대해 고려하지 않는다면
기능 추가를 위해 소스코드를 많이 변경해야 될 것이고, 이는 경제적인 관점에서 매력적인 소프트웨어가 아닙니다.
좋은 아키텍쳐와 디자인이라면
기존의 소스코드가 플랫폼화되고 빠른 속도로 기능을 추가할 수 있게 됩니다.
결론적으로 소프트웨어 아키텍쳐는 소프트웨어의 내부적인 질을 높이기위해 고려되는 소프트웨어의 구조인 것이네요!
이제 슬슬 소프트웨어 아키텍쳐가 무엇인지 감이 옵니다...
그리고 이런 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대해 일반화된 솔루션을 제공하는 것이 바로 소프트웨어 아키텍쳐 패턴이죠.
쉽게 말하면 소프트웨어 아키텍쳐 패턴은 자주 사용되고, 이미 검증된 소프트웨어 아키텍쳐의 패턴!
참고 [번역] 10 Common Software Architectural Patterns in a nutshell
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
일반적으로 많이 사용되는 10가지 소프트웨어 아키텍쳐 패턴입니다.
익숙한 MVC가 보이네요. MVC 뿐만 아니라 MVVM도 아키텍쳐 패턴에 해당되는 걸 알 수 있습니다!
이제 소프트웨어 아키텍쳐도 알겠고 아키텍쳐 패턴도 알겠는데...
그럼 디자인 패턴은 뭔데..?
위키피디아 - Software Design Pattern
소프트웨어 디자인에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책.
상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 템플릿을 의미한다. 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 패턴이다.
??..
그래서 아키텍쳐 패턴이랑 대체 뭐가 다른건데....
Software Architecture - The Difference Between Architecture and Design
소프트웨어 아키텍처가 한 소프트웨어의 뼈대나 고수준의 기반을 담당하는데에 반해, 소프트웨어 디자인은 각각의 모듈들이 어떤 것을 하는지, 클래스의 범위, 함수의 목적 등 코드 수준의 디자인을 담당하는 것입니다.
그러니까 둘다 공통적으로 발생하는 문제에 대해 일반화된 솔루션을 제공하는 점은 같으나, 아키텍쳐는 더 큰 뼈대를 말하고 디자인 패턴은 코드 수준에서의 설계를 담당하는 것이군요.
그렇다고 해서 디자인 패턴을 아키텍쳐 패턴에 포함되는 하위개념이라고 보긴 어려울 것 같고 아키텍쳐가 더 큰 범주, 디자인 패턴이 더 작은 범주의 설계를 담당한다고 이해하면 될 것 같습니다.
생성 패턴 | 구조 패턴 | 행동 패턴 |
---|---|---|
싱글톤 (Singleton) 팩토리 메소드 (Factory Method) 추상 팩토리 (Abstract Factory) 빌더 (Builder) 프로토타입 (Prototype) | 어댑터 (Adapter) 브릿지 (Bridge) 컴포짓 (Composite) 데코레이터 (Decorator) 퍼사드 (Facade) 플라이웨이트 (Flyweight) 프록시 (Proxy) | 책임 연쇄 (Chain-of-Responsibility) 커맨드 (Command) 인터프리터 (Interpreter) 이터레이터 (Iterator) ade) 중재자 (Mediator) 메멘토 (Memento) 옵저버 (Observer) 상태 (State) 전략 (Strategy) 템플릿 메소드 (Template Method) 비지터 (Visitor) |
싱글톤이나 팩토리 메소드, 추상 팩토리, 옵저버 등 자주 들어본 단어들이 보이네요!
이번 포스팅에서는 간단히 소프트웨어 아키텍쳐는 무엇이고, 아키텍쳐 패턴과 디자인 패턴의 차이점에 대해서만 정리해보았습니다. 추후 포스팅에서 iOS에서 주로 사용되는 아키텍쳐 패턴과 디자인 패턴에 대해 더 자세히 다뤄보겠습니다!
잘못된 정보가 있다면 언제든지 댓글로 알려주세요! 읽어주셔서 감사합니다 :)
잘못된 정보는 잘 모르겠고.. 글이 참 잼나네요 ㅎ