목록Spring/핵심 원리 구현 (58)
코드 그라데이션
필터 모든 코드는 테스트 코드에 추가 컴포넌트 스캔 대상에 추가할 애노테이션 package inflearn.spring_core.scan.filter; import java.lang.annotation.*; // 컴포넌트 스캔 대상에 추가할 애노테이션 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { } 컴포넌트 스캔 대상에서 제외할 애노테이션 package inflearn.spring_core.scan.filter; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(Retention..
컴포넌트 스캔은 `@Component` 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다. 이 어노테이션들을 눌러보면 전부 @Component 어노테이션이 있다. 등... 참고 : 사실 애노테이션에는 상속관계라는 것이 없다. 그래서 이렇게 애노테이션이 특정 애노테이션을 들고 있는 것을 인식할 수 있는 것은 자바 언어가 지원하는 기능은 아니고, 스프링이 지원하는 기능이다. 컴포넌트 스캔의 용도 뿐만 아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다. 참고 : `useDefaultFilters` 옵션은 기본으로 켜져있는데, 이 옵션을 끄면 기본 스캔 대상들이 제외된다. 이런 옵션이 있구나 정도만 인식하면 된다.
탐색 위치와 기본 스캔 대상 탐색할 패키지의 시작 위치 지정 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다. ex. 권장하는 방법** 개인적으로 즐겨 사용하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 최근 스프링 부트도 이 방법을 기본으로 제공한다. 예를 들어서 프로젝트가 다음과 같이 구조가 되어 있으면
컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 예제에서는 몇개가 안되었지만, 이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 역시 개발자는 반복을 싫어한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 의존관계도 자동으로 주입하는 `@Autowired` 라는 기능도 제공한다. AutoAppConfig.java @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType...
@Configuration과 바이트코드 조작의 마법 스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 앞선 자바 코드를 보면 분명 3번 호출되어야 하는 것이 맞다. 그래서 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 `@Configuration` 을 적용한 `AppConfig` 에 있다. 테스트 코드 추가 package inflearn.spring_core.singleton; import inflearn.spring_core.config.AppConfig; import inflearn.spring_core.member.MemberRepository; import inflearn..
@Configuration과 싱글톤 AppConfig 코드를 보면 @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 Discount..
싱글톤 방식의 주의점 상태를 유지할 경우 발생하는 문제점 예시* StatefulService public class StatefulService { private int price; //상태를 유지하는 필드 public void order(String name, int price) { System.out.println("name = " + name + " price = " + price); this.price = price; //여기가 문제! } public int getPrice() { return price; } } 상태를 유지할 경우 발생하는 문제점 예시** StatefulServiceTest 먼저 static클래스 만들어서 빈 등록 // 스태틱 클래스 만들어서 빈 등록 static class Te..
싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 여기서 다뤄왔던 스프링 빈이 바로 싱글톤으로 관리되는 빈이다. 싱글톤 컨테이너 스프링 컨테이너를 사용하는 테스트 코드 SingletonTest - 테스트 추가 package inflearn.spring_core.singleton; import inflearn.spring_core.config.AppConfig; import inflearn.spring_core.member.MemberService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframew..