728x90
반응형
궁금증
MemberService 1번 / TodoService 1번 / MemberRepository 3번 호출 된다고 생각했습니다.
결론적으로 MemberRepository가 3번 호출 되어 싱글톤이 깨질 수도 있다고 생각했습니다.
@Configuration
public class AppConfig {
//차례대로 클래스를 빈에 등록하여 싱글톤을 보장한다고 가정하겠습니다.
@Bean //1. MemberService 호출
public MemberService memberService() {
//2. MemberRepository 호출
return new MemberServiceImpl(memberRepository());
}
@Bean 3. TodoService 호출
public TodoService todoService(){
//4. MemberRepository 호출
return new TodoServiceImpl(memberRepository());
}
@Bean //2. MemberRepository 호출 //4. MemberRepository 호출 //5. MemberRepository 호출
public MemberRepository memberRepository(){
return new MySqlMemberRepository();
}
}
결과
결과는 MemberService 1번 / TodoService 1번 / MemberRepository 1번 호출 되었습니다.
@Configuration이 @Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고,
스프링 빈이 없다면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어졌습니다.
자세하게 설명하면 스프링이 CGLIB이라는 바이트코드 조작 라이브러리를 사용해서 @Bean이 붙은
클래스를 상속받은 임의의 CGLIB 클래스를 만들고 그 클래스를 스프링 빈에 등록한 것입니다.
CGLIB 클래스는 @Bean이 붙은 원래 클래스의 자식 타입으로 생성 된것이므로
원래 클래스를 조회할 수 있는 것입니다.
@Configuration을 빼고 @Bean만 적용한다면 결과는?
결과는 MemberService 1번 / TodoService 1번 / MemberRepository 3번 호출 되었고,
3번 호출된 MemberRepository 인스턴스는 모두 달랐습니다.
싱글톤이 깨진 것을 알 수 있었습니다.
결론
@Bean만 사용해도 클래스가 스프링 빈에 등록 되지만 싱글톤은 보장되지 않기 때문에
스프링 설정 정보(AppConfig)에는 항상 @Configuration을 사용해야겠습니다.
728x90
반응형
'Spring' 카테고리의 다른 글
[Spring] 관습적인 추상화 (2) | 2022.08.09 |
---|---|
[Spring] 객체 지향 설계의 다섯 가지 기본 원칙 - SOLID (0) | 2022.07.15 |
[Spring] @ComponentScan @Autowired 의존관계 자동 주입 (0) | 2022.07.12 |
[Spring] Singleton 사용 시 필드 변수 사용 주의❗ (0) | 2022.07.11 |
[Spring] AppConfig을 통한 관심사 분리와 리팩터링 (0) | 2022.07.11 |