[섹션 5. 싱글톤 컨테이너] 싱글톤 패턴 / 인프런 김영한 스프링 핵심 원리 기본편
이번 시간에는 싱글톤 패턴에 대해서 알아보는 시간을 가졌다.
싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
즉, 한 JVM 안에서는 객체 인스턴스가 하나만 생성되는 것이다.
그렇기 때문에, 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.
방법은 private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막는 것이다.
테스트를 위해서 서비스 클래스를 생성해준다.
6번째 라인을 보면, static 영역에 객체 instance를 미리 하나 생성해서 올려둔다.
코드를 설명하자면, SingletonService 자기 자신을 선언하고 내부의 private static으로 가지고 있겠다 라는 뜻이다.
이렇게 하면, 클래스 레벨에 올라가기 때문에 하나만 존재하게 된다.
그리고 9번째 라인에 조회하는 메소드인 getInstance를 만들어주고 instance를 리턴한다.
instance 객체가 필요하면 오직 getInstance 메소드를 통해서만 조회할 수 있고,
이 메소드를 호출하면 항상 같은 인스턴스를 반환한다.
이렇게 코드를 작성하면 JVM이 뜰 때, 내부적으로 실행해서 new SingletonService를 통해서 객체를 생성한 다음에,
instance 객체에 new SingletonService가 담기게 된다.
그리고 추가적인 생성을 막기 위해 private 생성자를 사용한다.
딱 1개의 객체 인스턴스만 존재해야 하기 때문에, 생성자를 private으로 막아서 외부에서 new 연산자로 객체 인스턴스가 생성되는 것을 막아준다.
이렇게 작성하면 instace 객체를 꺼내는 방법은 오직 getInstance 클래스를 통해서만 꺼낼 수 있다.
테스트로 다른 클래스에서 호출해보면 private이기 때문에 new 생성이 불가하다고 뜬다.
테스트 코드를 작성하고 실행해보면 위와 같은 결과가 나온다.
위의 테스트를 보면 같은 객체 인스턴스가 반환되는 것을 확인할 수 있다.
하지만 중요한 것은, 스프링을 쓰면 스프링 컨테이너가 기본적으로 객체를 싱글톤으로 만들어서 관리해준다.
고객 요청이 예를 들어 초당 100개의 요청이 와도 객체를 만들지 않고,
이미 만들어져있는 객체를 공유하기 때문에 성능이 효율적이게 된다.
싱글톤 패턴의 문제점은 위의 사진과 같이 있지만, 스프링 프레임 워크를 사용하면 싱글톤 패턴의 문제점을 해결하고,
객체를 싱글톤으로 관리하게 해준다. 이 부분은 다음 시간에 이어서!