[Spring] 스프링 프레임워크 - 싱글톤 컨테이너

김엄지·2024년 5월 27일
0

Spring

목록 보기
21/21
post-thumbnail

Spring Framework

스프링 프레임워크는 애플리케이션 개발을 쉽게하고, 유지보수를 용이하게 하기 위해 다양한 기능을 제공한다. 이 중에서 스프링 컨테이너, 스프링 빈, 싱글톤 패턴, 싱글톤 컨테이너에 대해서 간략하게 공부해보자.

1. 스프링 컨테이너

스프링 컨테이너는 스프링 프레임워크의 핵심이다. 컨테이너는 객체의 생성, 조립, 관리, 그리고 해체를 담당한다. ApplicationContext 인터페이스를 통해 제공된다. 주요 역할은 다음과 같다.

  • 객체(빈) 생성 및 관리: 애플리케이션 구동 시 빈을 생성하고 관리한다.
  • 의존성 주입: 빈 간의 의존성을 설정하고 주입한다.
  • 라이프사이클 관리: 빈의 라이프사이클을 관리하며, 초기화와 소멸 메서드를 호출한다.

2. 스프링 빈

스프링 빈은 스프링 컨테이너에 의해 관리되는 객체를 의미한다. 빈은 애플리케이션의 구성 요소로, 보통 @Compenent, @Service, @Repository, @Controller, @Bean 어노테이션을 통해 정의된다.

  • 등록 및 설정: 빈은 스프링 컨테이너에 등록되며, XML 설정파일이나 자바 설정 클래스를 통해 정의된다.
  • 주입 및 사용: 다른 빈에 의존성을 주입할 수 있으며, 컨테이너가 빈을 자동으로 주입해준다.

3. 싱글톤 패턴

싱글톤 패턴은 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴이다. 주로 전역 상태를 유지하거나 리소스를 절약하기 위해 사용된다.

  • 장점: 객체 생성 비용을 절감하고, 메모리 사용을 최소화한다.
  • 단점: 전역 상태를 가지므로 멀티스레드 환경에서 동기화 문제가 발생할 수 있다.

4. 싱글톤 컨테이너

스프링 컨테이너는 기본적으로 싱글톤 컨테이너이다. 이는 컨테이너가 각 빈의 인스턴스를 한 번만 생성하고, 동일한 인스턴스를 재사용함을 의미한다.

AppConfig

// Bean 메서드를 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

@Configuration
public class AppConfig {

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

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

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

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}

MemberServiceImpl

public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    ...
    
    public MemberRepository getMemberRepository() {
        return memberRepository;
    }
}

ConfigurationSingletonTest

public class ConfigurationSingletonTest {

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

        MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
        OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class);
        MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class);

        MemberRepository memberRepository1 = memberService.getMemberRepository();
        MemberRepository memberRepository2 = orderService.getMemberRepository();

        System.out.println("memberService -> memberRepository = " + memberRepository1);
        System.out.println("orderService -> memberRepository = " + memberRepository2);
        System.out.println("memberRepository = " + memberRepository);

        assertThat(memberService.getMemberRepository()).isSameAs(memberRepository);
        assertThat(orderService.getMemberRepository()).isSameAs(memberRepository);
    }
}

실행 결과

동일한 인스턴스를 재사용하는 것을 볼 수 있었다.


참고 코드

  • 인프런 스프링 핵심 원리 - 기본편
profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글