디자인 패턴

기성·2025년 8월 11일
1

TIL

목록 보기
89/92

디자인 패턴란? 🤔

디자인 패턴은 소프트웨어 설계에서 반복적으로 발생하는 문제에 대한 재사용 가능한 해결책이다. 건축가가 건물을 지을 때 흔히 사용하는 설계 방식이 있듯이, 소프트웨어 개발에서도 특정 문제를 해결하는 데 효과적인, 이미 검증된 '설계 템플릿'이라고 생각하면 이해하기 쉽다.

'GoF(Gang of Four)'라 불리는 "Design Patterns: Elements of Reusable Object-Oriented Software"에서 처음으로 23가지 디자인 패턴을 소개하면서 널리 알려지게 되었다.

왜 디자인 패턴을 사용해야 할까? ✨

코드의 재사용성 및 유지보수성 향상: 이미 검증된 패턴을 사용함으로써 불필요한 코드 중복을 줄이고, 코드의 가독성을 높여 유지보수를 용이하게 한다.

  • 개발 시간 단축: 바퀴를 재발명할 필요 없이, 이미 존재하는 효과적인 해결책을 활용하여 개발 시간을 단축할 수 있다.

  • 의사소통 효율 증대: 개발자들 사이에서 공통된 용어와 개념을 사용하여 설계에 대한 의사소통을 명확하고 효율적으로 만든다. "우리 이 부분은 싱글턴 패턴으로 가자!"고 했을 때, 모두가 무엇을 의미하는지 안다면 팀워크는 훨씬 더 견고해질 것이다.

  • 시스템의 유연성 및 확장성 증대: 변화에 유연하게 대처하고, 새로운 기능을 쉽게 추가할 수 있는 견고한 시스템을 설계하는 데 도움을 준다.

어떤 디자인 패턴들이 있을까? 📚

디자인 패턴은 크게 세 가지 범주로 나눌 수 있다.

  • 생성 패턴 (Creational Patterns): 객체 생성 메커니즘을 다룬다. 객체를 생성하는 방식을 캡슐화하여 시스템의 유연성을 높인다.

    • 싱글턴 (Singleton): 클래스의 인스턴스를 하나만 생성하고, 어디서든 접근할 수 있도록 한다. (예: 설정 관리자, 데이터베이스 연결 풀)

    • 팩토리 메서드 (Factory Method): 객체를 생성하는 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하도록 한다.

    • 추상 팩토리 (Abstract Factory): 구체적인 클래스를 지정하지 않고 관련 객체들의 묶음을 생성하기 위한 인터페이스를 제공한다.

    • 빌더 (Builder): 복잡한 객체를 단계별로 구축할 수 있도록 한다.

    • 프로토타입 (Prototype): 기존 객체를 복사하여 새로운 객체를 생성한다.

  • 구조 패턴 (Structural Patterns): 클래스와 객체들을 조합하여 더 큰 구조를 만든다. 서로 다른 인터페이스를 가진 클래스들을 어떻게 연결할지 정의한다.

    • 어댑터 (Adapter): 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 변환한다.

    • 데코레이터 (Decorator): 객체에 동적으로 새로운 기능을 추가한다. 기존 객체의 구조를 변경하지 않고 기능을 확장할 때 유용하다.

    • 컴포지트 (Composite): 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현한다. 클라이언트가 개별 객체와 객체 컬렉션을 동일하게 다룰 수 있도록 한다.

    • 프록시 (Proxy): 특정 객체에 대한 접근을 제어하기 위해 대리인(proxy) 객체를 둔다.

    • 퍼사드 (Facade): 서브시스템에 있는 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 복잡한 서브시스템을 쉽게 사용할 수 있도록 한다.

    • 브리지 (Bridge): 구현부에서 추상층을 분리하여, 서로 독립적으로 확장할 수 있도록 한다.

  • 행위 패턴 (Behavioral Patterns): 객체들 간의 알고리즘이나 책임 분배에 관련된 패턴이다. 객체들이 어떻게 상호작용하고 책임을 분담하는지 정의한다.

    • 옵저버 (Observer): 한 객체의 상태가 변경될 때, 그 객체에 의존하는 다른 객체들에게 알림이 가고 자동으로 업데이트되도록 한다. (예: 이벤트 시스템, 구독-알림 서비스)

    • 전략 (Strategy): 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하여 상호 교환 가능하게 만든다. 런타임에 알고리즘을 선택할 수 있도록 한다.

    • 커맨드 (Command): 요청을 객체로 캡슐화하여, 요청을 매개변수화하고, 요청을 큐에 저장하거나 로깅하며, undo 가능한 작업을 지원한다.

    • 템플릿 메서드 (Template Method): 알고리즘의 뼈대(템플릿)를 정의하고, 특정 단계를 서브클래스에서 구현하도록 한다.

    • 이터레이터 (Iterator): 컬렉션의 내부 표현을 노출하지 않고 그 요소들을 순회할 수 있는 방법을 제공한다.

    • 스테이트 (State): 객체의 내부 상태가 바뀜에 따라 객체의 행위가 바뀌도록 한다.

    • 체인 오브 리스폰서빌리티 (Chain of Responsibility): 요청을 처리할 수 있는 기회를 여러 객체에게 부여하여, 객체들을 연결하여 요청을 전달한다.

profile
프론트가 하고싶어요

0개의 댓글