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(구체, 구현 클래스)
추상클래스가 아닌 모든 클래스를 구체클래스라 말할 수 있다.
- 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 |