학습
PHP 디자인 패턴 기초
PHP 디자인 패턴 기초 — 중급
디자인 패턴 기초
1. 도입 (왜 배워야 하는가)
디자인 패턴은 소프트웨어 개발에서 발생할 수 있는 다양한 문제를 해결하기 위해 고안된 재사용 가능한 솔루션입니다. 실무에서 디자인 패턴을 이해하고 활용하는 것은 코드의 가독성과 유지보수성을 높이며, 협업 시 팀원 간의 소통을 원활하게 만들어 줍니다.
디자인 패턴을 모를 경우, 다음과 같은 문제가 발생할 수 있습니다:
- 코드 중복: 비슷한 기능을 하는 코드가 여러 곳에 존재해 유지보수가 어려워짐.
- 확장성 부족: 새로운 기능 추가 시 기존 코드를 손보기 어려워져서 오류가 발생할 가능성이 높아짐.
- 소통 장애: 팀원 간에 코드를 이해하는 데 필요한 시간이 증가하고, 의사소통이 원활하지 않음.
2. 핵심 개념 설명
디자인 패턴
디자인 패턴은 특정 상황에서 문제를 해결하기 위한 일반적인 해결책입니다. 마치 요리 레시피와 같아서, 특정 재료(문제)에 대해 어떻게 요리(해결)할지를 제시합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 패턴 | 반복적으로 발생하는 문제의 해결책 |
| 구조적 패턴 | 클래스나 객체의 조합을 통해 기능을 구현 |
| 행위적 패턴 | 객체 간의 상호작용을 정의 |
3. 기본 코드 예제
아래는 싱글톤(Singleton) 패턴의 기본 예제입니다. 싱글톤 패턴은 클래스의 인스턴스가 오직 하나만 생성되도록 보장합니다.
class Singleton {
private static $instance = null;
private function __construct() {
// 생성자는 private로 설정
}
public static function getInstance() {
if (self::$instance null) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
// 인스턴스 생성
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();
// 결과 확인
var_dump($instance1 = $instance2); // bool(true)
Singleton 클래스 정의$instance 변수를 private static으로 선언하여 클래스 내부에서만 접근 가능getInstance 메서드에서 인스턴스를 생성하고 반환4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니를 구현할 때
장바구니는 사용자가 여러 번 접근할 수 있으며, 동일한 장바구니 인스턴스를 사용해야 합니다.
class Cart {
private static $instance = null;
private $items = [];
private function __construct() {}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Cart();
}
return self::$instance;
}
public function addItem($item) {
$this->items[] = $item;
}
public function getItems() {
return $this->items;
}
}
// 장바구니에 아이템 추가
$cart = Cart::getInstance();
$cart->addItem('상품1');
$cart->addItem('상품2');
// 장바구니의 아이템 확인
print_r($cart->getItems());
예제 2: 데이터베이스 연결 관리
데이터베이스 연결을 싱글톤 패턴으로 관리하여 여러 번 연결을 생성하지 않도록 합니다.
class Database {
private static $instance = null;
private function __construct() {
// DB 연결 코드
}
public static function getInstance() {
if (self::$instance null) {
self::$instance = new Database();
}
return self::$instance;
}
}
// DB 인스턴스 호출
$db1 = Database::getInstance();
$db2 = Database::getInstance();
var_dump($db1 = $db2); // bool(true)
5. 흔한 실수와 주의사항
실수 1: 생성자 접근 제한을 잊는 것
class Singleton {
public function __construct() {
// 공개 생성자
}
}
private function __construct() {
// 생성자는 private로 설정
}
실수 2: 인스턴스 생성 시점
$a = Singleton::getInstance();
$b = Singleton::getInstance();
getInstance를 사용하여 인스턴스 얻기