[싱글톤 패턴&전략 패턴] 주요 백엔드 디자인 패턴

2 분 소요

  1. MVC (Model-View-Controller) 패턴
  2. 싱글톤 (Singleton) 패턴
  3. 팩토리 (Factory) 패턴
  4. 옵저버 (Observer) 패턴
  5. 전략 (Strategy) 패턴
  6. 의존성 주입 (Dependency Injection) 패턴
  7. 어댑터 (Adapter) 패턴

싱글톤 패턴으로 데이터베이스 연결 관리하기

싱글톤(Singleton) 패턴

클래스의 instance가 오직 하나만 생성되도록 보장하는 디자인 패턴

Connection Pool 관리: 데이터베이스 연결과 같은 공유 자원을 단일 인스턴스로 관리할 때 유용

구현방법

  1. 생성자를 private으로 선언
  2. 클래스 내부에 자신의 정적 인스턴스를 보관
  3. 인스턴스에 접근할 수 있는 정적 메소드 제공

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2024-07-16_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_9 19 47

_정적 메소드(static method)_는 클래스로 객체를 생성하지 않아도 호출이 가능한 메소드

_private static_은 프로그래밍에서 특정한 멤버나 메서드가 클래스 내부에서만 접근 가능하고, 해당 멤버 또는 메서드가 클래스 인스턴스에 속하는 것이 아니라 클래스 자체에 속한다는 것을 나타내는 키워드 조합입니다. 이는 주로 객체 지향 프로그래밍 언어에서 사용됩니다.

정적 (Static)

// static 있는 버전
public static DatabaseConnection getInstance() {}
DatabaseConnection dbConnection1 = DatabaseConnection.getInstance();

//static 없는 버전
public DatabaseConnection getInstance() {}
DatabaseConnection dbConnection2 = new DatabaseConnection();
DatabaseConnection instance = dbConnection2.getInstance();
  • static이 없는 경우 객체를 생성해야 호출이 가능함
  • static이 없는 경우 여러 개의 connection 객체를 생성해야 함 ⇒ 비효율적
    • 바뀐 data를 다른 connection 객체도 업데이트가 되나?
  • static이 있는 경우 하나의 connection 객체를 가지고 여러 개의 instance 변수를 사용하여 서로 다른 곳에서 클래스를 호출해도 동일한 객체를 반환.
도움이 된 예시
MysqlConnection dbInstance1 = MysqlConnection.getInstance();
MysqlConnection dbInstance2 = MysqlConnection.getInstance();
MysqlConnection dbInstance3 = MysqlConnection.getInstance(); // getInstance는 static 으로 구현
//dbInstance1 == dbInstance2 == dbInstance3

Connection connection1 = dbInstance1.getConnection();
Connection connection2 = dbInstance2.getConnection();
Connection connection3 = dbInstance3.getConnection();
// getConnection는 static 메소드가 아님 => 클래스의 인스턴스를 생성하고, 인스터스를 통해서 실행
// connection1 == connection2 == connection3
// Class (Shape, 틀)
// Instance (클래스로 만든 실제 객체 / Shape로 만든 실제 객체/모양)

// 싱글톤 => MysqlConnection 클래스의 인스턴스를 한 번만 생성해야 한다 => MysqlConnection 클래스의 생성자를 한 번만 실행해야 한다.
class MysqlConnection {
static Instance instance;

static get() {
	if(instance == null) {
		instance = new MysqlConnection();
		return instance;
	}
	return instance;
}
}
// 1 try) MysqlConnection.get(); => return new MysqlConnection(); (생성자 실행 -> 새로운 인스턴스 생성 -> 인스턴스 반환)
// 2 try) MysqlConnection.get(); => return instance; (생성자 실행 X -> 기존 인스턴스 반환)
// 3 try) MysqlConnection.get(); => return instance; (생성자 실행 X -> 기존 인스턴스 반환)

//서로 다른 곳에서 클래스를 호출
//post.java
MysqlConnection.get(); => return new MysqlConnection(); // (생성자 실행 -> 새로운 인스턴스 생성 -> 인스턴스 반환)

//user.java
MysqlConnection.get(); => return instance; // (생성자 실행 X -> 기존 인스턴스 반환)

//comment.java
MysqlConnection.get(); => return instance; // (생성자 실행 X -> 기존 인스턴스 반환)

JDBC (Java Database Connectivity)

Roki Tech Blog - [JDBC] Java Spring과 Database(MySQL) 연결하기

코드

GitHub - KimGyeongLock/connection_pool_singleton_pattern: 싱글톤 패턴으로 데이터베이스 연결 관리하기

전략 패턴으로 상품 할인 관리 시스템 구현하기

전략(Strategy) 패턴

객체의 행위클래스로 캡슐화, 행위 = 필요에 따라 교체 가능

⇒ 유연성, 코드 재사용성

<행위>

  • 고정 가격 할인 (Fixed Amount Discount)
  • 퍼센트 할인 (Percentage Discount)
  • 혼합 할인 (Mixed Discount)

구성 요소

  • 전략 (Strategy): 인터페이스추상 클래스를 통해 특정 행위를 정의
  • 구체적인 전략(Concrete Strategy): 전략 인터페이스를 구현한 실제 알고리즘 클래스s
  • 컨텍스트(Context): 전략 객체를 사용하는 클라이언트
    • 전략을 실행하는 메서드를 호출하여 해당 전략을 교체 및 설정
    • 전략 교체가 편리함
      Product product1 = new Product("Laptop", 1000);
      Product product2 = new Product("Smartphone", 600);
    

전체 프로젝트 구조

concrete_strategy/
    FixedAmountDiscount.java
    MixedDiscount.java
    PercentageDiscount.java
context/
  Product.java
strategy/
	  DiscountStrategy.java
StrategyApplication.java

코드

GitHub - KimGyeongLock/product_discount_strategy_pattern: 전략 패턴으로 상품 할인 관리 시스템 구현

카테고리:

업데이트: