Computer Science

디자인 패턴의 의미와 여러가지 디자인패턴

Robinkim93 2023. 2. 11. 21:21

# 디자인패턴

프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 것을 의미. 우리가 코드를 칠 때 사용하는 라이브러리나 프레임워크의 이론적인 뼈대가 되는 개념이기 때문에 반드시 알아둬야 한다. 

* 라이브러리나 프레임워크도 코드를 칠 때 어떤 문제를 보다 쉽고 효과적으로 해결하기 위해 등장한 것이기 때문

# 싱글톤 패턴

하나의 클래스에 하나의 인스턴스만 가질 수 있도록 하는 패턴. 기본적으로는 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 생성할 수 있지만 그렇게 하지 않고 하나의 인스턴스만 만들어 이를 기반으로 로직을 만드는 데 사용되며 보통 I/O 바운드 작업에 사용된다.

* I/O 바운드 : 디스크 연결, 네트워크 통신, 데이터베이스 연결 등

## 장점

1. 인스턴스를 생성하는 비용이 줄어든다 (데이터베이스 연결을 할 때, 단 한 번 인스턴스를 생성하면서 데이터베이스와 연결을 하고, 데이터베이스와 연결되어있는 인스턴스를 기반으로 데이터베이스에 대한 요청 ex) Query, Transaciton 등의 행위가 이루어질 수 있기 때문에 매번 요청을 보낼 때마다 연결을 새로 할 필요가 없어진다.)

## 단점

1. 의존성이 높아진다 (인스턴스를 하나만 만들어서 그 인스턴스를 계속 공유하기 때문)

2. 테스트코드 작성 시 보통 단위 테스트를 많이 하는데, 단위 테스트는 서로 독립적이어야 실행이 용이하다. 하지만 싱글톤 패턴은 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 독립적인 인스턴스를 생성해서 테스트 하기 어렵다.

# 팩토리 패턴

객체를 사용하는 코드에서 객체를 생성하는 부분을 떼어내 추상화한 패턴.

상위 클래스는 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 클래스 간 상속관계가 만들어지는 패턴.

 

특징으로는, 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며, 상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요가 없어지기 때문에 더 많은 유연성을 가지게 된다.

 

또한, 객체를 생성하는 로직이 분리되어 있기 때문에 코드를 리팩토링 하더라도 한 곳만 고치면 되니 유지보수성이 증가한다. (하위 클래스만 수정하면 리팩토링 가능)

 

상단의 코드는 팩토리 패턴을 단순화한 코드이다.

 

1. 최상단 두 개의 class에서는 각 각 커피에 대한 레시피를 만들어 놓고, 또 각 각의 팩토리에서 호출하여 커피를 만들어 낼 수 있는 환경을 만들었다.

2. 이 팩토리들이 하위 클래스가 되고, CoffeeFactory가 상위 클래스가 되는데,

3. 상위 클래스에서는 factory를 모아놓은 factoryList에 받은 Factory의 이름을 키값으로 하여 하위 클래스를 호출하고, 호출되어 생성된 인스턴스를 주입받아 factory에 담고, 해당하는 factory 내부에 createCoffee 메서드를 실행한다.

 

코드에서 볼 수 있듯이, 상위 클래스에서는 하위 클래스가 어떤 인스턴스를 생성하는지 알 수 없을 뿐더러, 알 필요가 없어지기 때문에 코드에 문제가 생겼다면 실제 로직을 수행하는 하위 클래스만 수정하면 유지보수가 가능해지는 것이다.

 

또한, 3번 단계에서 의존성 주입이라는 것이 발생하는데, 쉽게 생각하면 factory에 LatteFactory가 담겨서 선언되었다면, CoffeeFactory는 LatteFactory에 의존성이 생기는 것이다. 이유는 LatteFactory의 내용이 변하면 CoffeeFactory의 내용도 변하기 때문이라고 이해하면 편하다.

 

추가적으로, CoffeeFactory에서 static으로 메서드를 선언해줬는데 이것을 정적 메서드라고 한다. 정적 메서드를 사용해서 class 내부의 메서드를 선언하게 되면 클래스가 인스턴스를 생성하지 않아도 메서드를 호출이 가능하여 메모리를 절약할 수 있고 (인스턴스 생성과정을 생략하기 때문에) 개별 인스턴스에 묶이지 않고 클래스 내에 함수를 정의할 수 있는 장점이 생긴다.