스프링 빈을 조회할 때, 빈이 상속관계로 되어있을 경우(=부모 타입을 조회했는데, 자식 타입이 여러 개 있을 경우) 기본적으로 부모 타입을 조회하면 속해있는 자식 빈들이 모두 조회된다. 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다. 예제를 통해 확인해보자. 이를 위해 새로운 클래스를 만들고, 그 안에 사용할 Configuration을 하나 만드는데, 부모 타입은 같지만 자식 타입이 다른 두 개의 빈을 만들자. package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.di..
빈을 타입으로 조회할 경우, 같은 타입의 스프링 빈이 둘 이상이라면 오류가 발생하게 된다. 이때는 빈 이름을 지정해주면 된다. 테스트에 앞서 클래스를 하나 만들고, 그 안에 중복을 테스트하기 위해 새로운 컨테이너 SameBeanConfig.class를 임시로 만들어주자. 아래와 같다. package hello.core.beanfind; import hello.core.AppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.junit.jupiter.api.DisplayName; imp..
스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법을 알아보자. .getBean() .getBean(스프링 빈 이름, 타입)과 같은 형식으로 사용되고, 이름을 생략하고 .getBean(타입)으로 사용해도 된다. 만약 조회 대상인 스프링 빈이 존재하지 않는다면 다음과 같은 예외가 발생한다. NoSuchBeanDefinitionException: No bean named '...' available 실제로 코드를 작성해보자. 먼저, 빈의 이름으로 조회하는 테스트 코드이다. package hello.core.beanfind; import hello.core.AppConfig; import hello.core.member.MemberService; import hello.core.member.Memb..
스프링 컨테이너에 등록한 스프링 빈들이 제대로 등록되었는지 확인해보자. 테스트 코드로 작성할 것이다. Test 폴더의 hello.core 아래 beanfind 패키지를 만들어주고 ApplicationContextInfoTest 클래스를 하나 만들자. ApplicationContextInfoTest.class package hello.core.beanfind; import hello.core.AppConfig; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public c..
스프링 컨테이너에 대해 자세히 알아보자. 스프링 컨테이너의 생성 과정 스프링 컨테이너가 생성되는 과정을 그림으로 살펴보자. 먼저 다음의 코드로 스프링 컨테이너를 생성한다. ... ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); ... 앞서 본 것과 같이, ApplicationContext를 스프링 컨테이너라 하고 ApplicationContext는 인터페이스이다. 즉 다형성이 적용된 것이다. ApplicationContext를 구현한 것 중 하나가 AnnotationConfigApplicationContext인 것이다. → 인터페이스의 구현체 스프링 컨테이너는 어노테이션(@) 기반의 자바 설정 클래스로 만들어..
이전까지의 포스팅은 순수한 자바만을 사용하여 DI를 적용했다. 이제 스프링을 본격적으로 사용해보자. 우선, 스프링 코드를 살펴보자. AppConfig package hello.core; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.DiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.member...