본문 바로가기

Dev/Spring Boot

[예제로 배우는 스프링 입문] 의존성 주입

@Autowired 을 사용할 수 있는 지점

- 필드, setter, 생성자

 스프링 4.3버전 부터 어떠한 클래스에 생성자가 하나뿐이고 그 생성자로 주입받는 레퍼런스 변수들이 빈으로 등록되어 있다면 그 빈을 자동으로 주입해주도록 스프링 프레임 워크에  기능이 추가 되었다. 따라서 4.3버전 이상부터는 @Autowired 어노테이션을 생략하고 사용할 수 있다.

 

1. 생성자로 의존성을 주입 받는 것이 아니라 필드로 바로 주입 받는 걸 시도해 보자

OwnerController.java

 

2. setter에다가 autowired 붙이는 방법도 있다.

OwnerController.java

애플리케이션을 실행해서 잘 실행되면 의존성이 잘 주입이 된것이다.

 

3. SampleRepository를 빈으로 등록하지 않고, OwnerController.java에서 필드로 주입

이 경우엔 어플리케이션 자체가 뜨지 않는다. 왜? OwnerController에 필요한 의존성을 넣어줄 수 없기 때문이다. (?)

Consider defining a bean of type 'org.springframework.samples.petclinic.sample.SampleRepository' in your configuration. 

스프링 프레임워크 레퍼런스에서 권장하는 방법은? 생성자이다.

 필수적으로 사용해야 하는 레퍼런스 없이는 이 인스턴스를 강제할 수 있기 때문이다. 필드, 세터 방법은 특정 레퍼런스가 없이도 인스턴스를 만들 수 있다. 장점이자 단점이다. 간혹 코딩하다보면 순환참조(Circular dependency)가 발생할 수 있다. 둘다 생성자 인젝션을 사용. 두개가 서로를 참조하는 경우, 필드나 setter을 사용하면 좋다.

 

OwnerController에 PetRepository 주입하기

1. 필드 @Autowired

또는 생성자를 통해서 주입 가능하다. 변수에 final을 붙이면 변형되는 것을 막을 수 있다.

2. 생성자

또는 setter을 사용한다. 이땐 final 쓰면 안된다.

3. Setter