개발자/JSP

[JDBC] SingleTon 패턴

푸루닉 2022. 12. 12. 10:57

1. SingleTon 패턴

 

어디서나 오로지 하나의 객체만 참조하게 만드는 디자인 패턴을 말한다.

 

먼저 코드로 살펴보자.

 


  • 싱글톤이 적용되지 않은 클래스
package singleton;

public class Test1 {
	
	public Test1() {
		System.out.println("Test1 타입 객체 생성!!");
	}

}
  • 싱글톤을 적용한 클래스
package singleton;

public class Test2 {	// singleton :  어디서나 오로지 하나의 객체만 참조하게 만드는 디자인 패턴
	
	// static 메서드에서 참조할 수 있어야 하므로, static
	private static Test2 instance = new Test2();
	
	private Test2() {
		// 생성자가 private 이므로, 외부에서는 Test2 타입의 객체를 생성할 수 없다
	}
	
	public static Test2 getInstance() {	// 객체가 없어도 함수를 호출할 수 있어야 하므로 static
		return instance;
	}
	
}
  • 위 두 클래스를 메인에서 비교해볼 것이다.
package singleton;

public class Main {
	public static void main(String[] args) {
		
		// Test1 타입 (싱글톤이 적용되지 않은 클래스)
		// 생성자를 이용하여 객체를 생성할 수 있고, 매번 다른 객체를 만들어낸다
		Test1 ob1 = new Test1();
		Test1 ob2 = new Test1();
	
		System.out.println("ob1 : " + ob1);
		System.out.println("ob2 : " + ob2);
		
		// Test2타입 (싱글톤이 적용된 클래스)
		// 생성자를 이용하여 객체를 생성할 수 없고, 대신 별도의 메서드를 이용하여 하나의 객체만 반환받는다
		
//		Test2 ob3 = new Test2();	// The constructor Test2() is not bisible
		Test2 ob3 = Test2.getInstance();
		Test2 ob4 = Test2.getInstance();
		
		System.out.println("ob3 : " + ob3);
		System.out.println("ob4 : " + ob4);
		
		// 싱글톤이 적용되어 있는 다른 클래스
//		Runtime rt = new Runtime();	// The constructor Runtime() is not visible
		Runtime rt1 = Runtime.getRuntime();
		Runtime rt2 = Runtime.getRuntime();
		System.out.println("rt1 : " + rt1);
		System.out.println("rt2 : " + rt2);
	}
}

싱글톤 패턴의 주소가 같은 것을 확인할 수 있다.

 


2. 싱글톤 패턴을 사용하는 이유

  • 위 코드에서 확인할 수 있는 것처럼 메모리 측면에 이점이 있다. 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.

  • 또다른 이점은 다른 클래스 간에 데이터 공유가 쉽다는 것이다. 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. 하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 이점을 유의해서 설계하는 것이 좋다.

  • 이 외에도 도메인 관점에서 인스턴스가 한 개만 존재하는 것을 보증하고 싶은 경우 싱글톤 패턴을 사용하기도 한다.

 

3. 싱글톤 패턴의 문제점

 

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 필요
  • 테스트가 어렵다.
  • 클라이언트가 구체 클래스에 의존하게 된다.
    • Concreate Class(구체, 구현 클래스)
      추상클래스가 아닌 모든 클래스를 구체클래스라 말할 수 있다.
  • 자식클래스를 만들 수 없다.

======> 유연성이 많이 떨어지는 패턴

4. 싱글톤 객체를 생성하기

<h1>singleton 객체를 생성하기</h1>
<hr>

<h3>1) 기본 생성자가 private 이므로, jsp:useBean을 사용할 수 없다</h3>
<%-- <jsp:useBean id="test" class="singleton.Test2"/> --%>

<h3>2) 기본 생성자가 아닌 형태로 객체를 생성하기 위해, jstl core를 이용한다</h3>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="singleton.Test2" %>
<!-- 클래스의 첫글자가 대문자가 아니면 클래스인식하지 않음 -->
<c:set var="t1" value="${Test2.getInstance() }"/>
<h3>t1 : ${t1 }</h3>

<h3>3) static메서드는 클래스를 통하여 호출하므로, EL에서 반드시 첫글자를 대문자로 작성한다</h3>
<c:set var="t2" value="${Test2.getInstance() }"/>
<h3>t2 : ${t2 }</h3>

singleton 객체를 생성하기


1) 기본 생성자가 private 이므로, jsp:useBean을 사용할 수 없다

<%-- --%>

2) 기본 생성자가 아닌 형태로 객체를 생성하기 위해, jstl core를 이용한다

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="singleton.Test2" %>

t1 : ${t1 }

3) static메서드는 클래스를 통하여 호출하므로, EL에서 반드시 첫글자를 대문자로 작성한다

t2 : ${t2 }

 

 

'개발자 > JSP' 카테고리의 다른 글

[jdbc] 싱글톤을 적용한 CRUD  (0) 2022.12.22
[JDBC] DBCP(DataBase Conncetion Pool)  (0) 2022.12.12
[JDBC] XML  (0) 2022.12.12
[JDBC] 시퀀스를 활용하여 idx값 출력 (제약조건++)  (0) 2022.12.09
[SQL] DB Table 제약조건  (0) 2022.12.09