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

 

  •  싱글톤 패턴 (singleton pattern)
    싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
    하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만,
    그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로
    로직을 만드는데 쓰이며, 보통 데이터베이스 연결 모듈에 많이 사용된다.
    하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 떄문에
    인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있다.
    하지만 의존성이 높아진다는 단점이 있다.

    # 싱글톤 패턴을 구현하는 7가지 방법 (synchronized, static, LazyHolder, DCL, ENUM)

    1-1.  단순한 메서드 호출
    싱글톤 패턴 생성 여부를 확인하고 싱글톤이 없으면 새로 만들고 있다면 만들어진 인스턴스를 반환한다.

* 주의 * 이 코드는 원자성이 결여되어있다.

        1-2. synchronized
         인스턴스를 반환하기 전까지 격리 공간에 놓기 위해 synchronized 키워드로 잠금을 할 수 있다.
         최초로 접근한 쓰레드가 해당 메서드 호출시에 다른 스레드가 접근하지 못하도록 잠금(lock)을 걸어준다.

         이 떄 synchronized 가 지정된 메서드를 호출할 때마다 lock이 걸려 성능이 저하된다.

 

가장 구현하기 간단하지만 멀티쓰레드 환경에서 lock은 성능 저하를 가져온다.

 

       

       1-3, 1-4. 정적 멤버 / 정적 블록
        정적 (static) 멤버나 블록은 런타임이 아니라 최초에 JVM이 클래스 로딩 떄 모든 클래스들을 로드할 떄
        미리 인스턴스를 생성하는데 이를 이용한 방법이다.
        다만, 이 방법은 불필요한 자원낭비라는 문제점이 있다. 싱글톤 인스턴스가 필요없는 경우도 무조건
        싱글톤 클래스를 호출해 인스턴스를 만들어야 하기 때문이다.

 

(좌) 정적 멤버 / (우) 정적 블록


     1-5. 정적 멤버와 Lazy Holder (중첩 클래스) **** 추천 ****
      SingleInstanceHolder라는 내부클래스를 하나 더 만듬으로써, Singleton 클래스가 최초에 로딩되더라도
      함께 초기화가 되지 않고, getInstance() 가 호출될 때 singleInstance 클래스가 로딩되어 인스턴스를 생성하게 된다.

1-1 ~ 1-4 까지의 불필요한 자원낭비를 없앨 수 있다. 필요시에만 정적 멤버로 선언


       1-6. 이중 확인 잠금 (DCL / 더블 체크 락)
         인스턴스 생성 여부를 싱글톤 패턴 잠금 전에 한번, 객체를 생성하기 전에 한 번 2번 체크하면
         인스턴스가 존재하지 않을 때만 잠금을 걸 수 있기 때문에 앞서 생겼던 문제점을 해결할 수 있다.
         volatile 를 적용하면 캐시메모리가 아니라 메인메모리에서 변수를 공유한다.

* 주의 * 멀티쓰레드에서는 read/write가 자주 일어나는 상황이라면 volatile는 적합하지 않다.

         1-7. enum **** 추천 ****
          enum의 인스턴스는 기본적으로 Thread safe 한 점이 보장되기 때문에 이를 통해 생성할 수 있다.

 

  • 싱글톤 패턴의 단점

    싱글톤 패턴은 TDD를 할 때 걸림돌이 된다. TDD를 할 때 단위 테스트를 주로 하는데,
    단위 테스트는 테스트가 서로 독립적이어야 하며, 테스트를 어떤 순서로든 실행할 수 있어야 한다.

    또한, 싱글톤 패턴은 사용하기가 쉽고 굉장히 실용적이지만 모듈 간의 결합을 강하게 만들 수 있다는
    단점이 있다. 이떄 의존성 주입 (DI) 를 통해 모듈 간의 결합을 조금 더 느슨하게 만들어 해결할 수 있다.

 


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

 

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

 

  • 옵저버 패턴
    옵저버 패턴은 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메소드 등을 통해
    옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
    여기서 주체란 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들이란 이 객체의 상태 변화에 따라 전달되는
    메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체들을 의미한다.
    (주체와 객체를 따로 두지 않고 상태가 변경되는 객체를 기반으로 구축하기도 한다.)

 

  • 프록시 패턴 
    프록시 패턴은 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채
    대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴이다.

    이를 통해 객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용한다.

 

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

    이터레이터 프로토콜 : 이터러블한 객체들을 순회할 때 쓰이는 규칙
    이터러블한 객체 : 반복 가능한 객체로 배열을 일반화한 객체

 

  • 노출모듈 패턴
    노출모듈 패턴은 즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴을 말한다.
    자바스크립트는 private 나 public  같은 접근 제어자가 존재하지 않고 전역 범위에서 스크립트가 실행된다.
    (난 자바스크립트 잘 모른다 ㅎ...)

 

  • MVC 패턴
    MVC 패턴은 모델 (Model), 뷰(View), 컨트롤러(Controller)로 이루어진 디자인 패턴이다.
    애플리케이션의 구성 요소를 세 가지 역할로 구분하여 개발 프로세스에서 각각의 구성 요소에만 집중해서
    개발할 수 있습니다. 재사용성과 확장성이 용이하다는 장점이 있고, 애플리케이션 복잡해질수록
    모델과 뷰의 관계가 복잡해지는 단점이 있다.

    모델
    모델(Model)은 애플리케이션의 데이터인 데이터베이스, 상수, 변수 등을 뜻한다.
    뷰에서 데이터를 생성하거나 수정하면 컨트롤러 등을 통해 모델을 생성하거나 갱신한다.

    컨트롤러
    컨트롤러(Controller)는 하나 이상의 모델과 하나 이상의 뷰를 잇는 다리 역할을 하며
    이벤트 등 메인 로직을 담당한다. 또한, 모델과 뷰의 생명주기도 관리하며,
    모델이나 뷰의 변경 통지를 받으면 이를 해석하여 각각의 구성 요소에 해당 내용에 대해 알려준다.


    뷰는 사용자 인터페이스 요소를 나타낸다.
    즉, 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻한다. 모델이 가지고 있는 정보를
    따로 저장하지 않아야 하며 단순히 사각형 모양 등 화면에 표시하는 정보만 가지고 있어야 한다.
    또한, 변경이 일어나면 컨트롤러에 이를 전달해야 한다.

 

  • MVP 패턴
    MVP 패턴은 MVC 패턴으로부터 파생되었으면 MVC에서 C에 해당하는 컨트롤러가 프레젠터로 교체됐다.
    뷰와 프레젠터는 일대일 관계이기 때문에 MVC 패턴보다 더 강한 결합을 지닌 디자인 패턴이다.


  • MVVM 패턴 ( 예 : Vue.js)
    MVVM 패턴은 MVC의 C에 해당하는 컨트롤러가 뷰모델로 바뀐 패턴이다.
    여기서 뷰모델은 뷰를 더 추상화한 계층이며, MVVM 패턴은 MVC 패턴과는 다르게
    커맨드와 데이터 바인딩을 가지는 것이 특징이다.

    커맨드 : 여러 가지 요소에 대한 처리를 하나의 액션으로 처리할 수 있게 하는 기법
    데이터 바인딩 : 화면에 보이는 데이터와 웹 브라우저의 메모리 데이터를 일치시키는 기법, 뷰모델 변경 시 뷰 변경

+ Recent posts