Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.

public class SingletonTest {
@Test
@DisplayName("스프링 없는 순수한 DI 컨테이너")
void pureContainer() {
AppConfig appConfig = new AppConfig();
// 1. 조회 : 호출할 때마다 객체를 생성
MemberService memberService1 = appConfig.memberService();
// 2. 조회 : 호출할 때마다 객체를 생성
MemberService memberService2 = appConfig.memberService();
//참조 값이 다른 것을 확인
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
//memberService != memberService2
Assertions.assertThat(memberService1).isNotSameAs(memberService2);
}
}
싱글톤 패턴 코드
public class SingletonService {
//1. static 영역에 객체를 딱 1개만 생성한다.
private static final SingletonService instance = new SingletonService();
//2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
public static SingletonService getInstance() {
return instance;
}
//3. private 생성자를 사용하여 다른곳에서 생성 제한한다.
private SingletonService() {
}
public void login() {
System.out.println("싱글통 객체 로직 호출");
}
public static void main(String[] args) {
}
}
getInstance()메서드를 통해서만 조회해야한다.싱글톤 패턴 사용 테스트 코드
public class SingletonTest {
@Test
@DisplayName("싱글톤 패턴을 적용한 객체 사용")
void singletonServiceTest() {
//1. 조회 : 호출할 때 객체를 반환
SingletonService instance1 = SingletonService.getInstance();
//2. 조회 : 한번 더 똑같이 호출하면 같은 객체를 반환
SingletonService instance2 = SingletonService.getInstance();
//참조값이 같은지 확인
System.out.println("instance1 = " + instance1);
System.out.println("instance2 = " + instance2);
//instance1 == instance2 만족하는지?
assertThat(instance1).isSameAs(instance2);
singletonService1.logic();
}
}
getInstance()메서드를 사용하여 객체를 반환받아야한다.참고: 싱글톤 패턴을 구현하는 방법은 여러가지가 있지만, 여기서는 객체를 미리 생성하고 또다른 생성을 막아두는 가장 단순하고 안전한 방법을 선택해서 구현하였다.
다음 학습
위와 같은 단점들이 존재하는데 저런 단점들을 끌어안고 사용 할 가치가 있는가? 라고 생각한다면
싱글톤 컨테이너 라는게 존재한다.