본문 바로가기

디자인 패턴13

Gof 구조 디자인 패턴 : 데코레이터 DTO 리팩터링이 너무 어렵다.... DTO 자체가 프레젠테이션 계층에 너무 종속되어 있기도 하고 여러 생성 메서드들이 많아서 어떻게 해야는지 참.. 고민이 많다. 하여튼 오늘 마무리는 데코레이터 패턴이다. 데코레이터의 핵심은 래퍼 객체이다. 개발을 하다보면 클라이언트에서 필요한 책임을 가진 객체를 런타임에 변경하여 해당 기능을 구현할 수 있다. 그런데 이것도 해야 되고 저것도 해야 하는데? 하나만 하면 안 되는 상황이 올 때 어떻게 해야 할까? 두 기능을 합친 클래스를 만들어 제공한다? 오 이 접근 방식은 실제 합성 클래스 코드뿐만 아니라 클라이언트의 코드도 복잡하게 될 것입니다. 왜냐? 하나의 클래스가 여러 개의 책임을 가질뿐더러 이에 필요한 객체들을 주입하는 과정도 두배가 될 것이고 기능 요청이 오.. 2022. 11. 21.
Gof 구조 디자인 패턴 : proxy 현재 알게 모르게 나는 많은 Proxy 패턴을 적용한 기술을 사용하고 있다. JPA, Spring Security, Transactional, DynamicProxy, Reflect API... 이러한 기술 자체는 정말 많은 생산성을 높여준다. 확장도 쉽고 성능도 개선하고 코드의 간결성까지 이러한 proxy패턴에 대해 조금 더 알아보자! Proxy 패턴의 의도 다른 객체에 대한 접근을 제어하기 위한 대리자 역할을 하는 객체를 배치한다. 이러한 프록시는 원래 객체에 대한 접근을 제어하므로, 요청이 원래 객체에 전달되기 전/후에 무언가를 수행할 수 있게 한다. Subject의 인터페이스는 프록시가 RealSubject로 위장하기 위해 필요한 인터페이스입니다. 실제 RealSubject는 유용한 비지니스 로직.. 2022. 11. 20.
Gof 행동 디자인 패턴 : State 행동 패턴 : 알고리즘 및 객체 간의 책임 할당과 관련이 있는 여러 가지 패턴들 최근 빌더패턴을 공부하면서 적합한 상황에 적용하여 많은 이점을 얻었다. 그런데 작성하는 코드를 보면서 이게 과연 객체의 책임이 여기 부여되는 것이 맞을까? 왜 이렇게 메소드에서 if - else if 문이 등장하지? 이러한 의문점을 가지고 행동 패턴을 공부하기 시작했다. 혹시 상태 패턴이 나의 궁금증을 풀어줄지.. 공부 시작해보자. 상태 - 객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 한다. 이는 스스로 행동을 변경할 수 있게 허가하는 패턴이다. 마치 객체가 행동을 변경할 때 객체가 클래스를 변경한 것처럼 보일 수 있다. 책의 예시를 한번 보자. TCP Conntection은 여러 상태를 가질 수.. 2022. 11. 20.
Gof 생성 디자인 패턴 : Builder 최근 객체 생성하는 일이 잦아지면서 반복적이고 영향을 쉽게 받는 객체를 생성하고 있다는 생각이 많이 들었다. 그래서 회사에서 디자인 패턴 책도 빌리고 관련 강의도 구매해 들으면서 생성 디자인 패턴 관련해 지식을 공부하면서 책과 강의에서 요구하는 그 조건에 맞추지 않고 디자인 패턴들의 개념을 습득하여 내 상황에 맞게 적용하고 싶었다. 3년 전 학원에서 디자인 패턴을 공부한 다했을 때 선생님이 지금은 너무 이르다고 일을 하다 보면 디자인 패턴을 공부하게 되는 적절한 타이밍이 올 거라고 했는데, 지금이 그 타이밍인 것 같다. 디자인 패턴 중 행동, 구조 패턴들은 여러 객체를 조립하고 객체의 책임을 분리하고 유연하게 사용하는 내용은 뭐랄까 이론만으로는 쉽게 체득되지 않았다. 그래서 생성 디자인 패턴은 이론을 공.. 2022. 11. 19.
GoF 행동 패턴 소개 (1) 빠르게 훑고 책으로 보충하자! 행동 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리한다. 책임 연쇄 패턴 책임 연쇄 패턴은 핸들러들의 체인을 따라 요청을 전달할 수 있게 해주는 패턴으로 Spring security에서 이와 같은 패턴을 찾아볼 수 있다. 각 핸들러는 요청을 받으면 해당 요청을 처리할지 아니면 다음 핸들러로 넘길지 결정할 수 있습니다. 1. 핸들러는 모든 핸들러에 공통적인 인터페이스를 선언한다. 이 인터페이스는 요청을 처리하기 위한 메서드와 다음 핸들러로 책임을 넘기는 메서드가 공통될 수 있다. 2. BaseHandler는 공통 처리 부분에 대한 핸들러이다. 3. 실제 구상 핸들러는 요청을 처리하기 위한 실제 코드가 포함되어 있으며 각 핸들러는 요청을 처리할지와 체인으로 넘길지 결정.. 2022. 11. 15.
GoF 구조적인 패턴 소개 나는 완벽한 것보단 완료를 더 추구한다. 그래서 무언가 내가 역할이 주어졌을 때 빠르게 프로토타입을 완성한다. 이 과정에서는 단위 테스트, 더 좋은 코드 구조 등.. 여러 가지 상황을 고려하지 않고 현재 가장 적합한 선택만으로 개발을 진행한다. 하지만 소프트웨어란 결국 사용자의 요구기능이 지속적으로 추가되어야 하는 것이고 그렇지 않다면 죽은 소프트웨어라 볼 수 있다. 그래서 우선 꼼꼼히 각종 테스트케이스를 만들려고 했다. 이 과정에서 막히는 부분이 존재했다. 무거운 작업을 하는 코드가 구현체로 존재해 실제 테스트마다 무거운 작업을 해야 하는 것이었다. 결국 테스트를 위해 코드의 구조를 조금 손봐야 했다. 하지만 디자인 패턴은 아직은 아니라고 공부를 미뤄왔던 내게 별다른 선택지가 없는 것을 깨닫고 GoF의.. 2022. 11. 6.
책임 연쇄 패턴 +[F] 책임 연쇄 패턴(Chanin of Responsibility Pattern)은 필요한 작업을 여러 객체에 분배하여 객체 간 결합도를 줄이게 해주는 행동 패턴 중의 하나로 명령과 명령을 각각의 방법으로 처리할 수 있는 처리 객체가 존재할 때 처리 객체들을 체인으로 엮고 명령을 처리 객체들이 체인 앞에서부터 하나씩 처리를 시도한다. 각 처리 객체는 자신이 처리할 수 없을 때 체인의 다음 처리 객체로 명령을 넘기며 체인의 끝에 다다르면 처리가 마루리된다. 새로운 처리 객체를 추가함으로써 처리 방법을 손쉽게 더할 수 있는 패턴이다. 이 패턴은 요청을 처리할 수 있는 객체가 여러 개이고 처리 객체가 특정적이지 않을 경우 권장됩니다. 다음과 같이 주문을 처리하는 하나의 워크플로우를 정의하기 위해 각 단계마다 자신이.. 2022. 2. 19.
데코레이터 패턴 + [F] 스프링에서는 빈 후처리기를 통해 스프링 컨테이너에 빈이 등록되기 전 다양한 조작을 할 수 있다. 빈이 등록되기 전 여러 작업을 하여 최종적으로 스프링 컨테이너에 등록한다. 또한 target의 메서드 호출 전 데코레이터 패턴을 추가하여 추가 기능을 확장할 수 있다. 함수형 프로그래밍에서는 Function Composition이라는 개념은 합성 함수를 만드는 개념입니다. 이 개념 또한 함수에 함수를 합성해 기능을 추가하는 기능으로 데코레이터 패턴을 확장한 개념이라고 할 수 있습니다. 이렇게 객체에 기능을 확장이 필요할 때 우리는 확장된 서브 클래스를 만드는 대신 데코레이터 패턴을 고려할 수 있습니다. 자바에서는 이러한 확장을 하기 위해선 다형성이라는 개념을 사용합니다. 인터페이스를 생성하고 해당 인터페이스를.. 2022. 2. 19.
빌더 패턴 + [F] 빌더 패턴은 생성 패턴(Creational Patterns)중 하나로 오브젝트의 생성에 관련된 패턴 중 하나이다. 객체의 생성에 대한 로직과 표현에 대한 로직을 분리 객체의 생성과정을 유연하게 해 준다. 객체의 생성과정을 직접 정의하고 싶거나 생성자가 복잡한 경우 Car Class에 빌더 패턴을 적용해보자. public class Car { private long id; private String name; private String brand; private BigDecimal distanceDriven; private boolean autopilot; } 기본 생성자로 객체를 정의하는 경우 우리는 빈 객체를 생성한 후 필드에 값을 주입하여 사용했다. 그런데 생성된 객체의 필드가 변경되지 않는 경우는 .. 2022. 2. 19.
데코레이터 패턴 이전에 공부했던 프락시 패턴의 핵심은 프락시를 도입해서 기존 코드의 영향을 주지 않고 접근 제어를 했다는 점이다. 또한 해당 프락시를 체인을 통해 추가할 수도 혹은 제거하여 구현체를 의존하도록 할 수도 있다. 데코레이터 패턴은 원래 서버가 제공하는 기능에 더해서 부가 기능을 수행하는 의도로 구현하는데, 예를 들어 요청 혹은 응답 값을 중간에 변형하거나, 특정 로그를 남기는 등 다양한 기능을 추가할 수 있다. 클라이언트 객체는 외부 객체와 협력하기위해 메시지를 주고받으며 동작한다. 이 과정에서 보통 다형성을 위해 인터페이스 혹은 상속을 많이 사용하는데, 인터페이스가 없는 경우를 생각해 보자. 1. Client가 Server를 직접 호출하는 경우에는 다음과 같은 의존성이 표현되어있다. @Slf4j publi.. 2022. 1. 21.