BackEnd/Spring & Springboot Study

예제로 배우는 스프링 프레임워크 입문 - 의존성 주입 (Dependency Injection)

의존성 주입 (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;
}