스프링 컨테이너

- 자바 객체의 life-cycle 관리

- Dependency Injection (DI) 수행

보통, ApplicationContext를 스프링 컨테이너라고 함. 

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.

스프링 컨테이너는 싱글톤 컨테이너 역할을 함.

 

의존 관계 자동 설정

1. Java Code 기반 설정

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        // 생성자를 통해 들어감.. (생성자 주입)
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemoryMemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

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

 

2. Annotation 기반 설정

@Configuration
@ComponentScan(
        // 탐색할 패키지의 시작 위치 지정
        /*
         라이브러리까지 다 뒤지기 때문에 모든 걸 탐색하면 시간 매우 오래 걸림
         default: @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 됨. (여기선 모든 걸 뒤짐)
         권장: 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 둠.
         */
        basePackages = "hello.core",
        basePackageClasses = AutoAppConfig.class,
        // component scan에서 뺄 것들 (configuration 자동으로 등록되면 중복 설정됨)
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}

 

의존관계 주입

- 생성자 주입

- 수정자 주입(setter 주입)

- 필드 주입

- 일반 메서드 주입

-> 대부분의 경우 생성자 주입을 사용

 

생성자 주입

- 생성자 호출 시점에 딱 1번만 호출되는 것이 보장됨.

- 불변, 필수 의존관계에 사용

생성자 주입은 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살리는 방법

생성자 주입
그 때 값 setting.. 그 이후 setting 막을 수 있음
-> 외부에서 수정X
memberRepository 외부에서 수정 불가. discountPolicy도 생성될 때만 .. instance 자체를 수정할 방법X
인위로 수정하는 메서드 만들면 안 됨 ex) setMemberRepostiory, setDiscountPolicy
 객체를 생성할 때(bean을 등록하면서), 실행

 setter 주입
 생성자 실행 후, setter로 의존관계 주입
 memberRepository가 스프링에 등록 안 됐을 때도 사용가능
 -> 선택적으로 할 수 있음 (discountPolicy만 의존관계 주입)
 중간에 변경 가능 (거의 없는 경우긴 함)
 참고:자바빈 프로퍼티

 필드 주입
 매우 간단!
 테스트할 때, memberRepository를 더미 데이터로 만들고 싶어도, 할 수 있는 방법X
 스프링 컨테이너에서 관리하는 것만 가능하지, 순수 자바 코드에서는 작동X

 

'기타' 카테고리의 다른 글

[Spring] 좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2023.04.16

+ Recent posts