Spring/스프링 핵심 원리 - 기본편 37

[의존 관계 자동 주입] 자동 주입 대상 옵션으로 처리하기

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 🚨 문제 상황 🚨 · 주입할 스프링 빈이 없어도 애플리케이션이 동작해야 하는 상황 · @Autowired 사용 시, 'required' 옵션 기본 값이 'true'로 되어 있어, 자동 주입 대상 없을 시 오류 발생 💡 해결 방법 💡 1️⃣ 호출 방지 : @Autowired(required = false) 2️⃣ null 호출 : @Nullable 3️⃣ Optional.empty 호출 : Optional · test/java/hello.core/aut..

[의존 관계 자동 주입] 생성자 주입 선택하기

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 다양한 의존 관계 주입 방법 생성자 주입 수정자 주입 필드 주입 (권장 X) 일반 메서드 주입 항상 생성자 주입 선택 + 필요 시 수정자 주입 선택 1️⃣ 생성자 주입 ☑️ 생성자를 통해 의존 관계 주입하기 · ⭐ 특징 - 생성자 호출 시점에 한 번만 호출 - "불변, 필수" 의존 관계에 사용 - 불변 : 바뀌지 않는 코드 - 필수 : final 변수 → 대응값 존재해야 함 - ⭐ 생성자가 1개만 있으면, @Autowired 생략 가능 (스프링 빈만 해당)..

[컴포넌트 스캔] 필터 - includeFilters, excludeFilters

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard includeFilters : 컴포넌트 스캔 대상을 추가로 지정 excludeFilters : 컴포넌트 스캔 대상에서 제외할 대상 지정 TEST ☑️ 필터를 사용해 등록한 빈 확인하기 1. test/java/hello.core/scan/filter Package 생성 2. filter 패키지에 MyIncludeComponent Interface 생성 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME..

[컴포넌트 스캔] 기본 스캔 대상

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard ✨ 탐색할 패키지의 시작 위치 지정하기 · AutoAppConfig ... @Configuration @ComponentScan( // 탐색할 패키지 시작 위치 지정하기 basePackages = "hello.core.member", // 지정한 클래스의 패키지를 탐색 시작 위치로 지정하기 basePackageClasses = AutoAppConfig.class, ... ) public class AutoAppConfig { } ✅ basePackages ..

[컴포넌트 스캔] @Component, @Autowired - 의존 관계 자동 주입

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 🫧 @ComponentScan ☑️ @Component 가 붙은 모든 클래스를 스프링 빈으로 등록 (설정 정보 없이 스프링 빈 자동 등록) · 스프링 빈 이름 기본 규칙 : 클래스명 (맨 앞글자만 소문자로 변경) 》ex) MemberServiceImpl → memberServiceImpl 》빈 이름 직접 지정 : @Component("memberService2") 🫧 @Autowired ☑️ 생성자에 @Autowired 지정 시, 스프링 컨테이너가 해당 스..

[싱글톤 컨테이너] @Configuration - 싱글톤 보장

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 🫧 궁금증 · AppConfig 에서 MemoryMemberRepository 가 2 번 호출되면서 싱글톤이 깨지지는 않을까 ?? @Configuration public class AppConfig { // @Bean memberService -> new MemoryMemberRepository() // @Bean orderService -> new MemoryMemberRepository() @Bean public MemberService memberSe..

[싱글톤 컨테이너] 싱글톤 방식의 주의점 - 무상태(stateless) 설계

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard · 싱글톤 객체는 상태를 유지(stateful)하도록 설계해서는 안됨 : 여러 클라이언트가 같은 객체를 공유하기 때문 ➡️ 무상태(stateless)로 설계 !! 》 특정 클라이언트에 의존적인 필드 X 》 특정 클라이언트가 값을 변경할 수 있는 필드 X (가급적 읽기만) 》 필드 대신 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등 사용 ☑️ 문제 상황 · 공유 필드의 값을 특정 클라이언트가 변경할 수 있을 때 // StatefulSe..

[싱글톤 컨테이너] 싱글톤 패턴의 문제를 해결하는 스프링 컨테이너

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 💡 스프링 없는 순수 DI 컨테이너 (싱글톤 X) TEST ☑️ 매 호출 시, 다른 객체가 생성됨을 확인하기 public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { AppConfig appConfig = new AppConfig(); // 1. 조회 : 호출할 때마다 객체 생성 MemberService memberService1 = appConfi..

[스프링 컨테이너와 스프링 빈] BeanDefinition - 스프링 빈 설정 메타 정보

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard ✨ BeanDefinition ✅ BeanDefinition : Bean 정보에 대한 추상화 (Bean 설정 메타 정보) 》@Bean, 당 각각 하나의 메타 정보 생성 BeanDefinition 정보 설명 BeanClassName 생성할 빈의 클래스명 (자바 설정처럼 팩토리 역할의 빈 사용 시에는 없음) FactoryBeanName 팩토리 역할의 빈을 사용할 경우 이름 (ex. appConfig) FactoryMethodName 빈을 생성할 팩토리 메서드 ..

[스프링 컨테이너와 스프링 빈] 다양한 설정 형식 지원 - 자바 코드, XML

🧐강의🧐 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard ✅ 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있다 》자바 코드 》XML 》Groovy 》... ✨ 애노테이션 기반 자바 코드 설정 사용 · AnnotationConfigApplicationContext 클래스를 사용해 자바 코드로 된 설정 정보 전달 》new AnnotationConfigApplicationContext(AppConfig.class) ✨ XML 설정 사용 · GenericXmlApplicationContext 클래스를 사용해..

728x90