DevBoi

싱글턴 패턴 사용 및 정리! 본문

Language/[Java]

싱글턴 패턴 사용 및 정리!

HiSmith 2023. 1. 16. 13:01
반응형

싱글턴 패턴은 클래스의 인스턴스를 하나만 생성해서 사용하는 패턴이다.

주로 특정 객체를 여러곳에서 공유해야 할 떄 사용한다.

싱글턴 패턴을 이용함으로써, 메모리에 인스턴스를 하나만 등록해 여러 쓰레드에서 동시에 하나의 객체를 이용할 수 있도록 하기 위함이다.

문제는 동기화 문제인데, 동기화 문ㅁ제만 잘 해결한다면, 리소스의 효율을 가져다 줄 수 있다.

 

 

일단 싱글턴 테스트 코드를 적어보자

 

package com.practice.demo.config;

public class SingleTon {

private static SingleTon instance;
private int msg;

private SingleTon(int msg) {
 	this.msg = msg;
} 

public static SingleTon getInstance(int msg) {
    if(instance == null)
    instance = new SingleTon(msg);
    return instance;
    }
public void printMsg() {
	System.out.println(msg);
}
}

 

 

이렇게 싱글턴 인스턴스에 대해서 적는다고 가정해보자

그러면,

package com.practice.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.practice.demo.config.SingleTon;

@SpringBootApplication
public class SmithStudyApplication implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(SmithStudyApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		SingleTon s1 = SingleTon.getInstance(1);
		SingleTon s2 = SingleTon.getInstance(2);
		s1.printMsg();
		s2.printMsg();
	}

}

 

 

위와 같이 싱글턴을 두개를 호출했을떄, 싱글 턴으로 반환한다.

바로 아래와 같이 출력되는 것이다.

 

 

??

왜? 1이 두개일까? 나는 분명 1,2로 생성을 했는데?

위 코드에서, 1,2로 생성을해도, msg에 대한 값을 별도로 체크하지 않았기때문에

처음에 생성한 인스턴스로 인해 같은 인스턴스가 반환되는 효과가 있다.

 

근데 초기 요청에 대한 딜레이 조차 생성하는 비용을 줄이고싶다면?

애초에 생성 시점에 초기화를 해주면된다.

public class SingleTon {

	private static SingleTon instance = new SingleTon(0);
	private int msg;
	
	private SingleTon(int msg) {
		this.msg = msg;
	} 
	public static SingleTon getInstance(int msg) {
	
		return instance;
	}
	public void printMsg() {
		System.out.println(msg);
	}
}

 

위와 같이 말이다.

private 생성자로 선언해주었기 때문에, 해당 클래스는 별도 외부에서 생성자를 호출할 수 없다.

따라서 미리 정의한 인스턴스 하나만 사용이 가능하다.

 

스프링에서는 이것을 autowired나, 빈을 스프링 컨테이너가 기본값으로 싱글턴 보장을 해준다.

즉 요청에 따라서 빈의 인스턴스를 여러개 생성하지 않도록 해준다.

반응형