00. Auto-Wiring란?

 

· 스프링(Spring)에서 인터페이스(Interface)는 일반적인 자바 프로그래밍에서와 마찬가지로 사용됩니다. 인터페이스는 클래스가 구현해야 하는 메서드의 명세(specification)를 정의하는 추상화된 형태입니다.

스프링에서 인터페이스는 다음과 같은 목적으로 사용될 수 있습니다:

 

    1. 의존성 역전(Dependency Inversion): 스프링은 빈(Bean) 간의 의존성을 주입할 때 인터페이스를 활용하여 의존성을 느슨하게 결합합니다. 이를 통해 의존 객체를 변경하거나 대체할 때 유연성을 제공합니다.

    2. 빈의 유연한 교체: 인터페이스를 사용하면 여러 구현체를 가질 수 있으므로 빈의 교체가 쉽습니다. 스프링 컨테이너를 통해 인터페이스를 구현한 여러 클래스 중 하나를 선택하여 빈을 주입할 수 있습니다.

    3. 테스트 용이성: 인터페이스를 사용하면 테스트할 때 모의(Mock) 객체를 사용하여 더욱 쉽게 테스트할 수 있습니다. 인터페이스 를 구현한 모의 객체를 사용하여 특정 메서드의 동작을 가로채거나 특정 결과를 반환하도록 설정할 수 있습니다.

    4. 다형성(Polymorphism): 인터페이스를 사용하면 다형성을 활용하여 여러 클래스를 하나의 인터페이스로 처리할 수 있습니다. 이를 통해 코드의 유연성과 확장성을 높일 수 있습니다.

 

인터페이스는 클래스의 구현을 강제하고, 클래스 간의 결합도를 낮추며, 코드를 유연하고 확장 가능하게 만드는 데 사용됩니다. 스프링에서는 이러한 인터페이스의 장점을 최대한 활용하여 빈을 관리하고 의존성을 주입합니다.

 

 

(출처-ChatGPT)

 

 

 

01. 인터페이스 주입

 

 

 

 

02. 프로젝트 만들기

가. 구현 방법 (전체구성)

사용

pakages : com.kitri.spring.interfaces

class : OrderDAO.java

             OrderDaoImpI.java

             OrderSvc.java

             OrderSvcImpI.java

             Test.java

xml : config.xml

 

 

 

 

 

 

 

나. 구현 코드(전체코드)

 

OrderDAO. java

 

package com.kitri.spring.interfaces;

public interface OrderDAO {
	void createOrder();
}

 

이 코드는 createOrder()메서드를 호출합니다.

 

 

 

 

OrderDaoImpI. java

 

package com.kitri.spring.interfaces;

import com.kitri.spring.interfaces.OrderDAO;

public class OrderDaoImpI implements OrderDAO {

	@Override
	public void createOrder() {
		System.out.println("Inside Order DAO");
	}
}

 

createOrder()메서드가 호출되면 "Inside Order DAO"가 출력됩니다.

 

 

 

OrderSvc. java

 

package com.kitri.spring.interfaces;

public interface OrderSvc {
	void placeOrder();
}

 

이 코드는 placeOrder()메서드를 호출합니다.

 

 

 

 

OrderSvcImpI. java

 

 

package com.kitri.spring.interfaces;

import com.kitri.spring.interfaces.OrderDAO;
import com.kitri.spring.interfaces.OrderSvc;

public class OrderSvcImpI implements OrderSvc {

	private OrderDAO dao;
	
	@Override
	public void placeOrder() {
		System.out.println("Inside Order SVC");
		dao.createOrder();
	}

	public OrderDAO getDao() {
		return dao;
	}

	public void setDao(OrderDAO dao) {
		this.dao = dao;
	}
}

 

이 코드는 placeOrder() 가호출되면 "Inside Order SVC"가 출력됩니다. 그 후, dao 패키지의 createOrder()메서드를 호출합니다. get,setDao를 이용해서 이 패키지 안에서는 Order dao = dao 로 정의됩ㄴ디.

 

여기서 implementssms OrderSvc에서 선언된 모든 메서드 를 실행해야한 하는것을 의미합니다.

 

 

 

 

Test . java

 

package com.kitri.spring.interfaces;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	private static ClassPathXmlApplicationContext ctx;
	
	public static void main(String[] args) {
		// 스프링 컨테이너 생성
		ctx = new ClassPathXmlApplicationContext(
			"classpath:config.xml");
		
		// 빈 객체 이용
		OrderSvc orderSvc = 
			(OrderSvc)ctx.getBean("svc");
		orderSvc.placeOrder();
		
		// 스프링 컨테이너 소멸
		ctx.close();
	}
}

 

이 코드는 스프링(Spring) 애플리케이션에서 ClassPathXmlApplicationContext를 사용하여 스프링 컨테이너를 생성하고, 설정 파일인 config.xml을 로드합니다.

 

 

ctx.getBean("svc")를 호출하여 이름이 "svc"인 빈을 가져옵니다. 이 빈은 OrderSvc 타입으로 캐스팅하여 orderSvc 변수에 할당됩니다. 그 후에 orderSvc.placeOrder() 메서드를 호출하여 주문을 처리합니다.

 

 

 

config.xml

 

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
	<bean name="dao" class="com.kitri.interfaces.OrderDaoImpI" />
	<bean name="svc" class="com.kitri.interfaces.OrderSvcImpI"
		p:dao-ref="dao" />
</beans>

 

  • 첫 번째 빈(dao): OrderDaoImpl 클래스를 인스턴스화하여 dao라는 이름으로 등록합니다.
  • 두 번째 빈(svc): OrderSvcImpl 클래스를 인스턴스화하여 svc라는 이름으로 등록합니다. p:dao-ref 속성을 통해 dao 빈을 참조하도록 설정합니다. 이는 의존성 주입을 의미하며, OrderSvcImpl 클래스 내에서 OrderDao 인터페이스의 구현체에 대한 의존성을 자동으로 주입받게 됩니다.

 

 

출력결과

 

 

 

 

 

+  새롭게 알아낸 사실~~~

스프링은 빈들을 생성하고 등록할 때 빈 간의 의존성을 해결하기 위해 의존성 주입(Dependency Injection)을 수행합니다.

 

여기서 svc bean은 dao bean에 대한 의존성을 가지고 있습니다.

스프링은 bean 을 생성할 때 이러한 의존성을 자동으로 해결하기 위해 먼저 svc bean 을 생성하고, svc bean 이 필요로 하는 dao bean 을 주입합니다.

 

따라서 출력 결과에서 svc bean 이 먼저 나오는 것은 의존성 주입의 순서에 따른 것입니다. 스프링은 의존성 주입을 수행하기 위해 먼저 의존하는 bean  을 생성하고, 그 다음에 의존성이 있는  bean 을 생성합니다.

 
 
 
 
2024. 4. 22. 13:50