본문으로 바로가기

싱글 톤 패턴

category Spring boot 2024. 9. 25. 18:50
학습 목표
1. 싱글톤 패턴에 대해서 알아보고 직접 코드를 작성할 수 있다.
2. 싱글톤 패턴을 언제 어떻게 활용할 수 있는지 말할 수 있다.

 

사전기반 지식

  • 클래스와 객체: 자바에서 클래스는 객체를 생성하기 위한 틀입니다. 일반적으로 하나의 클래스에서 여러 객체를 생성할 수 있지만, 싱글톤 패턴은 단 하나의 객체만을 보장합니다.
  • 생성자(Constructor): 객체가 생성될 때 호출되는 메서드로, 싱글톤 패턴에서는 생성자를 외부에서 호출하지 못하도록 제한합니다.
  • 정적 변수와 메서드: 싱글톤 패턴에서 주로 사용되는 정적(static) 멤버에 대한 이해가 필요합니다.

 

싱글톤 패턴 개념

싱글톤 패턴은 특정 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 접근할 수 있도록 하는 디자인 패턴입니다. 주요 목적은 시스템 전체에서 공통된 리소스를 공유하거나, 객체 생성을 제한하여 메모리 낭비를 줄이기 위함입니다.

 

 

package singleton;

// 1. 정적 변수를 선언한다.
// 2. private 생성자를 선언한다.
// 3. 외부에서 접근할 수 있는 public 정적 메서드를 선언한다.
public class SingleTon {

    // 1. 유일한 인스턴스를 저장할 변수를 선언한다. (private, static)
    private static SingleTon instance;

    // 2. 외부에서 객체를 생성 못 하도록 private 생성자를 선언한다.
    private SingleTon(){}

    // 3. 외부에서 인스턴스 주소를 반환 받을 수 있는 메서드를 선언한다.
    // 심화 : 멀티 스레드 환경에서 안정하게 싱글톤 패턴을 구현 하기 위해서는

    public static synchronized SingleTon getInstance(){ // 동기화 처리
        if(instance == null){
            instance = new SingleTon();
        }
        return instance;
    }

}

 

 

package singleton;

public class MainTest {

    public static void main(String[] args) {
       
        SingleTon systemSingleTon1 = SingleTon.getInstance();
        SingleTon systemSingleTon2 = SingleTon.getInstance();

        if(systemSingleTon1 == systemSingleTon2){
            System.out.println("같은 객체를 바라 보고 있습니다");
        }
    }

}

 

활용 예시

  • 로깅 시스템: 여러 클래스에서 동일한 로깅 인스턴스를 사용하여 로그를 기록합니다.
  • 설정 관리(Configuration): 시스템의 설정 값을 저장하고, 이를 전역적으로 사용해야 하는 경우 싱글톤을 활용합니다

 

 

 

 

도전 과제 : Connection 객체를 반환하는 클래스를 설계 한다. (단 멀티 스레드환경에 안전한 객체를 생성할 수 있도록 코드 작성)

 

 

package singleton;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {

    private static DatabaseConnection instance;
    private Connection connection;

    String url = "jdbc:mysql://localhost:3306/jam?serverTimezone=Asia/Seoul";
    String user = "root";
    String password = "asd123";

    // private 생성자: 외부에서 객체를 생성하지 못하도록 한다.
    private DatabaseConnection() {
        try {
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("mySQL 데이터 베이스 연결");
        } catch (SQLException e) {
            System.out.println("데이터베이스 연결 실패");
            e.printStackTrace();
        }

    }

    public static synchronized DatabaseConnection getInstance() {
        if (instance == null) {
            instance = new DatabaseConnection();
        }
        return instance;

    }

    public Connection getConnection() {
        return connection;
    }
}

 

 

 

 

package singleton;

import java.sql.Connection;

public class ConnectionTest {


    public static void main(String[] args) {
       
        DatabaseConnection dbConnection = DatabaseConnection.getInstance();
        Connection connection = dbConnection.getConnection();

    }
}

 

핵심 요약

  • 싱글톤 패턴은 특정 클래스의 인스턴스를 하나만 유지하는 디자인 패턴입니다.
  • 주로 공통된 리소스를 관리하거나, 전역 상태를 관리하는 데 사용됩니다.
  • 장점: 메모리 절약, 전역적으로 동일한 인스턴스 사용
  • 단점: 전역 상태로 인한 의존성 증가, 멀티스레드 환경에서의 동기화 이슈

'Spring boot' 카테고리의 다른 글

팩토리 패턴  (3) 2024.09.26
빌더 패턴이란?  (0) 2024.09.26
디자인 패턴의 활용  (0) 2024.09.25
S.O.L.I.D 원칙  (1) 2024.09.25
28. 파일 업로드 - 1 단계(멀티파트가 뭘까?)  (0) 2024.08.13