학습 목표
- 디자인 패턴을 정의할 수 있다.
- 패턴 카탈로그에 대해서 알수 있다.
- 어떠한 상황에서 이런 패턴을 써야하는 지 알 수 있다.
- 패턴을 대하는 자세에 대해 알아본다.
- 다른 영역의 패턴을 알아볼 수 있다.
- 안티 패턴에 대해 알 수 있다.
디자인 패턴의 정의
패턴 이란 특정 컨텍스트 내에서 주어진 문제 에 대한 해결책 이다.
-
컨텍스트(context)란 패턴이 적용되는 상황을 뜻합니다. 반복적으로 일어 날 수 있는 상황이어야만 합니다.
-
문제(problem)란 컨텍스트 내에서 이루고자 하는 목적을 뜻합니다. 또한 컨텍스트 내에서 생길 수 있는 제약조건도 문제에 포함됩니다.
-
해결책(solution)이 바로 우리가 찾아내야 하는 것입니다.
누구든지 적용해서 일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인을 뜻합니다.
사실 디자인 패턴이라는 것은 일상적으로, 반복적으로 등장하는 디자인 문제에 대한 해결책 이라는 것을 이미 알고 있다.
근데 왜 이렇게 정형적인 정의를 따져야 하는 걸까?
패턴을 정형적으로 기술해 놓아야 패턴 카탈로그를 만들 수 있기 때문이다.
패턴 카탈로그
- 패턴을 일목요연하게 나열한 목록
- 참고하기 용이함.
누가 무엇을 할까요?
카탈로그의 구성요소.
패턴 카탈로그의 기술형식(Page 623)
패턴 종류 또는 범주
- 패턴 이름
패턴 설명에서 가장 먼저 등장, 패턴의 이름 없이는 패턴에 대한 정보를 다른 개발자들과 공유하기가 아주 힘들어 진다.
- 용도(Intent)
패턴의 역할이 간단히 기술된다.
- 동기(Motivation)
문제를 기술하고 주어진 해결책이 어떤 식으로 그 문제를 해결 할 수 있는지를 보여줄 수 있는 구체적인 시나리오가 주어진다.
- 적용대상(Applicability)
패턴을 적용할 수 있는 상황이 기술된다.
- 구조(Structure)
패턴에서 사용되는 클래스 다이어그램이 수록된다.
- 구성요소(Participant)
디자인패턴에 포함되어 있는 클래스와 객체들에 대한 설명
- 협동(Collaboration)
각 구성요소들이 패턴 내에서 어떤 식으로 도움을 주는지 설명.
- 결과(Consequence)
패턴을 사용했을 때의 효과(장점 및 단점)가 수록됨
- 구현(Implementation)
패턴을 구현할 때 필요한 기술 및 주의사항에 대해 설명
- 샘플코드(Sample Code)
구현시 도움 될 만한 코드 제공
- 사용예(Known Uses)
실제 시스템에서 이 패턴을 사용하는 예에 대한 설명
- 관련패턴 (Related Patterns)
본 패턴과 유사하거나 밀접하게 관련된 다른 패턴에 대해서 기술
예시
https://refactoring.guru/design-patterns/catalog
패턴 분류하기.
- 생성 관련 패턴 (Creational Pattern)
- 객체 인스턴스 생성을 위한 패턴
- 싱글턴, 빌더, 프로토타입, 추상 팩토리, 팩토리 메소드
- 행동 관련 패턴 (Behavioral Pattern)
- 클래스와 객체들이 상호 작용하는 방법 및 역할을 분담하는 방법과 관련된 패턴
- 템플릿메소드, 이터레이터, 커맨드, 스테이트, 스트레티지, 인터프리터, 비지터, 메멘토
- 구조 관련 패턴 (Structural Pattern)
- 클래스및 객체들을 구성을 통해서 더 큰 구조로 만들 수 있게 해 주는 것과 관련된 패턴
- 데코레이터, 컴포지트, 프록시, 퍼사드, 어댑터, 브리지, 플라이웨이트
- 클래스 패턴(Class Pattern)
- 클래스 사이의 관계가 상속을 통해서 어떤 식으로 정의되는지를 다룹니다.
- 클래스 패턴에서는 컴파일시에 관계가 결정 됩니다.
- 템플릿 메소드, 어댑터, 팩토리 메소드, 인터프리터
- 객체 패턴(Object Pattern)
- 객체 사이의 관계를 다루며, 객체 사이의 관계는 보통 구성을 통해서 정의 됩니다.
- 객체 패턴에서는 일반적으로 실행 중에 관계가 생성되기 때문에 더 동적이고 유연합니다.
- 검포지트, 데코레이터, 프록시, 스트레티지, 추상 팩토리, 퍼사드, 커맨드, 옵져버, 스테이트, 싱글턴
패턴을 대하는 마음가짐
- 간단한 문제는 일단 그냥 해결
(패턴보단 원칙에 초점을 맞추자는 의미같다.)
SOLID 패턴
https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)
- 확률이 높은 실질적 변경이 있으면 패턴을 적용해도 좋음.
- 리팩토링을 할때도 패턴 도입을 고려해보면 좋음
- 필요하지 않은 패턴은 제거할수도 있다...!
패턴 동물원
애플리케이션 패턴
- 시스템 수준의 아키텍처를 만들기 위한 패턴
ex)
- 계층화 패턴 (Layered pattern)
- 클라이언트-서버 패턴 (Client-server pattern)
- 마스터-슬레이브 패턴 (Master-slave pattern)
- 파이프-필터 패턴 (Pipe-filter pattern)
- 브로커 패턴 (Broker pattern)
- 피어 투 피어 패턴 (Peer-to-peer pattern)
- 이벤트-버스 패턴 (Event-bus pattern)
- MVC 패턴 (Model-view-controller pattern)
- 블랙보드 패턴 (Blackboard- pattern)
- 인터프리터 패턴 (Interpreter pattern)
더 자세한 자료는? 여기로.
한글자료
https://mingrammer.com/translation-10-common-software-architectural-patterns-in-a-nutshell/#%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%ED%8C%A8%ED%84%B4-%EB%B9%84%EA%B5%90
영문자료
https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013
특정 영역용 패턴
J2EE
자바 기술로 기업환경의 어플리케이션을 만드는데 필요한 스펙들을 모아둔 스펙 집합
다음으로 이루어짐.
-
Servlet
클라이언트가 보내는 HTTP 요청을 처리하는 서버측 자바 프로그램.
-
JSP(Java Server Pages)
HTML이나 Java 코드를 써서 사용자에게 정보를 출력. JSP가 처음 실행될 때 Servlet 엔진이 이것을 Servlet 으로 컴파일시켜서 내부적으로는 Servlet으로 동작한다.
-
EJB(Enterprise Java Beans)
Java에서 제공하는 분산 컴포넌트 기술로 비즈니스 로직이나 데이터, 메시지를 처리할 수 있다.
-
Java Database Connector(JDBC)
여러 종류의 데이터베이스 시스템에 접근하는 단일한 인터페이스를 제공.
각각의 데이터베이스에 맞는 JDBC 드라이버가 있어야 한다.
-
Remote Method Invocation(RMI)
프록시를 써서 원격에 있는 Java 객체의 메소드를 실행시키기 위한기술.
-
Java Naming DirectoryInterface (JNDI)
자바 기술로 만들어진 객체에 이름을 붙여 찾을 수 있도록 단일한인터페이스를 제공.
-
Java Connector Architecture(JCA)
이기종 플랫폼을 통합할 수 있도록 플랫폼 독립적인 인터페이스를 제공.
-
Java Message Service (JMS)
여러 가지 메시징 시스템에 대한 플랫폼 독립적인 인터페이스를 제공.
출처: https://cheershennah.tistory.com/74 [Today I Learned. @cheers_hena 치얼스헤나]
안티 패턴
- 나쁜 해결책을 의미.
ex) 금망치(한가지 기술)
- 나쁜 해결책이 문서로 정리해두면 다른 개발자들이 그 문제점을 미리 파악하는데 도움을 줌.
예시.
https://ui.toast.com/fe-guide/ko_ANTI-PATTERN
https://it-jin-developer.tistory.com/20
https://en.wikipedia.org/wiki/Anti-pattern#Programming_anti-patterns
https://alkhwa-113.tistory.com/entry/%EC%95%88%ED%8B%B0-%ED%8C%A8%ED%84%B4-%EB%82%B4-%EC%83%9D%EA%B0%81-%ED%8F%AC%ED%95%A8
기타 참고자료