싱글톤 패턴은 어떠한 클래스(객체)가 유일하게 1개만 존재할 때 사용한다.
이를 주로 사용하는 곳은 서로 자원을 공유할 때 사용합니다.
싱글톤 패턴은 인스턴스를 한번만 생성하고, 생성한 인스턴스를 계속해서 재활용하여 호출합니다.
이렇게 함으로써, 처음 생성한 인스턴스가 가진 속성의 값이 동일하게 유지할 수 있으며, 주로 동일한 값을 계속해서 호출할 경우 싱글톤 패턴을 사용합니다.
싱글톤 객체를 주로 사용하는 곳은 다음과 같습니다.
- 소캣 통신의 connection 객체
- 외부 통신에 사용되는 키 또는 데이터를 저장할 경우
- 세션 관리
싱글톤 패턴의 장점
- 인스턴스를 한번만 생성하기 때문에 메모리가 적게 듭니다.
- 데이터 공유가 쉽습니다.
싱글톤 패턴의 단점
- 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 의존관계 역전 원칙(DIP)을 위반하며,
개방-폐쇄 원칙(OCP) 또한 위반할 가능성이 높습니다.
싱글톤 패턴 사용의 유점
객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 합니다.
싱글톤 패턴 구현 예제1
1. 기본 생성자를 private으로 막습니다.
2. static 메소드 getInstance()로 자기 자신을 리턴합니다.
※ static 변수, 메소드로 구현해야합니다.
// SocketClient.java
public class SocketClient {
private static SocketClient socketClient = null;
// default 생성자 막기
private SocketClient(){}
public static SocketClient getInstance(){
if(socketClient == null){
socketClient = new SocketClient();
System.out.println("socket new instance");
}
return socketClient;
}
}
간단하게 service 로직 내에서
SocketClient socketClient = SocketClient.getInstance();
또는
SocketClient.getInstance();
으로 싱글톤 객체를 호출할 수 있습니다.
다른 방식으로 아래와 같이 호출할 수 있습니다.
// AClazz.java
public class AClazz {
private SocketClient socketClient;
public AClazz(){
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient(SocketClient socketClient) {
this.socketClient = socketClient;
}
}
SocketClient 클래스로 직접적으로 생성자를 만들지 않고, 다른 클래스에서 SocketClient의 인스턴트 객체를 호출하는 것으로 싱글톤 객체를 호출할 수 있습니다.
싱글톤 패턴 구현 예제2
싱글톤 패턴을 더욱 간단하게 구현한 예시 코드를 소개하겠습니다.
@Getter
@Setter
@ToString
public class CryptoTokenDTO {
private String accessToken = "";
private String tokenVersion = "1.0";
private static CryptoTokenDTO cpt;
public static CryptoTokenDTO getInstance(){
if(cpt == null){
System.out.println("token is null");
synchronized(CryptoTokenDTO.class) {
if(cpt == null)
return cpt = new CryptoTokenDTO();
}
} else return cpt;
return cpt;
}
}
service 로직 내에서
CryptoTokenDTO.getInstance().setAccessToken("ABCDEFG");
와 같이 싱글톤 객체에 set을 할 수 있습니다.
CryptoTokenDTO.getInstance().getAccessToken();
을 통해서 accessToken 속성값을 가져올 수 있습니다.
싱글톤 패턴은 이러한 형식으로 인스턴스 객체를 한번만 만들고,
공유하는 데이터로써 싱글톤 객체를 호출하여 사용할 수 있습니다.
'Java' 카테고리의 다른 글
java - 데코레이터 패턴(구조 패턴) (0) | 2021.08.23 |
---|---|
java - 프록시 패턴(구조 패턴) (0) | 2021.08.23 |
java - 어댑터 패턴(구조 패턴) (0) | 2021.08.20 |
java - Gof의 디자인 패턴 개론 (0) | 2021.08.20 |
Java - 자료형(숫자편) (0) | 2021.06.21 |
댓글