8. JSP - 싱글톤(Singleton) & 커넥션풀(ConnectionPool)

한승록·2023년 6월 9일
0

JSP 기초

목록 보기
8/9
post-thumbnail

1. 싱글톤(Singleton)

Singleton의 사용 이유는 간단합니다. 서로 다른 페이지에서 동일한 객체를 사용하기 위해 단일 객체로 생성하여 제한하는 것이 목적입니다.
Java의 문법에서 변수 선언 시 static을 걸어주는 것처럼 말이죠



<기존의 객체 생성 및 사용 방식>

public class Velog1 {
	
	@Override
	public String toString() {
		return super.toString();
	}
}
<!-- 기존의 객체 생성 방식(생성된 객체가 전부 다른 값과 주소를 가짐 --!>
<fieldset>
	<% Velog1 ob1 = new Velog1(); %>
	<c:set var="ob2" value="<%=new Velog1() %>" />
	<jsp:useBean id="ob3" class="ex01.Velog1" />
	<ul>
		<li>ob1 : <%=ob1 %></li>
		<li>ob2 : ${ob2 }</li>
		<li>ob3 : ${ob3 }</li>
	</ul>
</fieldset>

<※ 결과는 다음과 같습니다.>

보시는 바와 같이 기존의 객체를 생성하는 방식은 해쉬 주소값이 전부 다른 것을 보실 수 있습니다.
하지만 다음의 싱글톤 객체 생성 시 다른 결과를 보실 수 있습니다.


그전에 잠시 몇가지 singleton 생성규칙을 말씀드리도록 하겠습니다.
  1. 하나의 클래스는 어디서나 하나의 객체만 참조할 수 있도록 구성
  2. 생성자를 외부에서 호출할 수 없도록 처리한다
    (단, 내부에서는 자유롭게 호출할 수 있어야한다)
  3. 객체를 생성할 수 없도록 막았기 때문에 생성 관련 메서드는 객체 없이도 작동해야한다
    따라서 static필드와 메서드를 활용한다

<싱글톤의 객체 생성 및 사용 방식>

public class VelogDAO {
	
	private Connection conn;
	private Statement stmt;
	private ResultSet rs;
	
	private Context init;
	private DataSource ds;
	
	public VelogDAO() throws NamingException {
		init = new InitialContext();
		ds = (DataSource) init.lookup("java:comp/env/jdbc/oracle");
	}
	
	// DB 버전 반환
	public String getVersion() throws SQLException {
		String version = null;
		String sql = "select banner from v$version";
		
		// DataSource : 여러개의 connection을 가지고 있다가 요청받으면 하나씩 내어줌
		conn = ds.getConnection();
		stmt = conn.createStatement();
		rs = stmt.executeQuery(sql);
		
		while(rs.next()) {
			version = rs.getString("banner");
		}
		
		rs.close();
		stmt.close();
		conn.close();
		
		return version;
		
	}
}
public class Velog2 {
  
	// 클래스의 객체를 저장할 필드
	private static Velog2 instance;	
  
	// 만들어진 단일 객체를 반환하는 static 메서드
	public static Velog2 getInstance() {	
		if (instance == null) {
  			// 내부에서는 자유롭게 생성자 호출 가능
			instance = new Velog2();	
		}
		
  		// 만약 객체가 만들어져있다면, 기존 객체를 반환하고
		return instance;
		// 객체가 없다면 한번만 새로 생성하여 객체를 반환한다	
	}
	
	private Velog2() {
		// 외부에서는 기본 생성자를 호출할 수 없다
		// <jsp:useBean> 으로 객체를 생성할 수 없다
	}
	
	@Override
	public String toString() {
		return super.toString() + " (싱글톤 객체)";
	}
}
<%@ include file="ex01-directive.jsp" %>
<jsp:include page="ex01-actionTag.jsp" />
  
<h3>동일한 페이지 동일한 객체</h3>
<fieldset>
 	<%
 		Velog2 ob4 = Velog2.getInstance();
 	%>
	
	<c:set var="ob5" value="${Velog2.getInstance() }" />
	
	<ul>
		<li>ob4 : <%=ob4%></li>
		<li>ob5 : ${ob5 }</li>
	</ul>
</fieldset>
<br>
<%@ page import="ex01.Velog2" %>

<h3>ex01-directive.jsp</h3>  
  
<%
	Velog2 ob6 = Velog2.getInstance();
%>

<h3>다른 페이지 동일한 객체</h3>
<fieldset>
	<legend>ex01-directive.jsp</legend>
	<ul>
		<li>ob6 : <%=ob6 %></li>
	</ul>
</fieldset>
<%@ page import="ex01.Velog2" %>

<h3>ex01-actionTag.jsp</h3>  

<%
	Velog2 ob7 = Velog2.getInstance();
%>

<h3>다른 페이지 동일한 객체</h3>
<fieldset>
	<legend>ex01-actionTag.jsp</legend>
	<ul>
		<li>ob7 : <%=ob7 %></li>
	</ul>
</fieldset>

<※ 싱글톤 객체 생성 결과는 다음과 같습니다.>

이와 같이 다른페이지 다른 include 방식과 무관하게 singleton을 구성함에 따라 같은 주소값을 가지는 객체가 생성되고 사용되어 지는 것을 보실 수 있습니다.



2. 커넥션풀(ConnectionPool)

ConnectionPool은 하나의 객체에 DB에 여러개의 Connection객체를 생성하지 않고 하나의 객체에 여러개의 Thread를 연결시켜 효율을 극대화 시키는 방식입니다.

ConnectionPool사용 시 요청마다 connection 객체를 생성하고 대체하는 과정을 없애 대기시간을 줄일 수 있으며 Pool에 연결되는 수를 조절할 수 있어 네트워크 연결에 과부화를 방지할 수 있는 장점이 있습니다.

물론 ConnectionPool도 만능은 아니기때문에 메모리 누수 방지를 위해 연결 가능 수를 적절히 조절하지 못하면 많은 요청이 몰릴 경우 시간이 상당히 지연되거나 너무 많이 설정할 경우 메모리 누수가 크게 일어나기 때문에 주의해야 합니다.
profile
개발 학습

0개의 댓글