본문 바로가기
개발 공부 일지/CS

디자인 패턴

by yelimu 2024. 7. 18.

디자인 패턴

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

일종의 정형화된 문제 상황에 대한 솔루션?

 

패턴과 알고리즘의 차이

패턴은 알고리즘과 자주 혼동됩니다. 왜냐하면 두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명하기 때문입니다. 
알고리즘은 어떤 목표를 달성하기 위해 따라야 할 명확한 일련의 절차를 정의하지만, 패턴은 해결책에 대한 더 상위 수준의 설명입니다. 
예를 들어 같은 패턴을 두 개의 다른 프로그램에 적용하면 두 프로그램의 코드는 다를 것입니다.

알고리즘은 요리법에 비유할 수 있지만 패턴은 요리법이 아닌 청사진에 더 가깝습니다. 
알고리즘과 요리법 둘 다 목표를 달성하기 위한 명확한 단계들이 제시되어 있습니다. 

반면에 청사진은 결과와 기능들은 제시하나 구현 단계 및 순서는 사용자가 결정합니다.


패턴 분류

1. 목적에 따라
 - 생성패턴/구조패턴/행동패턴

생성패턴: 기존 코드의 재활용과 증가시키는 객체 생성 메커니즘들을 제공합니다.

객체의 생성 과정에 관여하는 패턴

구조 패턴: 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.

클래스나 객체의 구성을 통해 더 큰 구조로 만들 수 있게 해주는 것과 관련된 패턴

행동 패턴: 패턴을 주로 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴

 

2. 범위에 따라

: 패턴을 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴이다.

 

클래스 패턴 (Class Pattern) : 클래스들과 하위 클래스 간의 관계를 다루는 패턴이다. 컴파일 시에 관계가 결정된다.

 

객체 패턴 (Object Patterns) : 객체 간의 관계를 다루며 보통 구성을 통해 정의된다. 객체 패턴은 일반적으로 실행시간에 관계가 생성되기 때문에 더 동적이면서 유연하다.



▼ 책에서 다루는 패턴 

싱글톤 패턴 : 생성패턴
싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근​(액세스) 지점을 제공하는 생성 디자인 패턴입니다.

 

하나의 인스턴스를 만들어놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용한다 

 

적용 : 데이터베이스 연결 모듈

 

장점: 인스턴스를 생성할때 드는 비용이 줄어든다

단점:

1) 의존성이 높아진다 : 모듈간의 결합을 강하게 만든다 -> 의존성 주입(DI : dependency injection)을 통해 모듈간의 결합을 느슨하게 만들 수 있다

-> 모듈을 쉽게 교체할 수 있는 구조가 되고 마이그레이션이 수월. .. 

 

2) TDD (test driven development) 단위 테스트 : 서로 독립적이어야 하며 어떤 순서로든 실행할 수 있어야한다 

싱클톤패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하기때문에 각 테스트마다 독립적인 인스턴스를 만들기 어렵다

 

 



팩토리 패턴 : 생성패턴
부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.

 

객체를 생성하기 위한 인터페이스를 정의하지만 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 하위 클래스에서 이루어지도록 인스턴스 생성의 책임을 떠넘기는 패턴



전략 패턴 : 행동 패턴
전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.

 

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

ex. 상품 결제 시 카카오페이로 할지 네이버 페이로 할지 선택할 수 있다 



옵저버 패턴 : 행동 패턴

옵저버 패턴은 당신이 여러 객체에 자신이 관찰 중인 객체에 발생하는 모든 이벤트에 대하여 알리는 구독 메커니즘을 정의할 수 있도록 하는 행동 디자인 패턴입니다.

 

객체의 상태가 변하면 주체가 옵저버들에게 변화를 알려준다 

 

객체와 주체는 같을수도 있고 다를 수도 있다. 

프록시객체를 통해 구현하기도 한다. 

 

추가/삭제/알림 메소드

알림 업데이트 메소드 

 

장점: 결합이 느슨하다. 유연성, 확장성, 실시간 업데이트

단점: 단방향 통지, 주체와 옵저버가 많아지면 복잡성이 높아진다 

 

적용: 유튜브, 인스타 등 구독 알람 



프록시 패턴 : 구조패턴

프록시는 다른 객체에 대한 대체 또는 자리표시자를 제공할 수 있는 구조 디자인 패턴입니다. 프록시는 원래 객체에 대한 접근을 제어하므로, 당신의 요청이 원래 객체에 전달되기 전 또는 후에 무언가를 수행할 수 있도록 합니다.

 

프록시패턴은 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 일부 동작을 대신 수행한다. 

대표적인 서비스(?)로는 nginix, coludflare 가 있다 

 

프록시 서버는 웹 서버에 접근하기 전에 그 앞단에서 웹서버 부담을 덜어주고, 정적 작업을 수행하며 보안기능 제공을 한다. (DDOS 공격을 감지하고 차단함, 인증서없이 HTTPS 구축

 

-용어
프록시 객체는 target과 핸들러 두 개의 변수를 갖는다. 즉 가로챌 대상에 수행할 동작이 정의되어있다.


 

이터레이터 패턴

여러가지 자료형(데이터 타입)을 하나의 인터페이스로 순회하는 패턴

 

-용어

배열, 객체, Map, Set 과 같이 순회가능한 대상을 이터러블 Itarable 객체 라고 한다 

이러한 객체들은 이터레이터 프로토콜을 따른다.

즉 이터레이터를 리턴하는 [Symbol.iterator]() 메소드를 갖는 객체이다.


노출 (모듈) 패턴

private, public 와 같은 접근제어자를 만드는 패턴

자바스크립트에는 접근제어자가 없기때문에 함수 스코프를 이용해서 구현한다.

즉 함수 내에서 return 해준 변수만 함수 밖에서 사용이 가능하므로 = public, 나머지는 private 이 된다..


MVC (Model - View - Controller) 

View : 사용자 인터페이스 

Model : 애플리케이션의 데이터 (DB, 상수, 변수 등) 

Controller : View 와 Model의 중간 다리, 각각으로부터의 변경 내용을 전달해줌 

 

모듈화-> 재사용성, 암호화, 테스트 용이 

 

MVP (Model - View - Presenter) : MVC 에서 M - V 의존성을 낮추기 위해 Controller -> Presenter 

뷰와 프레젠터는 1:1 관계

 

MVVM (Model - View - Viewmodel) 

뷰와 뷰모델 사이의 데이터 바인딩(데이터 동기화, 즉각 반영) 


참고 링크

https://refactoring.guru/ko

 

리팩터링과 디자인 패턴

Hello, world! Refactoring.Guru는 리팩토링, 디자인 패턴, SOLID 원칙 및 기타 스마트 프로그래밍 주제에 대해 알아야 할 모든 것을 쉽게 찾을 수 있는 자원입니다. 이 사이트에서는 이러한 모든 주제가 어

refactoring.guru

 

더보기

근데 난 인스턴스부터.. 찾아봐야한다.. 

객체..같은거 아닌가? 

 

클래스를 정의하고 어떤 객체를 생성하면 그 객체는 클래스의 인스턴스 이다.

하나의 클래스로 수많은 인스턴스를 생성할 수 있다 

아항 그래서 싱글톤 패턴에서 하나의 인스턴스만 갖게하는게 의미가 있는거구낭

 

객체는 선언, 인스턴스는 실체화를 의미한다. 클래스의 타입으로 선언 되었을 때 객체라고 부르며, 그 객체가 메모리에 할당되어 실제 사용될 때는 인스턴스라고 부른다.

 

OOP에서 클래스는 일종의 설계도이다. 클래스를 정의하는 것 자체로는 할수 있는 것이 많지 않지만, 클래스를 사용해 구체적인 제품을 만드는 것이 인스턴스화다.

 

참조 링크

https://velog.io/@k7nsuy/%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%9E%80

 

https://velog.io/@zunyange/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EA%B0%80-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4