디자인 패턴

디자인 패턴/GOF

Proxy Pattern, Decorator Pattern

구조 패턴(Structure Pattern)은 구조가 복잡한 시스템 개발에 도움을 줄 수 있다. 그 중 프록시 패턴은 접근이 어려운 객체에 접근할 수 있도록 인터페이스 역할을 수행 하고, 데코레이터 패턴은 클래스에 기능을 추가하기 위해 다른 객체를 덧붙이는 형태이다. 실무에서는 스프링 빈으로 등록할 클래스에 인터페이스가 있는 경우, 없는 경우, 스프링 빈을 수동으로 직접 등록하는 경우, 컴포넌트 스캔으로 자동 등록하는 경우가 있다. 이렇게 다양한 케이스에서 프록시를 어떻게 적용하는지 알아본다. 즉, 다음과 같은 요구사항이 추가되었다고 생각해보자. 원본 코드를 전혀 수정하지 않고, 로그 추적기를 사용한다. 특정 메서드는 보안상 로그를 출력하지 않는다. 위의 예와 같은 다양한 케이스에 기능을 적용한다. 대리..

디자인 패턴

Template Callback Pattern

/** * 전략을 파라미터로 전달받는 방식 */ @Slf4j public class ContextV2 { public void execute(Strategy strategy) { long startTime = System.currentTimeMillis(); strategy.call(); // 위임 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime = {}", resultTime); } } /** * 변하는 알고리즘 */ public interface Strategy { void call(); } 위의 ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부..

디자인 패턴/GOF

Template Method Pattern 적용

좋은 설계는 변하는 것과 변하지 않는 것을 분리하는 것이다. 예를들어, 핵심 기능 부분이 변하고, 부가 기능 부분이 변하지 않는 부분이라면, 이 둘을 분리해서 모듈화해야 한다. 템플릿 메서드 패턴은 이런 문제를 해결하는 디자인 패턴이다. 다음에서 추상 클래스를 활용해서 부모 클래스에 변하지 않는 템플릿 코드를 두고, 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용해서 처리하는 것을 볼 수 있다. /** * 변하지 않는 부분 */ @Slf4j public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); call(); long endTime = System.cur..

디자인 패턴/OOP

OOP

소프트웨어 모듈(함수, 클래스)이 가져야 할 3가지 기능은 무엇일까? 필요한 기능이 오류없이 제대로 동작하는 것 변경에 용이한 코드 누가 읽어도 이해하기 쉬운 코드(동작이 우리의 상식 또는 예측에서 크게 벗어나지 않는 코드) 기능을 모듈화하는 이유 모듈의 재사용을 위해서 객체지향 패러다임: 협력, 책임, 역할 도메인: 음료 주문 시스템 협력이란? 협력은 객체 간의 상호작용을 통해서 이뤄진다. 객체 간의 상호작용은 메시지를 통해서만 가능하다. 작은 단위로 쪼개진 기능 목록 주문 받기 주문 결제 금액 계산 커피 제조 커피 전달 책임이란? 협력에 참여하기 위해서 객체가 맡고있는 전체 기능 정의서 작성중..

디자인 패턴/GOF

Strategy Pattern

✏️ 개요 전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 즉, 상속이 아니라 위임으로 문제를 해결하는 것이다. 전략 패턴에서 Context는 변하지 않는 템플릿 역할을 하고, Strategy는 변하는 알고리즘 역할을 한다. GOF 디자인 패턴에서 정의한 전략 패턴의 의도는 다음과 같다. '알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환이 가능하게 만든다. 전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.' ❓ 사용법 Context public class ContextV1 { private Strategy strategy; public ..

디자인 패턴/GOF

Template Method Pattern

✏️ 개요 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿 코드를 둔다. 그리고 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용해서 처리한다. 💻 자바에 적용 템플릿 public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); // 비즈니스 로직 실행 call(); // 상속 // 비즈니스 로직 종료 long endTime = System.currentTimeMillis(); long resultTime = endTime - startTime; log.info("resultTime = {}", resultTime); } protected abstract..

디자인 패턴/OOP

OOP의 4가지 특징

❓OOP란 우리가 보고 인지하는 실제 세계를 흉내내어 가장 기본적인 단위인 객체들을 만들고, 그것들 간의 유기적인 상호 작용을 규정하여 프로그램을 발전시키는 프로그래밍 방법론 1. 추상화 객체의 공통적인 속성(변수)와 기능(메서드)를 추출하여 정의하는 것 자바에서 추상화를 구현할 수 있는 문법 요소로는 추상 클래스와 인터페이스가 있다. 객체 지향적 설계에 있어서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들간의 관계를 보다 유연하게 연결하는 역할을 담당한다. 인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것이다. 역할과 구현의 분리 객체 지향 프로그램에서는 ..

디자인 패턴/OOP

SOLID (좋은 객체 지향 설계의 5가지 원칙)

✏️ 개요 SOLID 원칙이란 객체지향 설계에서 지켜줘야 할 5개의 소프트웨어 개발 원칙을 말한다. 해당 용어의 개념 이론들은 oop의 4가지 특징(추상화, 상속, 다형성, 캡슐화) 등의 개념들을 재정립한 것이다. 또한 5가지 원칙들은 서로 개념적으로 연관되어 있다. SRP : 단일 책임 원칙 (single responsibility principle) OCP : 개방-폐쇄 원칙 (Open/closed principle) LSP : 리스코프 치환 원칙 (Liskov substitution principle) ISP : 인터페이스 분리 원칙 (Interface segregation principle) DIP : 의존관계 역전 원칙 (Dependency inversion priciple) ❓ 좋은 설계란 무..

디자인 패턴/OOP

인터페이스와 다형성(polymorphism) 그리고 추상클래스

✏️ 개요 인터페이스 사용하는 클래스가 사용되는 클래스의 종류와 상관없는 독립적인 클래스가 된다. 인터페이스의 메서드는 반드시 구현해야 하는 강제성을 갖는다. 추상클래스 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 자바의 돌연변이 같은 클래스이다. 다형성 객체가 한 개 이상의 자료형의 타입을 갖게되는 특성을 의미한다. 부모 자식 상속 관계에 있으면 부모 타입으로 자식 클래스 타입을 받아 초기화할 수 있다. 자바에선 대표적으로 Overloading, Overriding, UpCasting, DownCasting, Interface, 추상메서드, 추상클래스 방법이 모두 다형성에 속한다. 🔎 자료형 다형성 다형성의 핵심은 '타입 묶음'이다. 공통적인 상속 클래스의 특징을 이용해 각 자료형의 타입을 ..

kimjingyu
'디자인 패턴' 카테고리의 글 목록