[Spring 3.0] 의존성 주입(DI) - 수동
by 무작정 개발2022.03.24(63일 차)

이번에는 spring2.5에서 배웠던 의존성 주입, 제어의 역전에 대해 다시 한번 정리할 것이다.
생성자, 메서드를 사용한 의존성 주입(DI)에 대해 예제를 통해 알아보자.
의존성 주입을 할 때 Annotation(어노테이션)을 사용하면 자동으로 의존성 주입을 해주지만
동작 원리 및 흐름을 알기 위해 생성자, 메서드를 사용해 수동으로 의존성 주입을 할 것이다.
Annotation(어노테이션)에 관한 자료는 이전 글 참고
https://backendcode.tistory.com/106
[Spring 2.5] Annotation (어노테이션)
2022.03.22(61일 차_화요일) - 스프링(Spring) 2일 차 마지막 글 이번 글에서는 Annotation(어노테이션)에 정리할 것이다. 오늘의 수업 내용 Annotation (어노테이션) 기존에는 dispatcher-servlet.xml에 bean..
backendcode.tistory.com
오늘의 수업 내용
1. 생성자를 이용한 의존성(DI) 주입
1. MessageService 인터페이스 생성
javapackage com.exe.springdi4; public interface MessageService { public String getMessage(); }
2. MyMessageService 클래스 생성
- MessageService인터페이스를 구현한 클래스이다.
- 인터페이스를 상속받아 메서드 작성
javapackage com.exe.springdi4; //MessageService 인터페이스를 구현한 클래스 public class MyMessageService implements MessageService { public String getMessage() { return "안녕 방가방가!!"; } }
3. ServiceConsumer 클래스 생성 (중간 관리자 역할)
- 중간에서 값을 받아서 Main클래스한테 넘겨주는 역할
javapackage com.exe.springdi4; public class ServiceConsumer { //생성자를 통한 의존성 주입 MessageService ms; //값을 받아서 초기화할 변수 생성 //의존성 주입(DI) - 생성자를 통한 / 넘어올 값을 넣어준다. public ServiceConsumer(MessageService ms) { this.ms = ms; } public void consumerService() { //반환값은 String String message = ms.getMessage(); System.out.println(message); } }
ServiceConsumer의 객체가 생성되면서 의존성 주입으로 값을 ms에 넣어준다.
MessageService ms = (MessageService) context.getBean("messageService"); 와 같은 역할이다.
consumerService() 메서드에는 출력을 위한 코딩을 작성하였다.
4. app-context.xml 작성
html<bean id="serviceConsumer" class="com.exe.springdi4.ServiceConsumer"> <!-- 생성자로 의존성주입 --> <!-- 이 객체가 생성되기 위해서는 messageService가 반드시 필요 --> <!-- 제어의 역전(IOC) --> <constructor-arg ref="messageService"/> </bean> <bean id="messageService" class="com.exe.springdi4.MyMessageService"/>
먼저 중간관리자 역할을 하는 ServiceConsumer 클래스를 serviceConsumer이라는 이름으로 객체 생성을 해준다.
<constructor-arg ref="messageService"/>로 의존성 주입을 해주었다.
serviceConsumer를 객체 생성할 때 반드시 messageService가 필요하니 ref에 messageService(id값)을 적어준다.
이 방법은 제어의 역전(IOC)이다.
5. DiMain 클래스 생성
- 기존에 중간 관리자에서 읽었던 app-context.xml을 여기에서(main) 읽어줘야 한다.
- main클래스에서 실행
javapackage com.exe.springdi4; import org.springframework.context.support.GenericXmlApplicationContext; public class DiMain { //main 클래스 : 실행 public static void main(String[] args) { GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml"); ServiceConsumer sc = (ServiceConsumer)context.getBean("serviceConsumer"); sc.consumerService(); } }

6. 실행 결과

2. 메서드를 이용한 의존성 주입(DI)
1. JobService 인터페이스 생성
javapackage com.exe.springdi4; //인터페이스 public interface JobService { public void getJob(); }
2. MyJobService 클래스 생성
- JobService 인터페이스를 구현한 클래스
- 인터페이스를 상속받아서 메서드 작성
javapackage com.exe.springdi4; //JobService 인터페이스를 구현한 클래스 public class MyJobService implements JobService { public void getJob() { System.out.println("나는 백엔드 개발자입니다!"); } }
3. ServiceConsumer 클래스 작성 (중간 관리자 역할)
- 중간에서 값을 받아서 Main클래스한테 넘겨주는 역할
- 위에서 만든 ServiceConsumer에 추가로 작성해주면 된다.
- MyJobService 클래스의 getJob() 메서드에 출력 기능을 넣어줘서 호출만 하면 된다.
javapackage com.exe.springdi4; public class ServiceConsumer { MessageService ms; //생성자를 통한 의존성 주입 JobService js;// 메서드를 통한 의존성 주입 //의존성 주입(DI) - 생성자를 통한 public ServiceConsumer(MessageService ms) { this.ms = ms; } //의존성 주입(DI) - 메서드를 통한 public void setJobService(JobService js) { this.js = js; } public void consumerService() { //반환값은 String String message = ms.getMessage(); System.out.println(message); //애는 자체적으로 출력을 갖고있어서 호출만 해면 나옴 js.getJob(); } }
4. app-context.xml 작성
- autowire="byName" : property를 작성하지 않아도 이름이 동일하면 자동으로 넘어간다.
html<bean id="serviceConsumer" class="com.exe.springdi4.ServiceConsumer" autowire="byName"> <!-- autowire는 자동으로 연결해준다는뜻 --> <constructor-arg ref="messageService"/> <!-- 생성자로 의존성주입 --> <!-- <property name="jobService" ref="jobService"/> 메서드로 의존성주입 --> </bean> <bean id="messageService" class="com.exe.springdi4.MyMessageService"/> <bean id="jobService" class="com.exe.springdi4.MyJobService"/>
autowire="byName"를 사용하면 위의 주석 처리된 property를 작성하지 않아도 이름이 동일하면
자동으로 넘어간다.
5. DiMain 클래스 작성
- 기존에 중간 관리자에서 읽었던 app-context.xml을 여기에서(main) 읽어줘야 한다.
- main클래스에서 실행
- 위에서 만든 DiMain 클래스와 같음. 변동사항 x
javapackage com.exe.springdi4; import org.springframework.context.support.GenericXmlApplicationContext; public class DiMain { //main 클래스 : 실행 public static void main(String[] args) { GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml"); ServiceConsumer sc = (ServiceConsumer)context.getBean("serviceConsumer"); sc.consumerService(); } }
실행 결과

"안녕 방가방가!!"는 생성자를 이용한 의존성 주입 출력 결과이다.
"나는 백엔드 개발자입니다!"는 메서드를 이용한 의존성 주입 출력 결과이다.
이번 예제와 더 많은 예제는 Github링크 참고
https://github.com/chaehyuenwoo/Spring/tree/main/SpringDI
GitHub - chaehyuenwoo/Spring: Spring Framework
Spring Framework. Contribute to chaehyuenwoo/Spring development by creating an account on GitHub.
github.com
어노테이션을 이용한 의존성 주입 예제는 위의 GitHub - SpringDI2 프로젝트 참고
https://github.com/chaehyuenwoo/Spring/tree/main/SpringDI2
GitHub - chaehyuenwoo/Spring: Spring Framework
Spring Framework. Contribute to chaehyuenwoo/Spring development by creating an account on GitHub.
github.com
블로그의 정보
무작정 개발
무작정 개발