[Spring 3.0] 의존성 주입(DI) - 수동
by 무작정 개발2022.03.24(63일 차)
이번에는 spring2.5에서 배웠던 의존성 주입, 제어의 역전에 대해 다시 한번 정리할 것이다.
생성자, 메서드를 사용한 의존성 주입(DI)에 대해 예제를 통해 알아보자.
의존성 주입을 할 때 Annotation(어노테이션)을 사용하면 자동으로 의존성 주입을 해주지만
동작 원리 및 흐름을 알기 위해 생성자, 메서드를 사용해 수동으로 의존성 주입을 할 것이다.
Annotation(어노테이션)에 관한 자료는 이전 글 참고
https://backendcode.tistory.com/106
오늘의 수업 내용
1. 생성자를 이용한 의존성(DI) 주입
1. MessageService 인터페이스 생성
package com.exe.springdi4;
public interface MessageService {
public String getMessage();
}
2. MyMessageService 클래스 생성
- MessageService인터페이스를 구현한 클래스이다.
- 인터페이스를 상속받아 메서드 작성
package com.exe.springdi4;
//MessageService 인터페이스를 구현한 클래스
public class MyMessageService implements MessageService {
public String getMessage() {
return "안녕 방가방가!!";
}
}
3. ServiceConsumer 클래스 생성 (중간 관리자 역할)
- 중간에서 값을 받아서 Main클래스한테 넘겨주는 역할
package 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 작성
<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클래스에서 실행
package 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 인터페이스 생성
package com.exe.springdi4;
//인터페이스
public interface JobService {
public void getJob();
}
2. MyJobService 클래스 생성
- JobService 인터페이스를 구현한 클래스
- 인터페이스를 상속받아서 메서드 작성
package com.exe.springdi4;
//JobService 인터페이스를 구현한 클래스
public class MyJobService implements JobService {
public void getJob() {
System.out.println("나는 백엔드 개발자입니다!");
}
}
3. ServiceConsumer 클래스 작성 (중간 관리자 역할)
- 중간에서 값을 받아서 Main클래스한테 넘겨주는 역할
- 위에서 만든 ServiceConsumer에 추가로 작성해주면 된다.
- MyJobService 클래스의 getJob() 메서드에 출력 기능을 넣어줘서 호출만 하면 된다.
package 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를 작성하지 않아도 이름이 동일하면 자동으로 넘어간다.
<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
package 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 - SpringDI2 프로젝트 참고
https://github.com/chaehyuenwoo/Spring/tree/main/SpringDI2
'Back-End > Spring Legacy' 카테고리의 다른 글
[Spring 3.0] 스프링JDBC (0) | 2022.03.26 |
---|---|
[Spring 3.0] Maven Repository(메이븐), Java의 JDBC (0) | 2022.03.26 |
STS 3 설치 및 세팅 핵심 정리 - Spring3.0 시작! (0) | 2022.03.24 |
[Spring 2.5] 게시판 CRUD 만들기 (0) | 2022.03.23 |
[Spring 2.5] Annotation (어노테이션) (0) | 2022.03.23 |
블로그의 정보
무작정 개발
무작정 개발