웹어플리케이션은 여러 명의 사용자가 요청을 한다.
client A request
client B =====> 여러개의 객체가 생성됨
client C
메모리 낭비가 심하다.
해당 객체가 1개만 생성되게하고 공유.
public class SingletonService {
// 객체를 미리 생성해 논다.
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance(){
return instance;
}
// 외부에서 생성할 수 없도록 private 으로 선언
private SingletonService(){
}
public static void main(String[] args) {
}
}
stateful하면 안된다.
package com.example.spring_java.singleton;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
class StatefulServiceTest {
@Test
void stateful(){
ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
StatefulService statefulService1 = ac.getBean(StatefulService.class);
StatefulService statefulService2 = ac.getBean(StatefulService.class);
statefulService1.order("service1", 10000);
statefulService2.order("service2", 30000);
Assertions.assertThat(statefulService1.getPrice()).isEqualTo(30000);
}
static class TestConfig{
@Bean
public StatefulService statefulService(){
return new StatefulService();
}
}
}
price가 10000 아닌 30000으로 변경된다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepo());
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepo(), discountPolicy());
}
}
위의 코드에서 MemberRepo가 2군데에서 사용되고 있다.
1. MemberService가 호출될 때 MemberRepo객체가 생성된다.
2. OrderService가 호출될 때 MemberRepo객체가 또 생성되야 하지만
스프링 컨테이너에서 이미 생성된 객체를 반환해준다.
=> 싱글톤 페턴이 유지되게 된다.