OOP/Design Pattern

[OOP] 싱글톤 패턴(Singleton Pattern)

IT록흐 2022. 11. 13. 22:55
반응형

 

디자인 패턴이란?

객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern)

 

문제 상황

 

서블리(Servlet)을 예로 들어보겠다.

 

 서블릿은 서버로 들어오는 수많은 클라이언트의 요청에 대응하기 위한 java 클래스이다. 만약 HTTP 요청이 들어올 때마다 서블릿 인스턴스를 생성한다면 메모리는 OOM이 발생한다.

 

@WebServlet("/hello") // 서블릿 매핑 
public class JspStudy extends GenericServlet { 
	//초기화 부분 
	public void init() { 
		System.out.println("서블릿 초기화"); 
	} 
	//실행 부분 
	public void service(ServletRequest request, ServletResponse response) 
		{ System.out.println("서블릿 실행"); 
	} 
	//종료 부분 
	public void destroy() { 
		System.out.println("서블릿 종료"); 
	} 
}

 

 

서블릿의 생성 주기는 이러하다. 톰캣 서버는 서블릿을 생성하며 init 메소드를 호출한다. 그리고 서블릿은 메모리에 상주하며 Request가 올때마다 server 메소드를 호출시켜 대응한다. 

 

새로 고침을 계속 눌렀을때

 

그리고 톰캣이 종료되면 서블릿을 destroy 시킨다. 

 

이처럼 서블릿은 '하나'만 생성되어서 메모리에 상주해 있다가 필요 시 접근하여 사용되어진다. 이와 같은 객체를 '싱글톤 객체'라고 부른다.  싱글톤 객체는 두 가지 조건이 만족되어야 한다. 

 

1) 오직 하나만 생성되어야 한다. 

2) 어디서든 접근 가능해야 한다.

 

 

해결책

 

싱글톤 객체를 생성하는 방법은 두 가지가 있다. 

 

// 방법1)
public class Printer {
	private static Printer printer = new Printer(); // 클래스를 로드하는 과정에서 객체 생성
	private Printer(){} // 생성자를 private로 선언, new 연산자 사용 방지

	public static Printer getInstance(){
		return printer;
	}
}

 

 

첫 번째 방법은 이와 같다. printer 필드변수를 static로 선언하여 어디서든 접근 가능하도록 만든다. 그리고 Printer() 생성자를 private로 선언하여 외부에서 new 연산자로 객체생성하지 못하도록 막는다.

 

이처럼 구현하면 Printer 객체는 Printer 클래스가 로드될때 생성되는 객체 하나만 존재하게 되고, 이는 getInstance메소드를 통해서 어디서든 접근 가능해진다. 

 

 

// 방법2)
public class Printer {
	private static Printer printer = null;
	private Printer(){} // 생성자를 private로 선언, new 연산자 사용 방지

	public synchronized static Printer getInstance(){ // synchronized로 상호배제를 구현
		if(printer == null){
			printer = new Printer();
		}
		return printer;
	}
}

 

두 번째 방법은 클래스를 로드할 때 메모리에 객체를 생성하지 않는다. 이는 쓸데없이 메모리 공간을 차지하지 않도록 한다.  Printer 객체가 필요하여 getInstance 메소드가 호출 될 때 객체는 생성된다. 조건문을 통해, printer 객체가 null 일때 객체를 생성하고 아니면 이미 생성된 객체를 return 한다. 

 

이 때 getInstance() 메소드를 synchronized로 선언하여 상호배제를 구현한다. 서로 다른 스레드가 동시에 해당 메소드를 호출한 경우, 싱글톤 패턴이 깨질 수 있다. 그러므로 해당 메소드의 접근에 순서를 두도록하면 완벽한 싱글톤 패턴이 구현할 수 있다. 

 

 


 

참고자료

 

JAVA 객체지향 디자인 패턴 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

반응형