Spring Boot/디자인 패턴

디자인 패턴(생성패턴, 구조패턴, 행위패턴)

운동하는 주니어개발자 2023. 4. 20. 02:32

오늘은 디자인 패턴에 대해 공부를 해보았다. 우선 디자인 패턴에 대한 설명이다.

디자인 패턴

자주 사용하는 설계 패턴을 정형화 해서 이를 유형별로 가장 최적의 방법으로 개발을 할 수 있도록 정해둔 설계이다.

알고리즘과 유사 하지만 명확하게 정답이 있는 형태는 아니며 프로젝트의 상황에 맞추어 적용 가능하다.

Gof 디자인 패턴

소프트웨어를 설계 할 때는 기존에 경험이 매우 중요하다. 그러나 모든 사람들이 다양한 경험을 가지고 있을 수는 없다.

이러한 지식을 공유하기 위해서 나온 것이 GOF (Gang of Four) 의 디자인 패턴이다. 객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인 패턴으로 정리 해둔 것이다.

Gof의 디자인 패턴은 총 23개 이며 이를 잘 이해하고 활용한다면 경험이 부족하더라도 좋은 소프트웨어 설계가 가능하다.

디자인 패턴의 장점 디자인 패턴의 단점

개발자(설계자) 간의 원활한 소통이 가능 객체지향 설계 / 구현

소프트웨어 구조 파악 용이 초기 투자 비용 부담

재사용을 통한 개발 시간 단축

설계 변경 요청에 대한 유연한 대처

1.생성 패턴

객체를 생성하는 것과 관련된 패턴으로 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 하고 코드의 유연성을 높여 준다.

생성 패턴의 종류

Factory Method (팩토리)

Singleton (싱글톤)

Prototype (프로토타입)

Builder (빌더)

Abstract Factory ( 추상 팩토리)

Chaining (체이닝)

2. 구조 패턴

프로그램 내의 자료구조나 인터페이스 구조 등 프로그램 구조를 설계하는데 활용 될 수 있는 패턴이다.

클래스, 객체들의 구성을 통해서 더 큰 구조를 만들 수 있게 해준다.

큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는데 이런 복잡한 구조를 개발하기 쉽게 만들어 주고 유지 보수 하기 쉽게 만들어 준다.

구조 패턴의 종류

Adapter

Composite

Bridge

Decorator

Facade

Flyweight

Proxy

3. 행위 패턴

반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 제공 한다. 행위 패턴은 행위 관련 패턴을 사용하여 독립적으로 일을 처리하고자 할 때 사용한다.

행위 패턴의 종류

Template Method

Interpreter

Iterator

Observer

Strategy

Visitor

Chain of responsibility

Command

Mediator

State

Memento

4. Singleton pattern

싱클톤 패턴은 어떠한 클래스 (객체)가 유일하게 1개만 존재 할 때 사용한다.

이를 주로 사용하는 곳은 서로 자원을 공유 할 때 사용하는데 실물 세계에서는 프린터가 해당되며 실제 프로그래밍 에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다.

Singleton pattern의 예제 소스코드 이다.

SocketClient를 이용하여 AClazz에 생성된 객체와 BClazz에 생성된 두개의 객체가 동일한지 확인하는 예제이다.

AClazz.java

package com.company.design.singleton;

public class AClazz {
    private SocketClient socketClient;

    public AClazz() {
        this.socketClient = SocketClient.getInstance();
    }
    public SocketClient getSocketClient() {
        return this.socketClient;
    }
}

BClazz.java

package com.company.design.singleton;

public class BClazz {

    private SocketClient socketClient;

    public BClazz() {
        this.socketClient = SocketClient.getInstance();
    }

    public SocketClient getSocketClient() {
        return this.socketClient;
    }
}

SocketClient.java

package com.company.design.singleton;

public class SocketClient {

    private static SocketClient socketClient = null;

    private SocketClient() {

    }

    public static SocketClient getInstance() {
        if(socketClient == null) {
            socketClient = new SocketClient();
        }
        return  socketClient;
    }

    public void connect() {
        System.out.println("connect");
    }
}

Main.java

package com.company.design;

import com.company.design.adapter.*;
import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;

public class Main {
    public static void main(String[] args) {

        //싱클톤 예제
        
        AClazz aClazz = new AClazz();
        BClazz bClazz = new BClazz();

        SocketClient aClient = aClazz.getSocketClient();
        SocketClient bClient = bClazz.getSocketClient();

        System.out.println("두개의 객체가 동일한가?");
        System.out.println(aClient.equals(bClient));
    }
}

Singleton pattern예제 결과

5. Adapter pattern

Adapter는 실생활에서는 100v를 220v 로 변경해주거나 그 반대로 해주는 흔히 돼지코 라고 불리는 변환기를 예로 들 수 있다.

호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용 할 수 있도록 한다.

SOLID중에서 개방폐쇄 원칙을 따른다.

Adapter pattern의 예제 소스코드 이다.

Adapter를 이용하여 돼지코와 같은 역할을 하여 110V를 220V로 바꿔주는 간단한 예제이다.

Electronic110V

package com.company.design.adapter;

public interface Electronic110V {
    void powerOn();
}

Electronic220V

package com.company.design.adapter;

public interface Electronic220V {
    void connect();
}

AirConditioner.java

package com.company.design.adapter;

public class AirConditioner implements Electronic220V{
    @Override
    public void connect() {
        System.out.println("에어컨 220V on");
    }
}

Cleaner.java

package com.company.design.adapter;

public class Cleaner implements Electronic220V{
    @Override
    public void connect() {
        System.out.println("청소기 220V on");
    }
}

HairDryer.java

package com.company.design.adapter;

public class HairDryer implements Electronic110V{
    @Override
    public void powerOn() {
        System.out.println("헤어 드라이기 110V on");
    }
}

SocketAdapter.java

package com.company.design.adapter;

import com.company.design.singleton.SocketClient;

public class SocketAdapter implements Electronic110V{

    private Electronic220V electronic220V;

    public SocketAdapter(Electronic220V electronic220V) {
        this.electronic220V = electronic220V;
    }

    @Override
    public void powerOn() {
        electronic220V.connect();
    }
}

Adapter pattern의 예제 결과

이상으로 오늘 공부는 또 마무리가 되었다.

패턴에 대해서 이론적으로만 공부했었지 처음으로 실습을 하면서 패턴에 대해 공부해보니 새로웠다.

각자 다른 클래스에 있는 객체들이 싱글톤 패턴으로 인해 같다는 예제와

110V의 전기만 지원되는 가정집에서 220V의 전기를 사용하고자 할 때 어댑터 패턴을 이용하여

돼지 코의 기능을 사용하여 220V의 전기를 사용 할 수 있게끔 하는 예제까지

각 패턴에 대해 이해하기 쉬운 예제였던거 같아서 좋았다.

아직 많은 패턴이 남아 있기에 다음 시간에는 다음 패턴들을 가지고 공부하고 예제를 풀어보도록 하겠다.

그럼 20000 ~

'Spring Boot > 디자인 패턴' 카테고리의 다른 글

디자인 패턴(프록시 패턴)  (0) 2023.04.20