- 싱글톤 패턴(Singleton pattern)이란?
- 싱글톤은 단 하나의 객체만을 생성하게 강제하는 패턴이다. 즉, 클래스를 통해 생성할 수 있는 객체는 Only one.
- 하나의 프로그램 내에서 하나의 인스턴스만을 사용해야하는 상황에 주로 쓰임.
- 장점
- 고정된 메모리 영역을 사용하도록 단 한번 인스턴스를 얻어오기 때문에 메모리의 낭비를 줄일 수 있다.
- 공통된 객체를 사용해야하는 코딩에서 매번 객체를 생성하지 않고 같은 객체를 사용하도록 하면 성능면에서 좋아진다.
- Kotlin에서의 싱글톤 ( =java static 싱글톤)
- java static 싱글톤과 개념은 같다.
- 자바에서는 static 멤버를 만들고 생성자를 private로 처리하는 등이 필요하지만,
코틀린에서는 object로 만들면 된다.
예제.)
- 코드 -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package Singleton class FirstClass{ companion object { init { println("FirstClass invoked") } fun print()= println("This is firstClass Function") } } class SecondClass{ companion object { init { println("SecondClass invoked") } fun print()=println("This is secondClass Function") } } object firstSingleton{ val instance=FirstClass() } object secondSingleton{ val instance=SecondClass() } fun main(args: Array<String>) { val f1=firstSingleton.instance val f2=firstSingleton.instance println(f1==f2) println() println() val t1=secondSingleton.instance val t2=secondSingleton.instance println(t1==t2) } | cs |
- 결과 -
1 2 3 4 5 6 | FirstClass invoked true SecondClass invoked true | cs |
FirstClass, secondClass에 대한 싱글톤 인스턴스를 각각 만들어 보았다.
main에서 firstSingleton 인스턴스를 2번 요청했지만 해당 인스턴스가 1개만 생성된다는 것을 결과를 통해 알 수 있다.
즉, 하나의 클래스를 통해 생성할 수 있는 객체는 하나라는 것이 확인가능하다.
3. Spring의 Singleton ( 싱글톤 레지스트리 )
- 자바의 기본적인 싱글톤 패턴의 구현 방식은 여러 가지 단점이 있기 때문에,
스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다. => 싱글톤 레지스트리
- 싱글톤 레지스트리의 장점은 static method와 private 생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 해준다.
- 스프링의 싱글톤 레지스트리 덕분에 싱글톤 방식으로 사용될 애플리케이션 클래스라도 public 생성자를 가질 수 있다.
- 싱글톤과 오브젝트의 한계
- 싱글톤은 멀티쓰레드 환경이라면 여러 쓰레드가 동시에 접근해서 사용할 수 있다.
따라서 상태 관리에 주의를 기울여야 한다. 기본적으로 싱글톤이 멀티쓰레드 환경에서 서비스 형태의
오브젝트로 사용되는 경우에는 상태정보를 내부에 갖고 있지 않은 무상태(stateless) 방식으로 만들어 져야한다.
- 무상태(stateless) 방식으로 만들기 위해서는 매소드 안에서 생성되는 로컬 변수를 사용하면 된다.
로컬 변수는 매번 새로운 값을 저장할 독립적인 공간이 만들어지기 때문에 싱글톤이라 해도 여러 쓰레
드 변수의 값을 덮어쓰지 않는다.
- 따라서 스프링의 싱글톤 빈으로 사용되는 클래스를 만들 때는 개별적으로 바뀌는 정보는 로컬 변수로 정의하거나, 파라미터로 주고받으면서 사용하게 해야 한다.
- 자신이 사용하는 다른 싱글톤 빈을 저장하려는 용도라면 인스턴스 변수를 사용해도 된다.
스프링이 한 번 초기화해주고 나면 이후에는 수정되지 않기 때문에, 멀티쓰레드 환경에서 사용해도 문제가 없다.
- 내용과 관련된 피드백은 언제나 환영합니다
'Spring Framework' 카테고리의 다른 글
Spring 기본 개념 (0) | 2018.12.31 |
---|