디자인 패턴

2024. 3. 6. 23:48카테고리 없음

디자인 패턴이란?

프로그램을 설계할 떄 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의  '규약'형태로 만들어 놓은 것을

의미한다.

 

싱글톤 패턴(singleton pattern)

하나의 클래스에 오직 하나의 인스턴스만을 가지는 패턴이다. 보통 데이터베이스 연결 모듈에 많이 사용한다.

싱글톤 패턴을 사용하는 경우는 객체가 리소스를 많이 차지하는 역할을 하는 무거운 클래스 일때 객체를 한 번만 생성하여 사용한다.

ex) 데이터베이스 연결

 

말보다 코드가 이해하기 편하니 코드를 한번 보자

class Singleton{
	ptivate static class singleInstanceHolder{
		private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance(){
    	return singletonInstanceHolder.INSTANCE;
    }
}

singleInstanceHolder에서 객체가 생성되게 된다. 이 객체를 getInstance를 호출하여 가져와 사용하게 된다.

여러개의 인스턴스(싱글톤 X) -> Singleton a = new Singleton();

하나의 인스턴스(싱글톤 O) -> Singleton a = Singleton.getInstance();

 

단점

TDD(Test Driven Development)를 할 때 문제가 된다. 단위 테으스는 테스트가 서로 독립적이여야 하는데 하나의 인스턴스를 기반으로 하다 보니 테스트마다 독립적인 인스턴스를 만들기가 어렵다.

또한 모듈 간의 결합이 강해지는데 이는 의존설 주입(DI, Dependency Injection)을 통해 느슨하게 만들 수 있다.

 

팩토리 패턴(singleton pattern)

객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를

결정하고, 하위 클래스에서는 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.

 

abstract class Coffee{
    public abstract int getPrice();
    
    @Override
    public String toString(){
        return "Hi this coffee is " + this.getPrice();
    }
}

class CoffeeFactory{
    public static Coffee getCoffee(String type, int price){
        if("Latte".equalsIgnoreCase(type)) return new Latte(price);
        else {
            return new DefaultCoffee();
        }
    }
}

class DefaultCoffee extends Coffee{
    private int price;
    
    public DefaultCoffee(){
        this.price= -1;
    }
    
    @Override
    public int getPrice(){
        return this.price;
    }
}

class Latte extends Coffee{
    private int price;

    public Latte(int price){
        this.price= price;
    }

    @Override
    public int getPrice(){
        return this.price;
    }
}

 

옵저버 패턴(Observer pattern)

주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때 마다 메서드 등을 통해 옵저버들에게 변화를 알려주는 디자인 패턴

MVC패턴에서 사용 -> 모델이 변경 사항이 생기면 옵저버가 뷰에 알려주고 이를 기반으로 컨트롤러 등이 작동함

 

프록시 패턴과 프록시 서버

프록시 패턴 : 대상 각체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 앞단의 인터페이스 역할을 하는 패턴이다.'

프록시 객체 : 어떠한 대상의 기본적인 동작의 작업을 가로챌 수 있는 객체를 뜻한다.

프록시 서버 : 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 

시스템이나 응용 프로그램을 가리킨다. -> 주로 nginx에서 사용(node.is서버 앞단에 프록시서버를 배치)

 

MVC패턴

모델(Model), 뷰(View), 컨트롤러(Controller)로 이루어진 디자인 패턴이다. 컨트롤러와 뷰가 1대n관계

 

모델 : 애플리케이션의 데이터인 데이터베이스, 변수, 상수 등을 의미한다. 뷰에서 데이터를 생성하거나 수정하면 컨트롤러를 통해 모델을

생성하거나 갱신한다.

 

뷰 : 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻한다. 모델이 가지고 있는 정보를 따로 저장하지 않아야 하며 화면에 표시되는 정보만

가지고 있어야 한다. 변경이 일어나면 이를 컨트롤러에 전달한다.

 

컨트롤러 : 하나 이상의 모델과 하나 이상의 뷰를 잇는 다리 역할을 하며 메인 로직을 담당한다. 모델과 뷰의 생명주기를 관리하며, 모델이나 뷰의 변경 통지를 받으면 각각의 구성 요소에 해당 내용에 대해 알려준다.

 

 

MVC패턴의 대표적인 예 -> spring

 

MVP패턴

MVC에서 C에 해당하는 컨트롤러가 프레젠터(presenter)로 교체된 패턴이다.

뷰와 프레젠터가 1대1 관계이므로 MVC패턴보다 더 강력한 결합을 가진다.

 

MVVM패턴

MVC의 C에 해당하는 컨트롤러가 뷰모델(View Model)로 바뀐 패턴이다.

뷰와 뷰모델 사이에 양방향 데이터 바인딩을 지원하며 UI를 별도의 코드 수정 없이 재사용할 수 있고 단위 테스팅 하기 쉽다는 장점이 있다.

 

참고&출처

면접을 위한 CS 전공지식 노트(주홍철)

https://velog.io/@summerdewyes/%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%ED%8C%A8%ED%84%B4-MVC-MVP-MVVM