1.  싱글톤 패턴(Singleton pattern)이란?
  • 싱글톤은 단 하나의 객체만을 생성하게 강제하는 패턴이다. 즉, 클래스를 통해 생성할 수 있는 객체는 Only one. 
  • 하나의 프로그램 내에서 하나의 인스턴스만을 사용해야하는 상황에 주로 쓰임. 
  • 장점
    • 고정된 메모리 영역을 사용하도록 단 한번 인스턴스를 얻어오기 때문에 메모리의 낭비를 줄일 수 있다.
    • 공통된 객체를 사용해야하는 코딩에서 매번 객체를 생성하지 않고 같은 객체를 사용하도록 하면 성능면에서 좋아진다.


  1. 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

 Spring 기본 개념을 잘 적어놓은 사이트를 공유하고자 한다.

https://12bme.tistory.com/157


 다음 글은 내가 Spring을 사용한 예제를 자세히 파헤쳐 볼 예정이다.

그리고 Rest의 개념 글도 써야겠다.


'Spring Framework' 카테고리의 다른 글

싱글톤 패턴과 Spring의 싱글톤  (1) 2019.01.05

+ Recent posts