디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 잇도록 하나의 '규약' 형태로 만들어 놓은 것을 의미합니다.



1.1.1 싱글톤 패턴(Singleton Pattern)

하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 보통 데이터베이스 연결 오듈에 많이 사용한다.
인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 잇지만 의존성이 높아진다는 단점도 있다.

싱글톤 패턴의 단점

싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다.
단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야한다. 하지만 싱글톤 패턴은 '독립적인' 인스턴스를 만들기가 어렵다.

의존성 주입(Dependency Injection)

싱글톤 패턴은 모듈간의 결합을 강하게 만들 수 있다는 단점이있다. 의존성 주입을 통해 모듈 간의 결합을 느슨하게 만들어 해결할 수 있다.

위 그림과 같이 메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주는 것이 아닌 중간에 의존성 주입자가 이 부분을 가로채 메인모듈이 간접적으로 의존성을 주입하는 방식이다. 이를 통해 메인 모듈은 하위 모듈에 대한 의존성이 떨어지게 되고, 이를 '디커플링 된다'라고 표현하기도 한다.

참고

  • 의존성 주입의 장점
    모듈들을 쉽게 교체할 수 잇는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월하다. 구현할 때 추상화 레이러를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 어플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있다.
  • 의존성 주입의 단점
    모듈들이 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 패널티가 생기기도 합니다.
  • 의존성 주입 원칙
    1. 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 한다.
    2. 둘 다 추상화에 의존해야 하며, 추상화는 세부 사항에 의존하지 말아야 한다.



1.1.2 팩토리 패턴(Factory Pattern)

객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.



1.1.3 전략 패턴(Strategy Pattern), 정책 패턴(Policy Pattern)

객체의 행위를 바꾸고 싶은 겨우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텐스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.



1.1.4 옵저버 패턴(Observer Pattern)

주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.

주체: 객체의 상태 변화를 보고 있는관찰자.
옵저버: 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 추가 변화 사항이 생기는 개체들



1.1.5 프록시 패턴과 프록시 서버

  • 프록시(proxy) 객체
    어떤 대상의 기본적인 동작(속성 접근, 할당, 순회, 열거, 함수 호출 등)의 작업을 가로챌 수 있는 객체를 뜻한다.
  • 프록시 패턴
    대상 객체(subject)에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 열할을 하는 디자인 패턴이다.
  • 프록시 서버
    서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램
    참고



1.1.6 이터레이터 패턴(iterator pattern)

이터레이터를 사용해 컬렉션의 요소들에 접근하는 디자인 패턴이다. 이를 통해 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능하다.