본문으로 바로가기

https://www.inflearn.com/course/디자인-패턴

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

어댑터 패턴

패턴 소개

- 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴

- 클라이언트가 사용하는 인터페이스를 따르지 않는 기존코드를 재사용 할 수 있게 해준다.

- 별도의 클래스 생성하기와 인터페이스 상속받아 구현하기 방법이 있다.

- OCP 및 SRP와 관련된 패턴

- 장점

 > 기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용 할 수 있다.

 > 기존 코드가 하던 일과 특정 인터페이스 구현체를 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있다.
- 단점

 > 새 클래스가 생겨 복잡도가 증가할 수 있다. 경우에 따라서는 기존코드가 해당 인터페이스를 구현하도록 하자.

 

자바와 스프링에서 찾아보는 패턴

- Array.asList

- Collections.enumeration

- Collections.list

- 스프링 MVC Handler Adaptor

 

브릿지 패턴

패턴 소개

- 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴
 > 사용자는 추상적인것만 사용

- 상속이 아닌 조합 (Composition) 을 사용함

- 나눠진 것을 브릿지를 만들어 연결하여 사용한다.

- Skin과 Champion으로 예시를 만듬

- 장점
 > 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.

 > 추상적인 코드와 구체적인 코드를 분리할 수 있다.

- 단점
 > 계층 구조가 늘어나 복잡도가 증가할 수 있다.

 

자바와 스프링에서 찾아보는 패턴

- JDBC
 > Connection 획득하고, Statement 실행하는 곳은 추상적인 부분
 > 구체적인 부분은 Dirver 내에 있음
- Slf4j 
 > 로깅퍼사드가 추상화된 부분
 > 로거들이 구현체

- Mailsender ,  PlatformTransactionManager

 

컴포짓 패턴

패턴 소개

- 트리 구조를 구성해야 하는 제약조건이 있음

- 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴

- 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일한 컴포넌트로 인지할 수 있는 계층 구조를 만든다.

- composite (Component 의 List) 은 leaf node를 참고하지않고, Component 인터페이스를 참고해야 한다.

- 전체나 부분이나 클라이언트는 동일하게 다룰 수 있다.

- 장점

 > 복잡한 트리구조를 편하게 사용할 수 있다.

 > 다형성과 재귀를 활용할 수 있다.

 > 새로운 타입의 Leaf Component가 추가되어도 Client는 변경되지 않는다. (OCP 원칙)

 

자바와 스프링에서 찾아보는 패턴

- 자바 Swing
  -> JButton, JTextField는 Component 상속
  -> JFrame은 Composite 

  

데코레이터 패턴

패턴 소개

- 런타임에 기존 코드를 확장하는 방법

- 상속은 유연하지 않다.

 -> 다중상속 문제

- 기존코드를 변경하지 않고 부가기능을 추가하는 패턴

 - 상속이 아닌 위임을 사용해서 보다 유연하게 (런타임에) 부가기능을 추가하는 것도 가능하다.

- 장점

 > 새로운 클래스를 만들지 않고, 기존 기능을 조합할 수 있다.

 > SRP

 > 컴파일 타임이 아닌 런타임에 동적으로 기능을 변경할 수 있다.

- 단점

 > 데코레이터를 조합하는 코드가 복잡할 수 있다.

 

자바와 스프링에서 찾아보는 패턴

- IO 관련하여 다른 인터페이스를 감싸면서 다른 구현체, 인터페이스를 반환

- HttpRequestWrapper

- Bean decorator

- HttpReqeustDecorator 

 

퍼사드 패턴

패턴 소개

- 퍼사드는 건물의 입구쪽 전경을 나타내는 말

- 복잡한 서브 시스템 의존성을 최소화 하는 방법

- 클라이언트가 사용해야하는 복잡한 서브시스템 의존성을 간단한 인터페이스로 추상화 할 수 있다.

- 장점

 > 서브시스템에 대한 의존성을 한곳으로 모을 수 있다.

- 단점

 > 퍼사드 클래스가 서브시스템에 대한 모든 의존성을 가지게 된다.

자바와 스프링에서 찾아보는 패턴

- MailSender <-> JavaMailSenderImpl

- PlatformTransactionManager <-> Jdbc TransactionManager

 

플라이 웨이트 패턴

패턴 소개

- 자주 사용하는 속성을 재사용해서 메모리 낭비를 줄임
 > extrinsic : 자주 사용하는 속성 (외인성)

 > intrinsic : 변하지 않는 속성 (본질적인)

- 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴

- 'final'을 사용하여 instrisit 객체 구성 (immutable)

 > Intrinsit에 Factory 구축하여 캐시역할을 함

- 도메인에서 주로 사용

- 단점
 > 복잡도 증가

 

자바와 스프링에서 찾아보는 패턴

- Integer valueOf
 > -128 ~ 128은 캐싱하며, 자주 사용하는 수도 캐싱함
 +) valueOf vs parseInt

 

Integer.parseInt() vs Integer.valueOf() 차이

자바에서 스트링을 숫자 값으로 변형할 때 Integer.parseInt() vs Integer.valueOf() 이 메소드를 많이...

blog.naver.com

 

프록시 패턴

패턴 소개

- 특정한 객체의 operation을 지나기 전에 프록시 객체를 거치게 함

- 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴

- 장점

 > 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다. (OCP, SRP)

 > 초기화 지연등을 다양하게 활용할 수 있다.

- 단점
 > 코드 복잡도 증가