본문 바로가기

Spring

스프링 컨테이너, 스프링 빈, 싱글톤

스프링은 SOLID 원칙을 준수하기 위해 IoC, DI 등을 지원하고 있다. 이를 위해 스프링 컨테이너가 존재한다.

위의 목적을 달성하기 위해 자바 객체를 스프링 컨테이너에서 직접 관리한다.

관리하는 자바 객체를 이라고 하고 이름과 객체를 한 묶음으로 관리하게 된다.

그림으로 표현하면 다음과 같다.

 

[스프링 컨테이너]

 

 

실제로 스프링이 어떻게 객체를 주입하는지 코드를 통해 알아보자.

 

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

}

스프링에서는 다음과 같은 방식으로 빈을 등록한다.

지금 사용한 방법은 수동으로 빈을 등록해주는 방법을 사용한 것이다.

@Bean 어노태이션을 이용하여 스프링 컨테이너에 빈을 등록하였다.

 

여기서 한가지 의문이 생길 수 있다.

실제로 서비스 진행될 때, Repository가 memberRepository()를 호출하고 Service에서 memberService()를 호출하여 MemoryMemberRepository 객체가 2번 생성되는 것이 아닌가?

결과는 아니다.

스프링에서는 컨테이너는 싱글톤 컨테이너 역할을 하며, 객체 인스턴스를 싱글톤으로 관리한다.

싱글톤이란, 클래스의 인스턴스를 1개만 생성하는 것이다.

 

이를 실제로 확인해보자.

 

@Test
void springContainer(){
    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    MemberService memberService1 = ac.getBean("memberService", MemberService.class);
    MemberService memberService2 = ac.getBean("memberService", MemberService.class);

    System.out.println("memberService1 = " + memberService1);
    System.out.println("memberService2 = " + memberService2);

    assertThat(memberService1).isSameAs(memberService2);
}

ApplicationContext가 스프링 컨테이너이다.

스프링 컨테이너에서 getBean 메서드를 통해 "memberService"라는 이름의 빈을 불러온 것이다.

두 객체가 동일한지 확인을 통해 싱글톤을 보장하는지 확인했다.

 

다음과 같이 스프링 컨테이너는 싱글톤으로 빈을 관리해주는 것을 확인할 수 있다.

'Spring' 카테고리의 다른 글

[JPA] N+1 문제  (0) 2023.01.08
@RequestMapping  (0) 2022.09.12
Spring MVC  (0) 2022.09.08
스프링 빈 생명주기 콜백  (0) 2022.09.05
스프링의 핵심  (1) 2022.09.04