miss_pattern_v2

90
미워도 다시 보는 패턴 이야기.

description

miss pattern v2

Transcript of miss_pattern_v2

Page 1: miss_pattern_v2

미워도 다시 보는 패턴 이야기.

Page 2: miss_pattern_v2

손영수[email protected]

EvaCast 리더http://www.evacast.net데브피아 아키텍쳐 시삽

Blog - 아키텍트로 가는 길.http://www.arload.net

Page 3: miss_pattern_v2

오늘 나눌 이야기 거리들.

패턴의 정의 (패턴이란?)

패턴에 대핚 오해와 짂실

패턴으로 가는 길

패턴 구성요소 바로 알기

패턴의 올바른 학습 가이드라인

Page 4: miss_pattern_v2

1. 도대체..

패턴은 무엇일까?

Page 5: miss_pattern_v2

Pattern

is

Father

Page 6: miss_pattern_v2

우리는 아버지와 비슷한

생김새, 성격, 습관 등을

가지고 있다.

Page 7: miss_pattern_v2
Page 8: miss_pattern_v2

이미 해결한 문제와

유사한 문제들은..

유사한 방법(패턴)으로

해결 할 수 있다.

Page 9: miss_pattern_v2

그럼 패턴은 과연..

왜 내가 적용하려면

안될까?

Page 10: miss_pattern_v2

2. 패턴에 대한 오해와 진실

Page 11: miss_pattern_v2

GoF 23개의 Pattern으로

우아한 프로그램 만들기?

Page 12: miss_pattern_v2

지구상의 패턴들..

+ 논문 형태로 발표된

패턴 몇 백개.

Page 13: miss_pattern_v2

패턴은 섬이 아니다.

Page 14: miss_pattern_v2

ConfigurablePart

VariablePart

Component Configurator

Factory

Strategy

<<LINKS>>

<<CREATES>>

CommonPart

(Modularity)

Log

Security

Transaction

여러 개의

패턴이 뭉쳐서 움직인다.

Page 15: miss_pattern_v2

여러 개의

패턴이 뭉쳐서 움직인다.

Page 16: miss_pattern_v2

패턴은 소프트웨어 설계

쪽만 다룬다?

Page 17: miss_pattern_v2

솔로들을 위한 패턴?

http://www.amazon.com/Dating-Design-Patterns-Solveig-Haugland/dp/0974312002/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1239125189&sr=8-1

Page 19: miss_pattern_v2

소프트웨어 관련된모든 행위들을 다룬다.

팀을 이루어 설계 대련을 수행하는 패턴 http://portal.acm.org/citation.cfm?id=273484

팀 생산성을 향상 시키는 패턴 http://arload.wordpress.com/2008/09/02/teamproductivity/

지리적으로 떨어져 있는 팀 협업하는 패턴 http://hillside.net/plop/2006/Papers/Library/patternstoenablePLoP2006_sub

mission_v4.pdf http://hillside.net/plop/2004/papers/vbricout0/PLoP2004_vbricout0_0.doc

효율적인 회의를 이끄는 패턴 http://hillside.net/europlop/europlop2005/workshops/

+ 그 외에도 기타 등등….http://arload.wordpress.com/2008/04/02/plopfestival/

Page 20: miss_pattern_v2

패턴은 만병통치약?

Page 21: miss_pattern_v2

비약적인 성능 향상 ?

생산성 증대 ?

최적화 ?

심지어 Silver Bullet ??

Page 22: miss_pattern_v2

패턴의 장점은..

유연성 확장성

Page 23: miss_pattern_v2

3. 패턴으로 가는 길...

Page 24: miss_pattern_v2

패턴에 대한 올바른 마음가짐

Page 25: miss_pattern_v2

아키텍쳐의 이해 대상

Martin Fowler says …

The expert developers working on that project have

a shared understanding of the system design.

This shared understanding is called ‘architecture’

http://www.martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf

Page 26: miss_pattern_v2

역시 패턴도..

팀 내 의사 소통의 수단이

되기 위해선,

팀원들의 이해가 필요하다.

Page 27: miss_pattern_v2

선무당이 사람 잡는다.

해당 그림 추가

Page 28: miss_pattern_v2

패턴의 남용.

리소스 제약이 심한 시스템에

유연성 추가하기??

- Pipe & Filter

- Component Configurator

Page 29: miss_pattern_v2

패턴의 가족관계를 찾아라!

Page 30: miss_pattern_v2

Compound Pattern

versus

Composite Pattern

Page 31: miss_pattern_v2

ConfigurablePart

VariablePart

Component Configurator

Factory

Strategy

<<LINKS>>

<<CREATES>>

CommonPart

Log

Security

Transaction

전형적인 가족관계

Page 32: miss_pattern_v2

여러분을 위해

하나씩 나누어

설명드리겠습니다.

Page 33: miss_pattern_v2

satellite SuperComputer

인공위성과슈퍼 컴퓨터의 정렬로직은 같을까요?

Strategy

Page 34: miss_pattern_v2

void main()

{

//pSort라는 인터페이스를 선언핚다

ISort iSort;

if (GetSystemInfo() == Low)

{

//인공위성에서는 Bubble Sorting 사용

iSort = new CBubble();

}

else

{

//슈퍼 컴퓨터에는 Quick Sorting 사용

iSort = new CQuick();

}

iSort.Sorting();

}

ISort

+Sorting()

Bubble

+Sorting()

Quick

+Sorting()

Strategy

Page 35: miss_pattern_v2

ODBC(JDBC) API

Application

ODBC (JDBC) Driver Manager

MSSQL Driver Oracle Driver

Template Method

Page 36: miss_pattern_v2

QueryTemplate

+doQuery()#FormatConnect()#FormatSelect()

OracleQT

#FormatConnect()#FormatSelect()

SqlSvrQT

#FormatConnect()#FormatSelect()

Class QueryTemplate{ public void doQuery()

{string dbCommand;dbCommand = FormatConnect();dbCommand = FormantSelect(sql);} ...

}

void main(){ //pQT라는 인터페이스를 선언핚다

QueryTemplate QT;Sql sql = “select * from AA”;

if (GetDBProductInfo() = Oracle)QT = new OracleQT();

else QT = new SqlSvrQT();

Qt->doQuery(sql);

}

Inversion of Control(Hollywood Principle)

Template Method

Page 37: miss_pattern_v2

ConfigurationFile

HTTPProtocol

Text Based LogComponent

DESRSA

XML BasedLogComponent

FTP Protocol

설정 파일 정보가 바뀌면소프트웨어의코드 수정없이속성이 변경되어라!!

Great Architect

Component Configurator

Page 38: miss_pattern_v2

38

Component

+Init()+Fini()+Suspend()+Resume()+Info()

CoreComponent

CoreComponent

ComponentRepository

ComponentConfigurator

Component Configurator

Page 39: miss_pattern_v2

10/20/2009Devpia A&D EVA 39

<xml version =“1.0”>

<Components>

<!– Protocol 정보 선택 -->

<Protocol>

HTTP

</Protocol>

<!– Log 정보 선택 -->

<Log>

XML

</Log>

<!– 보안 알고리즘 선택 -->

<SecuAlgorithm>

DES

</SecuAltorithm>

</Components>

void main()

{

IMessage iMessage = new Message();

if (GetComponentInfo(“Protocol”) = HTTP)

iMessage->Protocol = HTTP;

else

iMessage->Protocol = FTP;

if (GetComponentInfo(“Log”) = XML)

iMessage->Protocol = XML;

else

iMessage->Protocol = TEXT;

...

iMessage->Send(“Hello”);}

Advanced TopicReflection

Component Configurator

Page 40: miss_pattern_v2

Component A UserInterface

MetaObject A MetaObject B MOP

Meta Level

Base Level

Component B

uses uses uses uses

modifies

modifies

provides access to

furtherbase-levelcomponents

furthermeta-levelcomponents

retrievesinformation

Reflection

Page 41: miss_pattern_v2

ModuleBuilder AssemblyModule = CreatedAssembly.DefineDynamicModule("MathModule","Math.dll");

TypeBuilder MathType = AssemblyModule.DefineType("DoMath", TypeAttributes.Public | TypeAttributes.Class);

System.Type [] ParamTypes = new Type[] {typeof(int),typeof(int) };

MethodBuilder SumMethod = MathType.DefineMethod("Sum", MethodAttributes.Public, typeof(int), ParamTypes);

ParameterBuilder Param1 = SumMethod.DefineParameter(1,ParameterAttributes.In, "num1");

ParameterBuilder Param2 = SumMethod.DefineParameter(1,ParameterAttributes.In, "num2");

. . .MathType.CreateType(); return CreatedAssembly;

Reflection

Page 42: miss_pattern_v2

using System;using System.Reflection;...

public class EmitDemoTest{ static void Main()

{ ...System.Type MathType = EmitAssembly.GetType("DoMath");object[] Parameters = new object [2];

Parameters[0] = (object) (5); Parameters[1] = (object) (9);object EmitObj = Activator.CreateInstance (MathType,false);object Result = MathType.InvokeMember("Sum",

BindingFlags.InvokeMethod ,null,EmitObj,Parameters);

Console.WriteLine("Sum of {0}+{1} is {2}", Parameters[0],Parameters[1],Result.ToString());

Console.ReadLine();}

}

Reflection

Page 43: miss_pattern_v2

ConfigurablePart

VariablePart

Component Configurator

Factory

Strategy

<<LINKS>>

<<CREATES>>

CommonPart

Log

Security

Transaction

다시 보는 가족 관계

Page 44: miss_pattern_v2

패턴 가족 이야기 2

Page 45: miss_pattern_v2

10/20/2009Devpia A&D EVA 45

Change

1. Observation

2. Notification

Data

Starcraft 때문에생긴 오해!!

스타에서의 Observer

Page 46: miss_pattern_v2

패턴에 있는 Observer는통보 받는 자(Notifieer)이다.

Page 47: miss_pattern_v2

Applicants

Manager

Don’t Call us!!

Hollywood Principle

Page 48: miss_pattern_v2

Applicants

Manager

Don’t Call us!

We Call You!!!

Hollywood Principle

Page 49: miss_pattern_v2

Data

Client (Type1) Client (Type2) Client (Type3)

Manager Client (Source)

1. Change2. Change

3. Notification

Observer is Notifieer

Change

정확한 Observer

Page 50: miss_pattern_v2

Subject

+Attach (Observer o)+Detach (Observer o)+Notify()

ConcreteSubject

Observer

+Update ()

ConcreteObserver

Observer

Page 51: miss_pattern_v2

Configuration FileApp.configWeb.config

Handler

Client A

Client B

Overhead!!

File I/O

Load

Get Info

ChangeConfig File

Notifiy

패턴 가족 이야기 2

Page 52: miss_pattern_v2

Configuration FileApp.configWeb.config

Handler

Client A

Load

Get Info

ChangeConfig File

Notifiy

A Smart Developer

FileSystemWatcher.NotifyFilter

패턴 가족 이야기 2

Page 53: miss_pattern_v2

패턴 가족 이야기 3

Page 54: miss_pattern_v2

무거운 의존관계.

Page 55: miss_pattern_v2

무거운 (Heavy Dependency) 상황

// your API

public class Tracer {

MessageQueue mq = new MessageQueue(…);

public void Trace(string message){

mq.Send(message);

}

}

// your customer’s program that is hard to test

Tracer tracer = new Tracer();

public void ProcessOrder(Order order){

tracer.Trace(order.Id);

}

Page 56: miss_pattern_v2

// your better API

public abstract class TraceListener {

public abstract void Trace(string message);

}

public class Tracer {

TraceListener listener;

public Tracer(TraceListener listener){

this.listener = listener;

}

public void Trace(string message){

listener.Trace(message);

}

}

Inversion of Control

Template Method&

Publisher/Subscriber

Page 57: miss_pattern_v2

// your customer’s program that is easier to test

Tracer tracer = new Tracer(new FileListener());

public void ProcessOrder(Order order){

tracer.Trace(order.Id);

}

Dependency Injection

Page 58: miss_pattern_v2

// customer’s program that is even easier to test

Tracer tracer = container.Resolve<Tracer>();

public void ProcessOrder(Order order){

tracer.Trace(order.Id);

}

Check out DI Containers (a.k.a. IoC Containers): autofac, Castle Windsor, PicoContainer.NET, Spring.NET, StructureMap, Unity, nInject and others.

http://www.nInject.org

http://www.springframework.net/

Dependency Injection Container

Page 59: miss_pattern_v2

많은

가족관계 (Compound Pattern)

사례를 알아야..

실제 설계 시 적용하기 쉽다.

Page 60: miss_pattern_v2

패턴과 SoC

(Separation of Concerns)

Page 61: miss_pattern_v2

SoCis

"focusing one's attention upon some aspect”

Page 62: miss_pattern_v2

결국 패턴은

복잡한 문제를

잘 SoC 하는

경험들을 모아놓은 산물..

Page 63: miss_pattern_v2

JAWS - 웹 서버의복잡한 문제를 잘 SoC한 사례

패턴을 이용한 웹 서버 만들기 (한국어 강좌)

http://www.devpia.com/NET2/EvaCast/Lecture/?cu=view&r=11

Page 64: miss_pattern_v2

하지만 현실에는..유연성에만 초점을맞추어 SoC 할 수 없다.

분산 객체 사례..CORBA, Web Service..

Page 65: miss_pattern_v2

4. 패턴 구성요소 바로 알기

Page 66: miss_pattern_v2

패턴의 구성요소(Components)

Name / Aliases

Context

Forces

Problem

Solution

Consequences

Known Use

Related Pattern

Page 67: miss_pattern_v2

패턴에서 가장 중요시 봐야 할 구성요소는..

Page 68: miss_pattern_v2

어머니의

재미난 조언..

Page 69: miss_pattern_v2

못 올라갈나무는

쳐다 보지말아라

길고

짧은 건

대봐야

안다.

Page 70: miss_pattern_v2

해결책 (조언)은 알았는데..

언제 이 조언을 사용하지?

Page 71: miss_pattern_v2

어머니의 조언에서

빠진 것은?

Context

Page 72: miss_pattern_v2

결과보다

어떤 상황에서

이 패턴을 적용하는지아는 것이 중요.

Page 73: miss_pattern_v2

또 중요한 것 하나!

Context

Resulting

Page 74: miss_pattern_v2

패턴 적용 시, 발생하는

단점과 Side Effect를주의 깊게 살펴보기

Page 75: miss_pattern_v2

문제가 뭐야!!

Problem

Page 76: miss_pattern_v2

현재 내가 처한

문제가 무엇인지..

제대로 알아야

패턴을 써 먹지.

Page 77: miss_pattern_v2

실 사례를 살펴봐라

Known Use.

Page 78: miss_pattern_v2

Known Use를 통해

실패와 성공의 이야기를 들어라

Page 79: miss_pattern_v2

패턴의 확장된 구성요소(Components)

Name / Aliases Context Forces Problem Solution Resulting Context

Side Effect Rationale Known Use Related Pattern Sketch References

Page 80: miss_pattern_v2

구성요소들에 대한재미난 이야기들은..

각각의 구성요소에 대한 자세한 설명 –

확장된 PLoP 패턴 구성 요소들http://arload.wordpress.com/2009/09/03/plop-pattern-template/

추가된 구성 요소의 유래 –

Linda Rising의 패턴 만드는 법http://arload.wordpress.com/2009/10/09/fearless-change-2-strategies-or-pattern/

Page 81: miss_pattern_v2

5. 패턴의

올바른 학습 가이드라인.

Page 82: miss_pattern_v2

10/20/2009Devpia A&D EVA 82

초보를 위한 패턴 빌드오더..

Page 83: miss_pattern_v2

Layer

Pipe & Filter

Broker

Master Slave

Client – Dispatcher

Forwarder-Receiver

Model -View-Controller

Presentation -Abstraction - Control

Reflection

Counted Pointer

Blackboard

POSA 1 (아키텍쳐 패턴)

Page 84: miss_pattern_v2

POSA 2 (분산 객체를 위한 패턴)

Page 85: miss_pattern_v2

Resource Acquisition Lookup

Lazy Acquisition

Eager Acquisition

Partial Acquisition

Resource Lifecycle Caching

Pooling

Coordinator

Resource Lifecycle Manager

Resource Release Leasing

Evictor

10/20/2009Devpia A&D EVA 85

POSA 3 (자원 관리를 위한 패턴)

Page 86: miss_pattern_v2

10/20/2009Devpia A&D EVA 86

그 외 패턴들..

Page 87: miss_pattern_v2

10/20/2009Devpia A&D EVA 87

그 외 패턴들..

Page 88: miss_pattern_v2

10/20/2009Devpia A&D EVA 88

그 외 패턴들..

Page 89: miss_pattern_v2

Frank Buschmann et al, “Pattern-Oriented Software Architecture : A System of Patterns”, Volume 1, Wiley

Douglas Schmidt et al, “Pattern-Oriented Software Architecture”, Volume 2, Wiley

Eric Gamma et al, “Design Patterns : Elements of Reusable Object Oriented Software” , Addison Wesley

Pipe & Filter Pattern, http://www.codeproject.com/cs/design/PipesAndFilters.asp

Reflection Pattern, http://www.codeproject.com/csharp/introreflection.asp

References

Page 90: miss_pattern_v2

FileSystemWatcher.NotifyFilter

http://msdn2.microsoft.com/en-us/library/system.io.filesystemwatcher.notifyfilter(VS.80).aspx

Pattern Language of Program Design

http://www.hillside.net

그 외의 패턴 이야기 (나의 블로그 ..)

http://www.arload.net or http://arload.wordpress.com

소프트웨어 공학 커뮤니티 80개의 무료 강좌들- EvaCast

http://www.evacast.net

References