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 을 생성합니다.
'Spring' 카테고리의 다른 글
07. Spring - ★JDBCTemplate 연동(응용)★ (0) | 2024.04.24 |
---|---|
06. Spring - ★JDBCTemplate 연동★ (0) | 2024.04.23 |
04. Spring- Auto Wiring(@Autowiring, @Qualifier) (2) | 2024.04.19 |
03. Spring- Properties (3) | 2024.04.18 |
02. Spring- 스프링코어기본 - 세터주입(Maven Project) (0) | 2024.04.17 |