https://www.dezeen.com/2014/08/29/campus-netzwerk-office-format-elf-architekten-perforated-aluminium/

패턴은 추상적인 "의도"를 보다 명확한 의미로 "규정" 을 짓습니다.
패턴을 사용하는 이유와 공부하는 이유는 아래와 같습니다.

- 그로 인해 선배로 부터 값진 경험을 물려 받게 해 줍니다. 
- 그로 인해 의사소통을 원할하게  만들어 줍니다.
- 그로 인해 자신의 생각에 확신을 갖게 합니다.
- 그로 인해 장점과 단점을 드러내 줍니다. 모든 패턴에는 장점과 단점이 있습니다. (모든 기술도 마찬가지)  

- 그로 인해 연관 패턴들과의 계층적 구조를 보여주어 큰 규모에서의 설계를 가능하게 합니다.
- 그로 인해 시야가 넓어집니다. 
- 그로 인해 이름 짓기 능력을 발전 시킬 수 있습니다. 
- 그로 인해 추상화 & 모듈화 능력을 발전 시킬 수 있습니다.

이제 다양한 패턴들에 대한 이름과 의도에 대해서 정리 해 보겠습니다. 

Gof 디자인패턴 

Creational 

패턴명 의도
Factory Method  
Abstract Factory  
Builder  
Prototype  
Singleton  


Sturctural

패턴명 의도
Adapter  
Bridge  
Composite  
Decorator  
Facade  
FlyWeight  
Proxy  


B
ehavioral

패턴명 의도
Interpreter  
Template Method  
Chain of Responsibility  
Command  
Iterator  
Mediator  
Memento  
Observer  
State  
Strategy  
Visitor  


켄트백 구현 패턴 

   
   
   
   
   


멀티쓰레드 디자인패턴 

패턴명 의도 
Single Threaded Execution   
Immutable  
Balking  
Producer-Consumer  
Read-Write Lock  
Thread-Per-Message  
Worker Thread  
Future   


POSA-2 (네트워킹) 디자인패턴 

이벤트 핸들링 패턴 

Reactor  
Proactor  
Asynchronous Completion Token  
Acceptor-Connector  

Synchronization Patterns

Scoped Locking  
Strategized Locking  
Thread-Safe Interface  
Doblle-Checked Locking Optimization  

Concurrency Patterns

Active Object  
Monitor Object  
Half-Sync/Half-Async  
Leader/Followers  
Thread-Specific Storage   


POSA-3 (리소스) 디자인패턴 

Resource Acquisition

Lookup  
Lazy   
Eager  
Partial  

Resource Lifecycle

Caching  
Pooling  
Coordinator  
Resource LifeCycle Manager  

Resource Release

Leasing  
Evictor  

 

메세지 큐 디자인패턴 

(work queue) Round Robin Dispatch 워커에게 하나씩 배분한다.
(work queue) Fair Dispatch 워커에게하나씩 배분하되, 작업시간도 감안해서 균등히 배분한다.
(pub/sub) Exchange  여러 소비자에게 한번에 다 나눠준다.
(routing) Direct Exchange 특정 데이터만 선택해 가져간다.
(topic) Topic Exchanges 패턴에 기반해 소비자가 가져간다.
(request/response) rpc 보내고 바로 받는다.

 


마이크로서비스 디자인패턴 

SAGA  
CQRS  
BFF  
회로차단   
백오프  
타임아웃  
상태점검  
서비스탐색   
부하분산 - 동일한것을 여러개로 복제
- 리소스가 다른것을 분리 
- 서비스가 다른 것을 분리 
캐싱   
동기/비동기 콜   
이벤트 소싱   
서비스별 DB   
격벽    


엔터프라이즈 어플리케이션 디자인패턴 

도메인 논리 패턴  
데이터 원본 아키텍처 패턴  
객체-관계형 동작 패턴  
객체-관계형 구조 패턴  
웹 프레젠테이션 패턴
 
분산 패턴
 
오프라인 동시성 패턴
 
세션 상태 패턴
 


Spring 프레임워크 디자인 패턴  www.baeldung.com/spring-framework-design-patterns

   
   
   
   



J2EE 프리젠테이션 패턴 

Intercepting Filter 패턴  
Front Controller 패턴  
Context Object 패턴  
Application Controller 패턴  
View Helper 패턴  
Composite View 패턴  
Service to Works 패턴  
Dispatcher View 패턴
 


J2EE 비지니스 티어 패턴 

Business Delegate 패턴  
Service Locator 패턴  
Session Facade 패턴  
Application Service 패턴  
Business Object 패턴  
Composite Entity 패턴  
Transfer Object 패턴  
Transfer Object Assembler 패턴  
Value List Handler 패턴
 
통합 티어 패턴
 
Service Activator 패턴
 
Domain Store 패턴
 
Web Service Broker 패턴
 

 

기업통합 디자인패턴 

Content based Router  
Message Filter  
Dynamic Router  
Recipient List  
Splitter  
Aggregator  
Resequencer  
Content Enricher  
Content Filter  
Pipes and Filter   


데이터 모델 패턴

   
   
   
   


DDD 디자인패턴 

   
   
   
   


빅데이터 디자인패턴 

람다   
   
   
   

 

메모리 매니지먼트 디자인패턴 

고정된 크기   
고정되지 않은 크기   
연속 할당 후 한번에 릴리즈   
Buddy   
tcmalloc  


데이타 베이스 디자인 패턴 

   
   
   
   
   

 

React 에서 사용되는 패턴 

Provider 패턴   
   
   
   

 

패턴매칭 (데이터 분석) 디자인패턴 

   
   
   
   

크립토 이코노미 디자인패턴 

   
   
   
   

크립토 보안 디자인패턴 

   
   
   
   

 

'소프트웨어 사색' 카테고리의 다른 글

추상화  (1) 2021.08.29
코더보다는 프로그래머가 되라?  (5) 2021.07.01
왜 야근해야 하는지 모르겠는데 설명 좀 해주실분?  (0) 2020.07.16
Rust  (0) 2020.06.16
소프트웨어 복잡도 줄이기 (1)  (0) 2020.05.13


꼬리에 꼬리를 무는 - 유사 디자인 패턴들 (1/2편)


패턴을 공부하거나 할 때 UML 에 집중해서 공부하면 안된다고 생각한다. 구조만을 외우고 구조로 구분을 한 사람은  공부한것을 금방 까먹거나 헤깔려하기 쉽기 때문인데, 이유는 거의 비슷한 구조를 갖춘 패턴들은 정말 많기 때문이다. ( 더 헥깔린것은 동일 패턴이 구조가 다른 경우도 부지기수이다. 의도가 같기 때문. 즉 "의도", "목적" 이 중요하다.) 

아래 구조를 보자.

정말 많지 않나?? 이 구조만 보고 뭘 알 수 있을까? 자신이 Composite 패턴만 공부했다면 , 이러한 구조를 보고 무조건 "컴포지트 패턴" 이라고 어디가서 우기지나 않을까 염려된다.


이런 식 또한 많다. 무엇인가?? 당연히 알수가 없다.
또한 저런 동일한 구조에 여러 패턴이 같이 참여 할 수 도 있다. 예를들어 Strategy패턴과 Flyweight 패턴이 같은 클래스들을 공유하는 경우가 실제 세계에는 부지기수로 일어나기도 한다. 그럴 때는 A 클래스와 B 클래스는 OO 패턴 과 XX 패턴에 어떤 역할로 참여하고 있다 라고 말하며 회의시에 커뮤니케이션 할 수 있겠다. 

따라서 앞으로 나올 패턴 비교에서는 UML 에 대한 설명은 하지 않으며  그냥 말로 "의도" 를 전달 할 예정이다.
마지막으로 디자인패턴을 처음 공부하는 사람을 위한 글은 아니며, 대략 공부한 상태에서 정리하기 위한 목적의 글이라는 점을 양해 드린다. 



1. Proxy 패턴 vs Decorator 패턴 

두 패턴 모두 기존에 존재하는 객체의 동일한 인터페이스 (쉽게 말하면 메소드) 를 이용해서 (변경하지 않고서) 다양한 행위를 추가하기 위한 의도가 있다. 즉 a 라는 객체에 doAction() 이라는 메소드가 있으면, 다른 객체에서도 동일한 시그니쳐의 doAction() 메소드를 호출해서 a 의 doAction()을 실행하는 동시에 다른 첨가물을 추가해 준다는거다. 

그럼 두 패턴이 같은거네? 뭐 비슷하다고 할 수 있으나 "의도" 에 미묘한 차이가 있다.
Decroator 는 어떤 추가적인 기능을 제공한다고 치면 Proxy 는 추가적인 컨트롤을 제공한다고 볼 수 있다. 

예를 들어보자

Decorator 는 

a 객체의 doAction 이  "hello" 를 출력하는 것이라면 , 데코레이터 역할의 b 객체의 doAction 에서는 a 객체의 doAction 을 호출하여 "hello" 를 출력하는 동시에 그 위 아래로 "********" 이런것을 추가적으로 처리해 주는 것이다. 즉 주요 기능에 무엇인가능력을 부가해서 추가해주는것이 의도이다. 어떤 메소드의 시작이나 끝에 로깅이나 트랙잭션을 추가해 주는 것 또한 데코레이터라 할 수 있다.

Proxy 는 

a 객체의 doAction이 "hello" 를 현재 로컬에 출력하는 것이라면 , Proxy 역할의 b 객체의 doAction 는 "hello" 를 Remote 컴퓨터로 보내서 출력해주는 역할을 한다. 즉 구현된 내용에 부가 기능을 추가해 주려는게 아니라, 그 주요기능을 다양한 방식으로 컨트롤 해주는 역할이다. 외부로 보낸다든지, lazy initailization 한다든지, 캐쉬된 것을 사용한다든지~


이제 다시 UML 을 보자.



구조는 같다. 다만 객체의 역할이 무엇이냐에 따라 나뉜다는 점을 명심하자.


질문) 


그럼 자바의 Dynamic Proxy 는 프록시 패턴인가? 데코레이터 패턴인가? 

답 : "Dynamic Proxy 기능을 어떤 의도로 사용하냐 에 따라서 달라진다." 


하둡이라는 자바기반의 분산처리 시스템에서 Dynamic Proxy 는 RPC 를 위한 Proxy 로 사용되었으며,
스프링에서는? 아래 읽을꺼리를 참고하라~

읽을꺼리: 자바의 Dynamic Proxy는 프록시 패턴인지 데코레이터 패턴인가? 

읽을꺼리: 하둡(Hadoop) 에서 RPC 구조 


2. Decorator 패턴 vs  Adapter 패턴

자  이제 위에서 데코레이터 패턴에 대해서 알아보았다. 어떤 기능에 추가 기능을 유연하게 추가 시켜주기 위한 의도가 있음을 알 수 있었다. 또한 Proxy 패턴을 알아 보았는데, 그것은 추가 컨트롤을 할 수 있게 도움을 주는 것이 었다. 그럼 Adapter 패턴은 무엇일까? 이름 그대로 생각하면 될 거 같다. 예를들어 우리 나라는 전기를 220v 를 사용하는데 110v 사용하는 나라로 여행을 갈 때면 어댑터가 필요하다.  어댑터 패턴도 마찬가지이다. 다른 누군가 만들어 놓은 어떤 기능을 사용하는데 , 자신의 설계는 그대로 가져가 되  다른 라이브러리를 내부에서 그대로 사용하고 싶을 때가 있다.이때 중간에서 변환을 시켜 준다. 즉 사용해야할 메소드가 methodB() 로 생겼는데, 나는 methodA() 라고 호출 해야 한다고 하자. 그럼 어댑터 객체는 methodA() 제공하고 내부에서 methodB()을 호출해 주면 될 것이다.

즉 데코레이터는 중간에서 기능을 추가해 준다면, 어댑터는 중간에서 인터페이스를 변경 해 줄 뿐이다.

이제 UML 을 보자.


Adaptee 는 변환되야할 타깃객체의 인터페이스를 포함한다. Adapter 객체는 내부에서 Adaptee 의 메소드를 호출하고 있다. 간단히 정리하면  Adapter 는 호출해야할 객체의 터페이스를 중간에서 변경해 주는 목적을 가지고 있다.

구체적인 예는 아래 읽을꺼리를 참고하라~

읽을꺼리: JDBC 와 디자인패턴 - 5.Adapter 패턴 



3,4 편 바로가기 -> http://hamait.tistory.com/869

5. Facade vs Mediator 패턴 

6. Mediator vs Observer 패턴 

7. Bridge vs Abstract Factory 패턴 

8. Abstract Factory vs Factory Method 

9. Factory Method vs Templet Method 패턴 

10. Templet Method vs Builder 패턴 

11. Iterator vs Visitor 패턴 

12. Visitor vs Strategy 패턴 

13. Strategy  vs Chain of Responsibility 패턴 

14. Strategy vs State 패턴 

15. Flayweight vs Prototype 패턴

16. Prototype vs Memento 패턴 

17. Command vs Composite 패턴 



+ Recent posts