본문 바로가기
TIL/CS

디자인 패턴

by J1-H00N 2023. 10. 11.

디자인 패턴이란 객체 간의 상호 관계 등을 하나의 규약 형태로 만들어 놓은 것을 의미한다.

 

1. 싱글톤 패턴

  • 싱글톤 패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
  • 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있으나 의존성이 높아진다는 단점이 있다.
  • 싱글톤 패턴은 데이터베이스 연결 모듈에 많이 쓰인다.
  • 하나의 인스턴스를 기반으로 생성하면 데이터베이스 연결에 관한 인스턴스 생성 비용을 아낄 수 있다.
  • 실제로 Node.js에서 mongoose, MySQL 데이터베이스를 연결할 때도 싱글톤 패턴이 쓰인다.
  • TDD(테스트케이스를 작성한 후 실제 코드를 작성하는 개발 프로세스)를 할 때에는 주로 단위 테스트를 하는데, 단위 테스트는 서로 독립적이어서 테스트를 어떤 순서로 하든 실행되어야 하지만, 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 독립적인 인스턴스를 만들기 힘들다.
  • DI(의존성 주입)을 통해 싱글톤의 강한 결합에 관한 단점을 해결할 수 있다. 의존성 주입이란 메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주기보다 중간에 의존성 주입자가 메인 모듈이 간접적으로 의존성을 주입하도록 하는 방법이다. 이를 디커플링이 된다라고도 한다.
  • 의존성 주입의 장점
    • 모듈들을 쉽게 교체할 수 있는 구조가 된다.
    • 테스팅하기 쉽다.
    • 마이그레이션하기 수월해진다.(마이그레이션 : 한 운영환경에서 좀 더 나은 운영환경으로 옮겨가는 과정)
    • 추상화 레이어를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 애플리케이션 의존성 방향이 일관된다.
    • 애플리케이션을 쉽게 추론할 수 있다.
    • 모듈 간의 관계가 조금 더 명확해진다.
  • 의존성 주입의 단점
    • 모듈들이 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 페널티가 생기기도 한다.
  • 의존성 주입 원칙 : 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 합니다. 또한, 둘 다 추상화에 의존해야 하며, 이때 추상화는 세부 사항에 의존하지 말하야 합니다.

 

2. 팩토리 패턴

  • 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
  • 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 된다.
  • 객체 생성 로직이 따로 떼어져 있기 때문에 리팩토링 할 때도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가한다.

 

3. 전략 패턴(정책 패턴)

  • 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다. (컨텍스트 : 개발자가 어떠한 작업을 완료하는데 필요한 모든 관련 정보)

 

4. 옵저버 패턴

  • 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 패턴이다.
  • 주체란 객체의 상태 변화를 보고 있는 관찰자이며, 옵저버들이란 추가 변화 사항이 생기는 객체들을 의미한다. 주체와 객체를 따로 두지 않고 상태가 변경되는 객체를 기반으로 구축하기도 한다.
  • 옵저버 패턴을 사용하는 대표적인 서비스로는 트위터, MVC 패턴이 있다.

 

5. 프록시 패턴

  • 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴이다.
  • 객체의 속성, 변환등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용한다.
  • 어떠한 대상의 기본적인 동작(속성 접근, 할당, 순회, 열거, 함수 호출 등)의 작업을 가로챌 수 있는 객체를 프록시 객체라고 하며, 프록시 패턴이 녹아들어 있는 객체다. 자바스크립트에서 옵저버 패터은 이 프록시 객체를 통해 구현할 수도 있다.
  • 프록시 서버는 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.
  • 프록시 서버에서의 캐싱 - 캐시 안에 정보를 담아두고, 캐시 안에 있는 정보를 요구하는 요청에 대해 다시 저 멀리 있는 원격 서버에 요청하지 않고 캐시 안에 있는 데이터를 활용하는 것을 말한다. 이를 통해 불필요하게 외부와 연결하지 않기 때문에 트래픽을 줄일 수 있다는 장점이 있다.

 

6. 이터레이터 패턴

  • 이터레이터를 사용하여 컬렉션의 요소들에 접근하는 디자인 패턴 (이터레이터 프로토콜 = 이터러블한 객체들을 순회할 때 쓰이는 규칙) (이터러블한 객체 = 반복 가능한 객체로 배열을 일반화한 객체)
  • 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능

 

7. 노출모듈 패턴

  • 즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴을 말한다.
  • 자바스크립트는 접근 제어자가 없기 때문에 노출모듈 패턴을 통해 이를 구현하기도 한다.

 

8. MVC 패턴

  • 모델(Model), 뷰(View), 컨트롤러(Controller)로 이루어진 디자인 패턴이다.
  • 애플링케이션의 구성 요소를 세 가지 역할로 구분하여 개발 프로세스에서 각각의 구성 요소에만 집중해서 개발할 수 있다. 재사용성과 확장성이 용이하다는 장점이 있고, 애플리케이션이 복잡해질수록 모델과 뷰의 관계가 복잡해진다는 단점이 있다.
  • 모델
    • 애플리케이션의 데이터인 데이터베이스, 상수, 변수 등을 뜻한다.
    • 뷰에서 데이터를 생성하거나 수정하면 컨트롤러를 통해 모델을 생성하거나 갱신한다.
    • 사용자 인터페이스 요소를 나타낸다. 즉, 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻한다.
    • 모델이 가지고 있는 정보를 따로 저장하지 않아야 하며 단순히 화면에 표시하는 정보만 가지고 있어야 한다.
    • 변경이 일어나면 컨트롤러에 이를 전달해야 한다.
  • 컨트롤러
    • 하나 이상의 모델과 하나 이상의 뷰를 잇는 다리 역할을 하며 이벤트 등 메인 로직을 담당한다.
    • 모델과 뷰의 생명주기도 관리하며, 모델이나 뷰의 변경 통지를 받으면 이를 해석하여 각각의 구성 요소에 해당 내용데 대해 알려준다.
  • React.js 가 MVC 패턴을 사용하는 대표적인 예시다.

 

9. MVP 패턴

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

 

10. MVVM 패턴

  • MVC에서 C에 해당하는 컨트롤러가 뷰모델(view model)로 바뀐 패턴이다.
  • 뷰모델은 뷰를 더 추상화한 개념이며, MVVM 패턴은 MVC 패턴과 다르게 커맨드와 데이터 바인딩을 가지는 것이 특징이다. 뷰와 뷰모델 사이의 양방향 데이터 바인딩을 지원하며 UI를 별도의 코드 수정 없이 재사용할 수 있고 단위 테스팅하기 쉽다는 장점이 있다.
  • 커맨드 : 여러 가지 요소에 대한 처리를 하나의 액션으로 처리할 수 있게 하는 기법이다.
  • 데이터 바인딩 : 화면에 보이는 데이터와 웹 브라우저의 메모리 데이터를 일치시키는 기법으로 뷰모델을 변경하면 뷰가 변경된다.
  • Vue.js가 MVVM 패턴을 사용하는 대표적인 예시다.

 

상속과 구현

상속은 자식 클래스가 부모 클래스의 메서드 등을 상속받아 사용하며 자식 클래스에서 추가 및 확장을 할 수 있는 것을 말한다.

=> 재사용성, 중복성의 최소화

구현은 부모 인터페이스를 자식 클래스에서 재정의하여 구현하는 것을 말하며, 상소과는 달리 반드시 부모 클래스의 메서드를 재정희하여 구현해야 한다.

 

DDOS

짧은 기간 동안 네트워크에 많은 요청을 보내 네트워크를 마비시켜 웹 사이트 가용성을 방해하는 사이버 공격 유형

 

CORS

서버가 웹 브라우저에서 리소스를 로드할 때 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘

 

'TIL > CS' 카테고리의 다른 글

예상 질문  (0) 2023.10.12
프로그래밍 패러다임  (0) 2023.10.12
DBMS의 기능과 종류  (0) 2023.08.30
쓰레드와 쓰레드 풀  (0) 2023.08.24
프로그램과 프로세스  (0) 2023.08.22