본문 바로가기

Develop/Spring (이론)10

@componentScan 중복 등록과 충돌 @componentScan 을 실행할 때, bean이름 중복 등록과 충돌이 일어나면 스프링은 어떻게 대응할까? 1. 자동 빈 등록 vs 자동 빈 등록 상황 중복되는 두개의 빈이 모두 자동등록 되는 경우 ( @Component 어노테이션을 통해서... ) → 오류 발생 : ConflictingBeanDefinitionException` 예외 발생 두개의 service명이 겹칠 때, bean을 조회하는 scan 테스트 코드를 실행 시 오류가 뜸. package hello.core.scan; import hello.core.AutoAppConfig; import hello.core.member.MemberService; import org.assertj.core.api.Assertions; import org.. 2023. 8. 20.
@ComponentScan & 의존성 주입(@Autowired) 딥다이브 지금까지 스프링 빈을 등록할 때는 자바코드의 @Bean이나 XML의 을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 이렇게 등록해야할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기 어려워진다. → 스프링은 설정정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan이라는 기능을 제공한다. +@ 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. @ComponentScan이란? 컴포넌트 스캔은 이름 그대로 `@Component` 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다. 이제 각 클래스가 컴포넌트 스캔의 대상이 되도록 `@Component` 애노테이션을 붙여주자. ※예제를 시행할 때, 주의할 점 'excludeFilters'를 통해 컴포넌트 .. 2023. 8. 18.
@Configuration과 싱글톤 Spring 코드를 보다보면 이상한 점이 있다. 내가 작성한 AppConfig.java 코드를 보자. package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.. 2023. 8. 17.
싱글톤(Singleton) 딥다이브 ( Spring 內 싱글톤 컨테이너 비교) 사건의 발단 : 만약 싱글톤 방식의 설계가 없다면? 우리가 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 객체를 새로 생성한다. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! 메모리 낭비가 심하다. package hello.core.singleton; import hello.core.AppConfig; import hello.core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") voi.. 2023. 8. 12.
스프링 빈 설정 메타 정보 _ BeanDefinition 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 `BeanDefinition` 이라는 추상화가 있다. 방법1. 자바 코드를 읽어서 BeanDefinition을 만들면 된다. 방법2. XML을 읽어서 BeanDefinition을 만들면 된다. 즉, 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다. `BeanDefinition` 을 빈 설정 메타정보라 한다. `@Bean` , `` 당 각각 하나씩 메타 정보가 생성된다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다. 1. 자바 코드의 경우 : AnnotationConfigApplicationContext` 는 `AnnotatedBeanDefinitionReader.. 2023. 8. 11.
스프링의 다양한 설정 형식 지원 - 자바 코드 , XM 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다. ex ) 자바 코드, XML, Groovy 등등 애노테이션 기반 자바 코드 설정 사용 - 일반적인 스프링 설정 방식이다. - new AnnotationConfigApplicationContext(AppConfig.class)` - `AnnotationConfigApplicationContext` 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다. 지금까지 해온 것이니 실습 생략한다. XML 설정 사용 - 요즘의 스프링 부트에서는 사용하지 않지만, 과거의 레거시 프로젝트에서 주로 사용됨. - `GenericXmlApplicationContext` 를 사용하면서 `xml` 설정 파일을 넘기면 된다. 1. reso.. 2023. 8. 10.
반응형