[Design Pattern] 실무에서 많이 사용하는 디자인 패턴(Design Pattern) 간략 정리
디자인 패턴이란?
디자인 패턴은 소프트웨어 디자인에서 반복적으로 발생하는 문제들에 대한 검증된 해결책, 즉 일종의 ‘모범 사례’입니다.
특정 맥락에서 발생하는 일반적인 문제에 대한 재사용 가능한 해결책을 설명하는 템플릿이라고 생각하시면 됩니다. 마치 건축에서 ‘아치형 구조’가 하중을 효율적으로 분산시키는 검증된 방법인 것처럼, 소프트웨어에서도 특정 문제를 해결하는 효과적인 방법들이 패턴의 형태로 정리되어 있는 것입니다.
디자인 패턴은 코드를 직접적으로 제공하는 것은 아닙니다. 오히려 특정 상황에서 문제를 해결하기 위한 일반적인 아이디어나 템플릿을 제공합니다. 따라서 프로그래머는 패턴을 참고하여 자신의 상황에 맞게 코드를 작성해야 합니다. 마치 건축가가 아치형 구조의 원리를 이해하고 다양한 건축물에 적용하는 것과 같습니다.
디자인 패턴을 사용하는 이유
디자인 패턴을 사용하는 이유는 여러 가지가 있지만, 크게 다음과 같은 장점들을 얻을 수 있기 때문입니다.
-
코드 재사용성 향상: 디자인 패턴은 검증된 해결책을 제공하기 때문에, 같은 문제를 여러 번 반복해서 해결할 필요가 없습니다. 이는 코드의 재사용성을 높여 개발 시간을 단축시키고 생산성을 향상시키는 효과를 가져옵니다. 마치 레고 블록처럼, 미리 만들어진 부품들을 활용하여 더 빠르고 효율적으로 원하는 것을 만들 수 있는 것과 같습니다.
-
유지 보수성 향상: 디자인 패턴을 적용한 코드는 일반적으로 구조가 명확하고 이해하기 쉽습니다. 이는 코드의 유지 보수성을 향상시켜, 나중에 코드를 수정하거나 확장할 때 발생하는 어려움을 줄여줍니다. 마치 잘 정리된 서랍처럼, 필요한 물건을 쉽게 찾고 정리할 수 있는 것과 같습니다.
-
의사소통의 효율성 증대: 디자인 패턴은 프로그래머들 사이의 공통 언어 역할을 합니다. 특정 패턴을 알고 있다면, 복잡한 코드를 설명하지 않고도 간결하게 의도를 전달할 수 있습니다. 예를 들어, ‘싱글톤 패턴’이라는 용어를 사용하면, 객체를 하나만 생성하도록 설계된 코드를 간결하게 설명할 수 있습니다. 마치 건축가들이 ‘필로티 구조’라는 용어를 사용하여 특정 건축 양식을 쉽게 이해하는 것과 같습니다.
-
소프트웨어 품질 향상: 디자인 패턴은 오랜 경험을 통해 검증된 해결책을 제공하기 때문에, 코드의 품질을 향상시키는 데 도움이 됩니다. 일반적으로 디자인 패턴을 적용한 코드는 오류 발생 가능성이 낮고, 성능이 우수하며, 확장성이 뛰어납니다. 마치 숙련된 장인이 만든 제품처럼, 높은 품질과 신뢰성을 보장하는 것과 같습니다.
가장 많이 쓰이는 패턴
싱글톤(Singleton)
특정 클래스의 인스턴스를 하나만 생성하고, 어디서든 그 인스턴스에 접근할 수 있도록 하는 패턴입니다. 예를 들어, 시스템의 설정을 관리하는 객체는 싱글톤 패턴으로 구현하는 것이 적합합니다.
싱글톤 패턴
프로토타입(Prototype)
객체를 생성할 때, 기존 객체를 복제(Clone)하여 새로운 객체를 만드는 패턴입니다. new 키워드를 사용하여 직접 객체를 생성하는 대신, 원형(Prototype) 객체를 복사하여 객체 생성 비용을 줄이고 객체 생성을 유연하게 관리할 수 있습니다. 마치 도자기 공예에서 원형 틀을 사용하여 동일한 모양의 도자기를 여러 개 만드는 것과 같습니다.
프로토타입 패턴
팩토리(Factory)
객체 생성 로직을 캡슐화하여, 클라이언트 코드가 어떤 객체를 생성해야 하는지 알 필요 없이 객체를 생성할 수 있도록 하는 패턴입니다. 예를 들어, 다양한 종류의 데이터베이스 연결 객체를 생성해야 하는 경우 팩토리 패턴을 사용할 수 있습니다.
팩토리 패턴
추상(Abstract)
서로 관련 있는 객체들을 생성하는 인터페이스를 제공하는 패턴입니다. 팩토리 패턴이 특정 객체 하나를 생성하는 데 초점을 맞춘다면, 추상 팩토리 패턴은 여러 종류의 객체들을 함께 생성하는 데 초점을 맞춥니다. 마치 가구 공장에서 의자, 탁자, 소파 등 여러 종류의 가구를 함께 생산하는 것과 같습니다.
Abstract 패턴
데코레이터 (Decorator)
기존 객체의 기능을 동적으로 추가하는 패턴입니다. 상속 대신 구성을 사용하여 기능을 확장하며, 유연하고 확장 가능한 설계를 가능하게 합니다. 마치 커피에 시럽이나 휘핑 크림을 추가하여 다양한 맛을 내는 것과 같습니다.
데코레이터 패턴
반복자(iterator)
컬렉션의 내부 구현을 노출하지 않고 컬렉션의 요소에 순차적으로 접근할 수 있도록 하는 패턴입니다. 마치 책갈피를 사용하여 책의 내용을 순서대로 읽는 것과 같습니다.
반복자 패턴
관찰자(Observer)
객체 간의 일대다 의존 관계를 정의하여, 한 객체의 상태가 변경될 때 그 객체에 의존하는 다른 객체들에게 자동으로 알림이 전달되도록 하는 패턴입니다. 예를 들어, 주식 가격 변동을 실시간으로 여러 사용자에게 알려주는 시스템에 옵저버 패턴을 사용할 수 있습니다.
관찰자 패턴
MVC(Model-View-Control)
애플리케이션을 세 가지 역할로 분리하는 패턴입니다.
- 모델(Model): 애플리케이션의 데이터와 비즈니스 로직을 담당합니다.
- 뷰(View): 사용자 인터페이스를 담당합니다.
- 컨트롤러(Controller): 사용자의 입력을 받아 모델을 조작하고 뷰를 업데이트하는 역할을 합니다.
MVC 패턴
MVP(Model-View-Presenter)
MVC 패턴과 유사하지만, 컨트롤러 대신 프레젠터(Presenter)가 뷰와 모델 사이의 중재자 역할을 합니다. 뷰는 프레젠터에 의존하고, 프레젠터는 모델에 의존하는 구조를 갖습니다
MVP 패턴
MVVM(Model-View-ViewModel)
MVP 패턴과 유사하지만, 프레젠터 대신 뷰 모델(ViewModel)이 뷰와 모델 사이의 중재자 역할을 합니다. 뷰 모델은 뷰를 위한 데이터를 준비하고, 뷰는 뷰 모델의 데이터를 바인딩하여 표시합니다.
MVVM 패턴