전통적으로 의존성을 구매했지만, 최근에는 렌탈 서비스가 급격히 증가 📦
스프링 프레임워크에 의해 생성되고 관리되는 자바 객체 🛠️
스프링은 빈의 생성, 의존관계 설정, 객체 관리 등 빈의 라이프사이클을 전반적으로 관리합니다.
어떤 객체가 비즈니스 로직 처리를 위해 다른 객체에 의존하는 관계 → 객체 간 has-a 관계
의존 관계 관리를 위해 DI 개념을 사용하며 이 과정에서 제어의 역전(IoC)이 발생합니다.
1단계: 기존 결합도 높은 코드 🔧
2단계: 인터페이스 도입 (하지만 new로 생성하므로 여전히 결합됨) 🧱
3단계: Factory Pattern 도입 (렌탈 업체 등장! 생성은 Factory가, 참조만 인터페이스) 🏭
4단계: 싱글톤 적용 (객체 생성은 딱 한 번!) 🧵
➡️ 최종적으로 Spring Framework의 등장 🎉
Spring은 빈(Bean) 이라는 개념으로 객체를 관리하고, 의존성을 주입(DI) 해줍니다.
👉 개발자가 직접 컨트롤 → 프레임워크가 컨트롤 (제어의 역전!)

빈을 생성하고 의존성을 주입하는 코드를 별도의 설정 파일에 명시하는 방식
@Configuration + @Bean 사용(어노테이션을 확인할 때 중요한 2가지: 타겟과 속성!)
🫢 계속 new 되는 거 아니야?! → @BeforeEach로 한 번만 생성 가능하게 설정 가능
@BeforeEach를 사용하여 new를 테스트 전에 딱 한 번 실행되도록 함 🔄
@Test를 통해 테스트 실행 ✔️
싱글톤 확인은 Assertions.assertSame() 사용 ✅
명시적 DI처럼 @Configuration, @Bean을 사용하지 않고, 어노테이션을 기반으로 주입
@Component : 클래스 위에 붙여 스프링 빈으로 등록 가능
기본 빈 이름은 클래스명을 소문자로 시작한 camelCase
@Autowired : 타입 기반의 자동 주입 (생성자, 메서드, 필드에 사용 가능)
생성자가 하나일 경우, @Autowired 생략 가능
@ComponentScan : 어떤 패키지에서 빈을 스캔할지 설정 🔍
⚠️ 주의사항:
1. 어떤 패키지를 스캔할지 명시해야 함
2. 설정 클래스에 @Configuration 있어야 작동
🫢 Watch와 SmartWatch처럼 타입이 같으면 스프링이 헷갈려서 어떤 빈을 줘야 할지 모름
➡️ @Qualifier 사용으로 이름 기반으로 주입할 빈을 한정할 수 있음
@Component : 특별한 의미는 없지만, "빈의 대상"임을 나타냄@Repository, @Service, @Controller, @Configuration 등은 내부적으로 @Component 포함👉 가급적 스테레오 타입 어노테이션 사용하고, 일반적인 경우엔 @Component 사용

명시적 DI보다 묵시적 DI가 익혀야 할 어노테이션은 많지만 더 직관적이고 편리합니다.
하지만 외부 라이브러리 코드는 @Component가 없어 자동 등록이 불가능하기 때문에
➡️ 명시적 DI도 보조적으로 반드시 필요합니다.
의존성은 무조건 가져야 하는 것 ex) 클래스 안에 있는 객체, has a 관계
객체를 원래 내가 선언하고 활용해야 하는데 그러면 유지보수가 힘듬 그것을 해결해주는게 IOC = 제어의 역전
IOC의 방법이 바로 DI = 의존성 주입!
Spring이 DI를 자동으로 해주기 위해 Bean으로 class들을 관리
명시적과 묵시적 방법으로 주입 가능 (어노테이션 활용)


정처기 실기 모의고사 , 1 알고리즘