인프런 김영한 강사님의 [스프링 핵심 원리 - 기본편] > 섹션5. 싱글톤 컨테이너에 대한 요점 정리를 하였다.
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
...
}
스프링이 없이 순수한 DI 컨테이너인 AppConfig는 클라이언트가 memberServiceImpl을 요청할 때 마다 새로운 memberServiceImpl을 생성하고 반환한다.(-> 메모리 낭비 발생)
이유는 스프링이 없는 순수한 DI 컨테이너는 싱글톤을 보장해주지 않기 때문이다.
객체를 1개만 생성하고 공유하도록 설계하는 스프링 컨테이너를 사용하자.
스프링 컨테이너는 객체 인스턴스를 싱글톤으로 관리한다.
이는 DIP, OCP, priavte 생성자로부터 자유로운 싱글톤을 사용할 수 있다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
...
}
DI 컨테이너 위에 @Configuration을 적용하면 스프링은 바이트코드를 조작하는 CGLIB 기술을 사용하여 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 생성한 다른 클래스를 스프링 빈으로 등록하여 싱글톤을 보장한다.
주의사항
1. @Bean을 적용하면 스프링 빈으로 등록 되지만 싱글톤은 보장하지 않으니 클래스 위에 @Configuration을 적용하자.
2. 여러 클라이언트가 하나의 객체 인스턴스를 공유하므로 유지상태(stateful)가 아닌 무상태(stateless)로 설계해야한다.
특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 핵심 원리 - 기본편 > 섹션 7. 의존관계 자동 주입 (0) | 2024.04.11 |
---|---|
[Spring] 스프링 핵심 원리 - 기본편 > 섹션 6. 컴포넌트 스캔 (0) | 2024.04.11 |
[Spring] 스프링 핵심 원리 - 기본편 > 섹션3. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2024.04.08 |
parser() is deprecated 해결방법 (0) | 2023.09.09 |
Cannot resolve symbol 'springframework' (0) | 2023.07.17 |
댓글