

위가 일체형 아래가 결합형(IOC 컨테이너) 역순으로 결합.

B2를 빼고 B3로 대체하려면 아래 코드를 B3로 수정하여야 한다.

B2를 없애고 B3로 대체하면 컴포넌트가 설정된 것이 B3 밖에 없기 때문에 자동으로 연결된다.


어노테이션을 사용하면 이렇게 대체 가능
해당 타입의 Bean이 무조건 있어야 한다.
없으면 Spring은 애플리케이션 실행 도중 오류를 발생시키고 종료
해당 타입의 Bean이 없어도 예외가 발생하지 않는다.
그냥 null로 남겨둔다.
@Autowired에서 주입할 Bean을 명확하게 지정해줄 때 사용
Spring 컨테이너가 생성하고 관리하는 객체

->@Component를 붙이면 Spring이 Bean으로 등록해준다.
즉, 직접 new를 통해 만들지 않아도 Spring이 알아서 만들어서 필요할 때 주입해준다.
Spring 컨테이너(즉, Bean 저장소)
Spring에게 "이 클래스를 Bean으로 등록해줘"라고 명령하는 어노테이션
① 의존성 자동 주입 (DI: Dependency Injection)
필요한 객체를 new 하지 않고, @Autowired나 생성자를 통해 자동으로 주입받을 수 있음
② 싱글톤 관리 (기본 Scope)
기본적으로 Bean은 싱글톤으로 관리됨 (필요할 때마다 하나만 생성해서 공유)
③ 생명주기 관리 가능 (@PostConstruct, @PreDestroy)
Spring이 객체를 생성하고 초기화한 후에 실행할 코드나, 종료 전에 처리할 로직을 지정 가능
④ AOP 적용 가능 (공통 로직 분리)
Bean으로 등록된 객체는 Spring이 프록시로 감싸므로 트랜잭션 처리, 로깅, 보안 검사 같은 기능을 자동 삽입 가능
⑤ 환경 설정 연동 (@Value, @ConfigurationProperties)
Bean으로 등록된 객체는 설정파일(application.properties, .yml)에서 값을 주입받을 수 있음
⑥ 테스트에 최적화 (스프링 컨테이너 테스트 연동)
Bean으로 등록된 클래스는 @SpringBootTest 등과 함께 통합 테스트 환경에서 쉽게 주입 가능


해당 클래스가 데이터베이스 테이블과 매핑되는 객체임을 나타내는 어노테이션
이 클래스를 기반으로 Spring이 DB테이블을 생성, 매핑, 조작할 수 있게 해준다.
기본 조건

해당 클래스가 Spring 설정 파일 역할을 한다고 명시하는 어노테이션

Spring이 특정 패키지를 스캔해서 @component와 하위 어노테이션 3개가 붙은 클래스를 자동으로 Bean으로 등록하게 해주는 어노테이션
API 서버처럼 데이터(JSON/XML 등) 반환이 목적