Spring DI
객체간의 의존성을 외부에서 설정하여 객체간 결합도를 줄이고 유연성과 확장성을 높이는 디자인 패턴
Spring 👉 객체를 빈으로 등록
컨테이너 👈 빈을 가져와서 사용
스프링 컨테이너 : 빈의 생성, 관리. 라이프사이클 담당
🔊 스프링은 빈을 중심으로 개발, 스프링 컨테이너가 빈 관리 👉 객체 지향적 개발 가능
Spring DI 용어
- Bean : 객체
- BeanFactory : 빈 생성, 관리하는 인터페이스
- Applicaion Context : BeanFactory를 상속받아 만들어진 컨테이너
- Configuration metadata : 빈을 설정할 때 사용하는 메타데이터(XML, JavaConfig,
@
등)
- Bean Factory : 객체의 생성과 객체 사이의 런타임 관계를 DI관점에서 볼 때의 컨테이너
빈 팩토리에 여러가지 컨테이너 기능을 확장하여 ApplicationContext 라고 함.
Bean 등록 Annotation
등록 방법 : XML, Java Config, @
등
생성 (Bean 태그 대신)
@Component
: bean 태그와 동일한 역할
@Repository
: persistence 레이어, 영속성을 가지는 속성(파일, DB)을 가진 클래스
@Service
: 서비스 레이어, 비즈니스 로직을 가진 클래스
@Controller
: 프레젠테이션 레이어, 웹어플리케이션에서 웹 요청/응답 처리 클래스
@Scope
: bean 생성과 사용범위(Scope) 설정
- 버전 : singleton, prototype, request, session, global session
- prototype : 요청할 때 마다 새로운 인스턴스 생성
- singleton : 하나의 인스턴스만 생성, 모든 요청에서 공유
@Repository, @Service, @Controller
는 @Component
의 구체화된 형태
주입
의존하는 객체를 자동으로 주입
@Autowired
* 프로퍼티, setter 메서드, 생성자, 일반 메서드에 적용
- 의존하는 객체를 주입할 때 Type을 이용
- property, constructor-arg 태그와 동일한 역할(DI)
❗ 동일한 타입의 빈이 여러개 일 때 구분할 수 가 없다면? @Qualifier
사용
@Qualifier
: @Autowired
사용 시 동일한 타입 빈이 여러개이고 id와 property명이 일치하는 것이 없을 때 해당 어노테이션을 사용하여 빈의 이름을 지정
- byType 주입
: 타입을 기준으로 의존성 주입
: 같은 타입의 빈이 여러개인 경우 byName 사용👇
- byName 주입
: 이름을 기준으로 의존성 주입
: 빈의 이름과 필드나 메서드 이름 일치해야함
@Resource
@Value
Component 지원 태그
Spring에서는 어노테이션을 사용하여 객체를 생성하고, 의존성을 주입하는 방식을 권장.
이러한 어노테이션을 사용하면, XML 파일에 별도의 설정을 작성할 필요가 없어지며,
어노테이션만으로도 객체 생성 및 의존성 주입이 가능해진다.
<context:component-scan>
- 클래스 경로를 스캔하여 Spring이 인식할 수 있는 Bean으로 등록하는 기능 수행
장점
- 별도의 bean 설정 파일에서 bean을 등록하지 않아도 자동 등록됨
: bean으로 사용할 클래스에 @Component
어노테이션 추가해야 가능
@Component
를 통해 자동으로 Bean 등록, @Autowired
로 의존관계를 주입받는 어노테이션
<context:component-config>
- 어노테이션 기반의 설정을 활성화 - 객체 생성과 의존성 주입 자동 관리
: 해당 태그 사용 시 Spring이 어노테이션을 인식하고 알맞은 설정을 자동으로 처리
장점
- XML 파일에 별도 설정하지 않아도 어노테이션 작성으로 객체 생성 및 의존성 주입 가능
- 코드 가독성 및 작업 효율성 증가