일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 스프링 프레임워크
- 생성자 주입
- 스프링
- mybatis
- kafka
- 스프링부트
- assertThat
- JPA
- 필드 주입
- db
- assertThrows
- resultMap
- java
- Effective Java
- 스프링 부트 기본
- DI
- jdbc
- 스프링 부트
- sqld
- SQL
- 스프링 빈
- spring
- Javascript
- @Configuration
- springboot
- 스프링 부트 입문
- 스프링 컨테이너
- thymeleaf
- DIP
- 싱글톤
- Today
- Total
목록Framework/Spring Framework (56)
선 조치 후 분석
빈 중복 등록+ 빈 충돌 + 자동 빈 등록 vs 자동 빈 등록 + 수동 빈 등록 vs 자동 빈 등록 + ConflictingBeanDefinitionException 컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까? 다음 두 가지 상황이 있다. 1. 자동 빈 등록 vs 자동 빈 등록 2. 수동 빈 등록 vs 자동 빈 등록 자동 빈 등록 vs 자동 빈 등록 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다. -> ConflictingBeanDefinitionException 예외 발생 코드로 알아보자. 1. OrderServiceImpl의 @Component명 변경 @Component("service") public class OrderServi..
어노테이션 필터 + 어노테이션 생성 + includeFilters + excludeFilters + @ComponentScan. Filter + FilterType includeFilters : 컴포넌트 스캔 대상을 추가로 지정. excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정. 이번엔 직접 어노테이션을 만들어서 사용해보자. 바로 코드로 알아보자. 1. MyIncludeComponent 어노테이션 생성 @Target(ElementType.TYPE) // TYPE이라 하면, 같은 클래스 레벨이 타겟이 된다. @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { } 2. MyExclude..
컴포넌트 스캔의 탐색 위치와 기본 스캔 대상 + 어노테이션 기능 및 원리 + basePackageClasses + basePackages + SpringBoot 원리 탐색 위치와 기본 스캔 대상 탐색할 패키지의 시작 위치 지정 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다. AutoAppConfig에 basePackages = "시작 위치 ex) hello.core.member"만 추가해주면 된다. @ComponentScan( basePackages = "hello.core.member", 결과를 보면 지정된 위치에서 검색된 빈만 컴포넌트 스캔을 했다. 20:20:05.392 [main] DEBUG org.springfra..

컴포넌트 스캔과 의존관계 자동 주입 + 컴포넌트 스캔 (@ComponentScan)+ @Component + @Autowired + @ComponentScan. Filter 컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에서는 몇 개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백 개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 역시 개발자는 반복을 싫어한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존 관계도 자동으로 주입하는 @Autowired라는 기능도 ..

@Configuration과 바이트코드 조작의 마법 + CGLIB + 스프링 싱글톤 원리 + @Autowired 스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 바 장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 자바 코드를 보면 분명 3번 호출되어야 하는 것이 맞다. 그래서 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 @Configuration을 적용한 AppConfig에 있다. @Test public void configurationTest() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl..
@Configuration과 싱글톤(Singleton) @Configuration은 사실 싱글톤을 위해서 존재하는 것이다. 아래 코드를 보자. memberService를 호출하면, MemberServiceImpl을 호출하면서 memberRepository를 호출한다. @Bean memberService -> new MemoryMemberRepository() @Bean orderService -> new MemoryMemberRepository() 호출이 2번 일어난다. 그렇다면 이러면 싱글톤이 깨지는 거 아닐까?? @Configuration public class AppConfig { @Bean public MemberService memberService() { //return new MemberSe..