ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 싱글톤 패턴
    프로그래밍/Spring 2020. 3. 20. 22:06

    싱글톤 패턴

    애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴이다. 따라서 Main 파일에서 여러번 생성자가 호출되더라도 결국 하나의 객체(Bean)에 접근하게 되는 것이다.


    싱글톤 패턴을 쓰는 이유

    하나의 고정된 메모리 영역을 두고 인스턴스를 뽑아서 사용하기 때문에 메모리 낭비가 적다.

    싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스여서 데이터공유가 쉽다.

     

     

    싱글톤 패턴의 문제점

    너무 많은 인스턴스가 생기면 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다.

    Spring 으로 구현한 메인클래스를 예로 들어보자.

     

    프로토 타입 패턴

    싱글톤 패턴과 정반대 개념으로 각각의 객체를 메모리에 할당하여 사용하는 디자인 기법이다.

    이 경우 Bean 생성시 태그안에 scope="prototype" 의 설정이 필요하다.

     

     

    package com.javalec.ex;
    
    import org.springframework.context.support.GenericXmlApplicationContext;
    
    public class MainClass {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
    		
    		ctx.load("classpath:applicationCTX.xml");
    		ctx.refresh();
    		
    		// student 객체에서 학생1이라는 인스턴스를 생성한다.
    		Student student1 = ctx.getBean("student" , Student.class);
    		student1.setName("홍길동");
    		System.out.println("첫번째 학생 이름 : " + student1.getName());
    		
    		// student 객체에서 학생2이라는 인스턴스를 생성한다.
    		Student student2 = ctx.getBean("student" , Student.class);
    		student2.setName("김홍도");
    		System.out.println("두번째 학생 이름 : " +student2.getName());
    		
    		// 학생1,2 는 모두 student 라는 메모리를 사용하고있다.
    		if(student1.getName() == student2.getName()) {
    			System.out.println("student1 == student2");
    			
    		}
    		else {
    			System.out.println("student1 != student2");
    		}
    		
    		// 그래서 결국 마지막에 학생2를 김홍도로 바꾸었지만 
    		// 학생1 과 같은 메모리를 건드렸기 때문에 학생1도 김홍도가 된다.
    		System.out.println(student1.getName());
    		
    		ctx.close();
    		
    	}
    
    }
    

     


    그림으로 보면 이런 느낌이 될것이다.

    검은색의 Student 는 싱글톤 패턴의 클래스로 메모리가 할당된 영역이다.

    주황색의 학생 1, 2 는 new 를 통해 할당된 인스턴스들이다.

    이 인스턴스들은 모두 객체(Bean)인 Student 를 수정한다.

    '프로그래밍 > Spring' 카테고리의 다른 글

    [Spring] MVC 모델  (0) 2020.03.31
    [Spring] @Autowired 와 @Resource  (0) 2020.03.27

    댓글

Designed by Tistory.