의존성 주입 (Dependency Injection)
필요한 의존성을 어떻게 받아올 것인가..
@Autowired / @Inject를 어디에 붙일까?
- 생성자
- 필드
- Setter
1. Constructor
public OwnerController(OwnerRepository clinicService, /*VisitRepository visits*/) {
this.owners = clinicService;
//this.visits = visits;
}
@AutoWired -> 4.3부터
어떠한 클래스에 생성자가 하나뿐이고 생성자로 주입받는
Reference 변수들이 Bean으로 등록되어 있다면
그 Bean을 자동으로 주입해주도록 추가 되었음
즉 4.3이상부터 Autowired 생략 가능
2. field
private OwnerRepository owners;
private VisitRepository visits;
@Autowired
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
=>
@Autowired
private OwnerRepository owners;
@Autowired
private VisitRepository visits;
3. setter
Spring IOC Container가 인스턴스를 만들고 나서 Setter를 통해서 IOC conatiner에 들어있는
Bean중에 OwnerRepository, VisitRepository Type을 찾아 넣어줌
@Autowired
public void setOwners(OwnerRepository owners) {
this.owners = owners;
}
@Autowired
public void setVisits(VisitRepository visits) {
this.visits = visits;
}
package org.springframework.samples.petclinic.Sample;
public class SampleRepository {
public void save() {
}
}
OwnerController{
@Autowired
private SampleRepository sampleRepository;
}
Field sampleRepository in org.springframework.samples.petclinic.owner.OwnerController
required a bean of type 'org.springframework.samples.petclinic.Sample.SampleRepository'
that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
SampleRepository에 Bean등록 설정을 하지 않고
OwnerController에서 사용할 시 이와 같은 에러가 나온다.
SpringFramework Reference에서 권장하는 방법은 Constructor이다.
필수적으로 사용해야 하는 Reference 없이는 Instance를 만들지 못하도록 강제할 수 있기 때문이다.
field, setter Injection은 Reference 없이 Instance 생성이 가능하다.
순환참조 ( A -> B) (B -> A) 서로가 필요한 상황이라면 -> filed나 setter를 활용
과제
- OwnerController에 petRepository 주입하기
private final PetRepository petRepository;
@Autowired
private PetRepository petRepository;
public OwnerController(OwnerRepository clinicService, VisitRepository visits,
PetRepository petRepository) {
this.owners = clinicService;
this.visits = visits;
this.petRepository = petRepository;
}
@Autowired
public void setPetRepository(PetRepository petRepository){
this.petRepository = petRepository;
}
'BackEnd > Spring & Springboot Study' 카테고리의 다른 글
예제로 배우는 스프링 프레임워크 입문 - 프록시 패턴 (0) | 2021.12.03 |
---|---|
예제로 배우는 스프링 프레임워크 입문 - 스프링 AOP (0) | 2021.12.03 |
예제로 배우는 스프링 프레임워크 입문 - Spring Bean (0) | 2021.11.26 |
예제로 배우는 스프링 프레임워크 입문 - IOC Container (0) | 2021.11.25 |
예제로 배우는 스프링 프레임워크 입문 - IOC (0) | 2021.11.23 |