Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[9주차] 25. 싱글톤 패턴(객체를 1개만 생성) 방식으로 클래스를 설계하는 방법(feat. dao) 본문

K-DigitalTraining 강의/8. JSP

[9주차] 25. 싱글톤 패턴(객체를 1개만 생성) 방식으로 클래스를 설계하는 방법(feat. dao)

이대곤 2022. 7. 19. 17:13

싱글톤 패턴(Singleton Pattern)이란?

특정 클래스의 인스턴스(객체)가 단 하나만 존재하고, 이를 프로그램 상에서 보장하는 패턴'싱글톤 패턴'이라고 한다.

이로인한 특징은 객체를 단 1번만 만들어 사용하여야 하므로, 처음에 만든 것을 전역변수처럼 모두가 공유하여 사용한다.

이로인해 시스템 전반에 걸쳐서 특정한 자원이 공유된다. 다수의 인스턴스가 존재하는 경우, 상호간에 영향을 주어 예기치 못한 오류가 발생할 확률이 높아 이를 제한하는 경우에 사용한다.

싱글톤 패턴 방식으로 클래스를 설계하는 방법

1. 생성자 추가

   생성자는 무조건 추가해주며, 접근제어자는 private으로 해준다.
   접근제어자가 default로 남아있지 않도록 하기 위함 && 외부에서 마음대로 생성자를 사용해 객체를 만들 수 없도록 제한하기 위함

2. 생성된 객체가 담길 멤버변수 추가

    클래스 내부에서 만들어진 객체가 담길 수 있도록 클래스 자신 타입의 멤버변수를 추가해주며, private static 으로 선언.
    priavte : 3번에서 만들어진 메소드를 통해서만 접근할 수 있도록 할 예정이라서

    static : 3번에서 만들어질 static 메소드에서 사용되어야할 변수이므로

3. 메소드 추가 

  최초 호출시 객체를 생성하고, 이후에는 이 객체의 주소를 반환해주는 역할을 하는 메소드를 추가하며, public static 으로 선언.

  public : 1번에서 생성자를 private 으로 제한했기 때문에 이거라도 외부에서 객체를 생성할 수 있는 루트를 열어놓기 위해서 

  static : 생성자를 외부에서 사용하는 것을 막아뒀으니 클래스 레벨에 붙여서 이 메소드를 사용할 수 있게 열어놓기 위해서

// 싱글톤 패턴으로 설계한 클래스
public class Test {
	private static Test instance; // static으로 선언되어 계속 살아있음
	
	public static Test getInstance() { 
		if(instance == null) { // 최초 1회만 객체가 생성되도록함
			System.out.println("인스턴스(객체) 생성");
			instance = new Test(); // 클래스 내부의 생성자 호출해 객체 생성
		}
		return instance; // 주소 반환
	}
	
	private Test(){
		System.out.println("Test2 생성자");
	}
}
public class Main {
	public static void main(String[] args) {
		Test t1 = Test.getInstance();
		Test t2 = Test.getInstance();
		
		// 두 객체의 주소가 같은걸 알 수 있음
		System.out.println(t1);
		System.out.println(t2);
	}
}

기존예제의 DAO 클래스를 하나의 객체가 공유하게 싱글톤 패턴으로 변경해보기

* Bean 클래스는 싱글톤 패턴으로 설계하지 않았는데, 그 이유는 Dao 객체와 달리 여기저기서 상태가 다 다르기 때문

DAO클래스

public class MovieDao {
	...
	static MovieDao instance;
	
	static public MovieDao getInstance() {
		if(instance == null) {
			instance = new MovieDao();
		}
		return instance;
	}
	
	private MovieDao() {
		// 1. 드라이버로드
		try {
			Class.forName(driver);
			System.out.println("드라이버 로드 성공");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로드 실패");
		}
	}	
	
//	public MovieDao() {
//		// 1. 드라이버로드
//		try {
//			Class.forName(driver);
//			System.out.println("드라이버 로드 성공");
//		} catch (ClassNotFoundException e) {
//			System.out.println("드라이버 로드 실패");
//		}
//	}
	...
	...
}

모든 jsp 파일

<!-- 모든 jsp 파일에서 Dao 클래스 관련 useBean 액션태그를 전부 주석처리하고 아래의 코드로 바꿔주면됨 -->
<%-- <jsp:useBean id="dao" class="myPkg.MovieDao"/> --%>
	
<%
	MovieDao dao = MovieDao.getInstance();
	System.out.println(dao); // 주소를 출력해봐서 어디서나 같은 객체인지 봐보는건데 생략가능
%>
Comments