본문 바로가기
java spring/DI

DI- 3 어노테이션 기반으로 의존성 주입하기

by 킹차니 2021. 4. 28.

xml방식이 아닌 어노테이션 기반으로 의존성 주입을 해보자.

 현재 상황은 Exam 클래스와 ExamConsole 클래스가 있는 상태이다. Exam클래스가 시험 점수를 속성으로 가지고 있고, ExamConsole은 그 점수들의 평균, 총점을 계산하여 콘솔에 출력해준다.

이를 위해 ExamConsole은 Exam을 속성(=부품)으로 가진다. 

ExamConsole이 Exam이라는 의존성을 주입받아야하는 상황이다.

 

우선 어노테이션을 사용하여 스프링에게 Bean객체를 생성해 달라고 하기 위해서는 xml파일에 명시해서 알려줘야한다.

Setting.xml

12라인의 <context: component-scan base-package="패키지명1", "패키지명2",,,/>

을 보면 등록할 빈이 있는 클래스의 경로를 적어준다. 현재 spring.di.ui 와 spring.di.entity를 적어줬는데 이렇게 하면 스프링은 해당 패키지들에서 @Component 어노테이션이 있는지 찾는다. 

먼저 주입을 받는 대상인 spring.di.ui 패키지의 ExamConsole을 구현한 inlineExamConsole 클래스를 보자.

inlineExamConsole.java

inlineExamConsole 클래스는 주입을 받아야하는 주체이다. 이를 위해서는 우선 Bean객체에 등록되어야 할 것이다.

9라인에서 보는 것처럼

1. @Component("inlineExamConsole")

"아래 클래스를 Bean객체로 등록. 생성해줘~ 그리고 그 객체의 이름은 'inlineExamConsole'이라 할께!" 라고 하는 것이다.

이렇게 등록된 Bean객체는 ioc컨테이너에 담기게 될 것이다.

 

2. 두번째로 11라인에 @Autowired가 보인다.

@Autowired는 해당 클래스가 필요한 의존성에 맞는 타입을 찾아서 의존성을 주입해준다. 

@Autowired는 생성자 위(위에서는 14, 또는 18라인), 또는 setter 위(위에서는 33라인에), 또는 위의 캡처본처럼  필드 위에 적을 수 있다.

즉 생정자, 필드, 세터들을 보면 스프링이 Exam형 객체가 필요한 것을 보고, 만들어서 Exam을 주입시켜주는 것이다.(즉 ioc컨테이너에서 조립해준다.)

또한 @Autowired의 기본값은 @Autowired(required=true)인데,이는 의존성 주입에 필요한 의존성이 Bean에 필수로 등록되어 있어야한다는 것이다.

 @Autowired(required=false)라고 하면 의존객체가 없어도 오류를 내지 말라는 것이다.

 

하지만 위에서 @Autowired는 required=true이니  Exam형 객체를 Bean등록으로 해줘야한다.(등록하지 않으면 의존주입 과정에서 에러가 날 것이다.)

이를 위해 Exam을 구현한 NewlecExam클래스에 빈 등록을 위한 @Component 어노테이션을 써주자.

NewlecExam.java

위의 클래스 위에 @Component어노테이션이 보인다. 이렇게 해두면 스프링은 NewlecExam을 Bean객체로 등록하고,

@Autowired의 지시에 따라 inlineExamConsole에 NewlecExam Bean객체를 주입시킬 것이다.

(참고로 스프링이 NewlecExam.java에 와서 빈등록을 해주는것은 우리가 xml파일에 해당 패키지도 찾아보라고 명시해서 이다. 자동으로 여기까지 와서 확인해 주는 것이 아님을 알자.)

 

그렇다면 main이 있는 곳으로 가서 잘 조립이 되었는지 확인해보자.

20라인: ioc컨테이너, 즉 applicationContext객체를 만든다.

22라인: 컨테이너에 들어있는 Bean중 inlineExamConsole이라는 이름을 가진 빈을 찾아서 inlineExamConsole이 참조하게 한다.

24라인: inlineExamConsole의 print()메소드를 실행시킨다.

결과

결과를 보면 잘 수행된 것을 볼 수 있다. 즉 inlineExamConsole의 print()메소드에서 exam이 null이 아니라면 총점과 평균을 각각 80으로 출력하도록 했는데, NewlecExam클래스의 객체가 잘 생성되어 위와 같은 결과가 나온 것이다.

'java spring > DI' 카테고리의 다른 글

DI -4 xml파일을 Configuration클래스로 대체하기  (0) 2021.04.28
DI - 2  (0) 2021.04.26
DI -1  (0) 2021.04.26