디자인 패턴 - Design Pattern
디자인 패턴이란,
소프트웨어를 개발 및 설계하며 자주 발생하는 반복적 문제를 해결책을 제공하는 템플릿이다.
즉, ~~한 상황에서는 OO을 사용하면 좋다! 정도의 패턴화된 해결책을 개발자에게 제공하는 것
객체지향의 특성(추상화, 캡슐화, 다형성, 상속) 및 SOLID 원칙을 기반으로 구현되어있다.
크게 생성(Creational), 구조(Structural), 행위(Behavioral)로 구분지을 수 있다.
장점
- 재사용성 : 반복적인 문제에 대해 일반적인 해결책을 제공한다.
이를 통해 유사한 상황을 쉽게 해결할 수 있다.
- 가독성 : 일정 구조로 정리하여 코드에 대한 이해 및 유지보수성을 높인다.
- 유지보수성 : 코드를 쉽게 모듈화 할 수 있으며,
변경이 필요한 경우 해당 모듈만 수정한다.
- 확장성 : 새로운 기능을 추가 및 변경할 때 기존 코드에 대한 변화를 최소화하며 확장할 수 있다.
- 안정성 및 신뢰성 : 패턴화한 사례를 통해 검증된 솔루션을 제공한다.
단점
- 초기 투자 비용의 부담 : 초기 설계 및 개발 과정에서 시간적 소모가 많이 필요하다.
- 기술적 허들 : 다양한 패턴을 학습하고 적용하는데 일정 수준 이상의 기술적 역량이 수반된다.
디자인 패턴의 구성 요소
- Context : 문제가 발생하는 상황, 패턴이 적용될 수 있는 상황
- Problem : 패턴을 적용해 해결할 수 있는 디자인 이슈
이때, 여러 Constraints 및 영향력을 함께 고려
- Solution : 문제를 해결하도록 설계를 구성하는 요소들 및 요소들 간의 관계, 책임, 협력 관계
- Result : 패턴 사용의 결과, 이점 및 잠재적 단점 포함
생성 패턴 : Creational Patterns
객체의 생성, 조합을 캡슐화하여, 특정 객체의 생성 및 변경에 프로그램의 구조가 크게 영향을 받지 않도록 유연성을 제공
- Singleton : 싱글톤
- 어떤 클래스의 인스턴스는 하나임을 보장하고
이를 전역에서 접근 가능하게 해,
해당 인스턴스가 한 번만 생성되도록 보장하는 패턴
- Factory Method : 팩토리 메소드
- 객체 생성을 서브 클래스(하위 클래스)로 위임
- Abstract Factory : 추상 팩토리
- 구체적인 클래스 지정없이, 관련된 객체 그룹을 생성할 수 있게 인터페이스를 제공
- Builder : 빌더
- 복합 객체의 생성을 단계적으로 수행하며, 동일한 생성 절차에서도 다른 표현 결과를 만들어낼 수 있게함
- Prototype : 프로토타입
구조 패턴 : Structural Patterns
클래스와 객체를 조합해 더 큰 구조를 형성하며, 코드의 확장성과 유연성을 높임
- Adapter : 어댑터
- 서로 다른 인터페이스를 가진 객체 간의 호환을 위해 Wrapper를 제공
- Bridge : 브리지
- 추상화와 구현을 분리해 독립적으로 확장할 수 있게함
- Composite : 컴포지트
- 복합 객체와 단일 객체를 동일 취급해 트리 구조로 객체들의 관계를 표현
- Decorator : 데코레이터
- 주어진 상황 및 용도에 따라 객체에 동적으로 기능을 추가해 확장
- Facade : 퍼사드
- 복잡한 서브 시스템에 간단한 통합 인터페이스를 제공해 사용성을 향상
- Flyweight : 플라이웨이트
- 공유 가능한 객체를 활용해 크기가 작은 여러 객체를 매번 생성하지 않으며 메모리 사용을 감소
- Proxy : 프록시
- 객체 사이에 Proxy 객체(대리 객체)를 두어 간접적 접근 제공
행위 패턴 : Behavioral Patterns
객체 간의 상호작용과 책임 분산을 다루어 결합도(Coupling
)을 줄이고, 코드의 유연성을 높임
- Observer : 옵저버
- 한 객체의 상태 변화가 발생하면, 관련 객체들에게 자동으로 변화를 통지해 갱신
- Strategy : 스트레이트지
- 동일 계열 알고리즘을 개별 클래스로 분리 정의해, 동적으로 교체하고 상호교환을 가능하게 함
- Command : 커맨드
- 요청 작업을 캡슐화하여 객체로 변환해 재사용 및 취소할 수 있게 저장
- Template Method : 템플릿 메소드
- 상위 클래스는 알고리즘의 구조만 정의, 세부 구현은 하위 클래스에서 처리
- Chain of Responsibility : 책임 연쇄
- 요청을 처리할 객체를 결정하지 않고 전달하며, 처리 가능한 객체를 만날 때까지 객체 Chain을 따라 요청 전달
- Memento : 메멘토
- 객체의 내부 상태를 실체화 및 저장해, 특정 상태로 다시 복원할 수 있게함
- Iterator : 반복자
- 집합체의 요소를 순차적으로 접근할 수 있게 함
- 내부를 노출하지 않고, 객체의 원소를 순차적으로 접근할 수 있는 동일 인터페이스 제공
- Meditator : 중재자
- 객체 간의 통신을 중개하여 직접적 의존성을 줄이고, 느슨한 결합 유지
- 객체 간의 상호작용을 캡슐화해 새로운 객체(중재자 객체) 정의
요약
- 생성 패턴은 객체의 생성 방식에 유연성을 제공
- 구조 패턴은 클래스와 객체를 조합해 더 큰 구조를 형성, 확장성 제공
- 행위 패턴은 객체 간의 상호작용 및 책임 분산을 정의
아키텍처 패턴과 디자인 패턴의 차이
아키텍처 패턴
- 시스템 전체의 구조적 틀을 제공해 전체 컴포넌트 간의 상호작용 정의
- 주로 소프트웨어 설계 초기 단계에서 결정
디자인 패턴
- 주로 모듈 또는 클래스 수준에서 적용, 특정 문제 상황에 대해 객체 간의 관계 및 상호작용 최적화에 초점
- 주로 개발 중반이나 후반에 구체적인 기능을 구현하는 과정에서 발생하는 문제에 대한 해결책 및 방안
아키텍처 패턴은 디자인 패턴보다 상위 수준의 설계
마치며...
다음엔 React
환경에서 디자인 패턴이 적용되는 사례에 대해 알아보겠다.
[참고자료]