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

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

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

from http://devjun.tistory.com/236 by ccl(A) rewrite - 2021-12-02 02:02:01