무작정 개발.Vlog

[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 인터페이스 생성

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();

	}
}

생성자를 이용한 의존성 주입(DI)
생성자를 이용한 의존성 주입(DI)

 

6. 실행 결과

생성자를 이용한 의존성 주입 main 클래스 실행 결과
생성자를 이용한 의존성 주입 main 클래스 실행 결과


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();

	}
}

 

실행 결과

main 클래스 실행 결과
main 클래스 실행 결과

 


"안녕 방가방가!!"는 생성자를 이용한 의존성 주입 출력 결과이다.

"나는 백엔드 개발자입니다!"는 메서드를 이용한 의존성 주입 출력 결과이다.


이번 예제와 더 많은 예제는 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

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기