Spring

[Spring] @Configuration과 Singleton By CGLIB

lakelight 2022. 7. 11. 20:44
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
반응형