@Configuration과 싱글톤

ttaho·2023년 3월 23일
0

Spring 기초

목록 보기
8/11

AppConfig 코드를 잠시 살펴보자.

  1. memberService 빈을 만드는 코드를 보면 memberRepository()를 호출한다.
  2. memberRepository()는 new MemoryMemberRepository()를 호출한다.
  3. orderService 빈을 만드는 코드도 동일하게 memberRepository()를 호출한다.
  4. memberRepository()는 new MemoryMemberRepository()를 호출한다.

결과적으로 각각 다른 2개의 MemoryMemberRepository가 생성되면서 싱글톤이 깨지는 것 처럼 보인다. 하지만 스프링 컨테이너에서는 이 문제가 해결된다.

OrderServiceImpl과 MemberServiceImpl에 getMemberRepository() 메서드를 추가한다.

그 후에 테스트 코드를 작성한다.

테스트가 통과하므로, memberRepository1과 memberRepository2가 같은 인스턴스를 공유한다는 것을 알 수 있다.

왜 그럴까?
AppConfig의 @Configuration에 답이있다.
사실 스프링은 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한다.

위에서 알 수 있듯이 이미 스프링 컨테이너에 memoryMemberRepository가 있으면 또 다시 생성을 하지않는다. 덕분에 싱글톤이 보장된다.

@Configuration을 적용하지 않고 @Bean만 적용하면 위의 memberRepository1과 memberRepository2가 같은 인스턴스가 아니고 두개 다 생성된다.

정리

@Bean만 사용해도 스프링 빈으로 등록되지만, 싱글톤을 보장하지 않는다.
항상 @Configuration을 사용하자.

profile
백엔드 꿈나무

0개의 댓글