Spring
싱글톤 컨테이너
스파이더웹
2022. 7. 29. 21:19
728x90
반응형
싱글톤 패턴이란?
클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴
public class SingletonMain {
public static void main(String[] args) {
SingletonService singletonService = new SingletonService(); //컴파일 오류
}
}
class SingletonService {
private static final SingletonService instance = new SingletonService(); //필드영역에서 객체생성
private SingletonService(){}//private 접근제어자를 통하여 객체생성을 외부에서 생성 불가
public static SingletonService getInstance(){ //메서드를 통해서만 해당 객체의 참조변수에 접근가능
return instance;
}
}
1. static 영역에 객체 인스턴스를 미리 생성한다
2 .해당 객체의 인스턴스는 getInstance( ) 메서드를 통해서만 조회할 수 있다. static 영역에 생성된 객체를 조회하므로 항상 같은 주소값을 가진다
3. 생성자는 private을 통해 해당객체를 직접생성하는것을 막는다
싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하고 싱글톤 패턴과 마찬가지로 인스턴스를 1개만 생성하여 관리한다
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
@Test
@DisplayName("스프링 컨테이너와 싱글톤")
void springContainer(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = ac.getBean("memberService",MemberService.class);
MemberService memberService2 = ac.getBean("memberService",MemberService.class);
System.out.println("memberService = " + memberService);
System.out.println("memberService2 = " + memberService2);
assertThat(memberService).isSameAs(memberService2);
}
결과
memberService = hello.core.member.MemberServiceImpl@5829e4f4
memberService2 = hello.core.member.MemberServiceImpl@5829e4f4
스프링 컨테이너에서 객체를 호출하는 경우 싱글톤 패턴의 로직 없이도 알아서 싱글톤패턴이 적용된것을 알 수 있다.
(스프링 bean이 싱글톤 객체로 관리되는 bean 이다)
그 결과 memberService 변수와 memberService2의 변수가 동일한 주소값을 가지는 것을 볼 수 있다
싱글톤 방식의 주의점
싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 즉, 무상태(stateless)로 설계해야한다
- 읽기만 가능하게 설계하도록 해야한다
- 특정 클라이언트에 의존적인 필드가 있으면 안된다
- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다
- 공유되지 않는 지역변수, 파라미터등을 활용한다
김영한님 스프링 핵심원리
728x90
반응형