본문 바로가기

Spring

싱글톤 패턴

What?

한개의 인스턴스만  생성되는 것이 좋을때 사용한다.

 -ex) 커넥션풀

  ex) 요청이 하나 들어올때 하나의 객체가 생성되서 그 요청을 처리한다?  => 100번이면 100개 생김 

                                                                                               ==> 따라서         

                                                                                               ===>요청한개할때 기존에 있던것 불러오는                                                                                                        방식을 만듬

================================================================

=================================================================

How?

 - 생성자를 private으로 놓고, 

 - 그객체의 인스턴스를 반환해주는 public getInstance 함수를 만든다.

 

      public class PrinterSingletone {

             private static PrinterSingletone p = null;

       

             private PrinterSingletone()                        //생성자는 private

                System.out.println("## 프린터 생성 ##");

             }

        

            public static syncronized PrinterSingletone getInstance(){

               if(p == null){                                             //인스턴스없으면 생성자사용해서 인스턴스만들기

                    p = new PrinterSingletone();

               }       

                  return p;                                                             //있으면 그 인스턴스 호출  (즉, 새로운 인스턴스는 만들지 않고 기존것 사용

           }

      }

=================================================================

=================================================================

BUT!

 멀티쓰레드 환경에서는 getinstance 가 중복으로 실행되어

인스턴스가 생성중에

다른 getInstance에서는 인스턴스가 없다고판단하여 새로운 인스턴스를 생성하는 

상황이 생길수 있다.

그럴땐 동기화를 이용하여 getInstance()를 작성해주면 된다.

 

=================================================================

=================================================================

WHEN? 

  스프링에서는 모든 bean 을 싱글톤으로 만들어 준다.

  왜냐하면, 대부분 스프링은 서버환경에서 작동 되기 때문 > 즉, 많은 사람들이 동시에 이용하기 떄문이다.