본문 바로가기

🌈 백엔드/스프링 프레임워크

스프링_DI 의존성 주입

반응형
SMALL

 

 

[1] 의존성 주입 : DI (Dependency Injection)


(1) DI 정의 

Spring은 의존성 주입을 도와주는 DI 컨테이너이다 

어떤 객체A가 필요한 객체B를 외부에 있는 ApplicationContext가 밀어 넣는다 

무슨 목적으로 외부에서 필요한 객체를 밀어넣는것인가 

외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴 이다 

의존성은 한 객체가 다른 객체를 사용할때 표현한다

 

 

(3) DI의 목적 

클래스 들 간의 강하게 결합된 관계가 맺어지는 것을 피하기 위해서

상속은 제약이 많고 확장성이 떨어지기 때문에 

다형성을 효율적으로 사용하기 위해서 

두 객체 간의 관계라는 관심사의 분리 

두 객체 간의 결합도를 낮춘다

객체의 유연성을 높인다

테스트 작성을 용이하게 한다 

 

(4) DI 의존성 주입하는 방법 

  1. 생성자 주입 Constructor Injection
  2. 수정자 주입 Setter Injection 
  3. 필드 주입 Field Injection 
  4. 일반 메소드 주입 Method Injection 

 

(5) DI 설정방식

① XML 설정방식

src > main > webapp > WEB-INF > spring > root-context.xml 

Bean 객체를 설정하는 설정파일

 

 

기본형

<?xml version="1.0" encoding="UTF-8"?>
<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"
	   xsi:schemaLocation="
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Root Context: defines shared resources visible to all other web components -->

	<context:component-scan base-package="com.fastcampus.ch3">
	</context:component-scan>
</beans>

 

pom.xml 은 라이브러리 설정한 설정파일 

 

 

 

 

② 어노테이션 설정방식

@ComponentScan 어노테이션 등을 사용한다

 

③ JAVA 설정방식

XML 설정파일인 root-context.xml 대신 RootConfig클래스를 사용한다 

 

RootConfig.java 

 

 

 

 

[2] DI 주입 설정 방법


//예시
레스토랑 Restaurant 객체 A를 만들고 
레스토랑에서 일하는 셰프 Chef 객체 B를 만들어 주입한다

//방법
의존성 주입방법 : setter 수정자 주입방법 
DI설정방식 : XML 설정방식

 

setter 메서드를 사용하기 위해 Lombok 을 사용할것이고

Lombok을 불러오기 위해 pom.xml 설정파일에서 Lombok 라이브러리를 추가하고

Spring-test 라이브러리를 이용하여 테스트한다 

 

① pom.xml 설정파일에서 아래 내용을 추가 및 수정한다 

//스프링 테스트 
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>${org.springframework-version}</version>
	<scope>test</scope>
</dependency>

 

//Lombok 라이브러리 추가
<!-- lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.12</version>
	<scope>provided</scope>
</dependency>

 

// 로그를 남기기 위해 사용한다 Log4j
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>

 

// 테스트 프레임워크 junit 
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

 

 

② 패키지 , 클래스 , 인터페이스 구성 설정한다

 

패키지 : org.zerock.sample

클래스 : Chef.java

클래스 : Restaurant.java 

 

 

Chef 클래스 

@Component , @Data 는 스프링의 어노테이션이다 

 

 

 

Restaurant 클래스

 

 

스프링 프레임워크가 시작한다

스프링이 객체를 만들기 위해 context 컨텍스트라는 메모리 영역을 사용하고 ApplicationContext 객체를 만들었다 

ApplictionContext가 객체 설정파일인 root-context.xml를 읽는다

root-context.xml의 <context:component-scan>태그를 통해 패키지를 스캔한다

Chef, Restaurant 클래스 내용 중 @Component 어노테이션이 있는지 찾아 클래스의 인스턴스를 생성한다 

스프링은 Chef 객체의 레퍼런스를 Restaurant객체에 주입한다 

 

 

 

[3] DI 유지보수 방법 3가지 


(1)  n개  속성을 이용한 유지보수 

car라는 객체 를 생성한다 

타입은 sportsCar 또는 Truck 을 가질수 있고 

작업을 위해 sportsCar 타입으로 new sportsCar로 생성했는데 

타입을 Truck으로 변경해야할 일이 생겼을때

다시 코드를 재작성을 해야한다

SportsCar car = new SportsCar();
    ↓                  ↓
  Truck   car = new Truck();

하지만 Spring을 사용한다면 

Car 라는 클래스 타입 안에 SportsCar와 Truck을 둘다 넣는다면 

Car라는 타입으로 세부 속성만 다른 객체로 교체하면 되기 때문에 

코드 사용이 용이해진다  

Car car = new SportsCar();
                ↓ 
Car car = new Truck();

 

(2) 메서드 이용한  유지보수  

변수1, 변수2 , 변수3 을 Truck 속성을 가진 객체로 생성하였다 

작업 중 SportsCar로 속성을 변경한다고 하면 

다시 각각 설정한다 

Car 변수1 = new Truck();
Car 변수2 = new Truck();
Car 변수3 = new Truck();

         ↓

Car 변수1 = new SportsCar();
Car 변수2 = new SportsCar();
Car 변수3 = new SportsCar();

하지만 Spring을 사용하여 

메소드를 통해 객체를 생성하도록 만들고 

추후 속성이 변경시 메소드 내부 내용만 변경하면된다 

Car 변수1 = getCar();
Car 변수2 = getCar();
Car 변수3 = getCar(); 

static Car getCar() {
	return new Truck();
}
         ↓

static Car getCar() {
	return new SportsCar();
}

 

반응형
LIST

'🌈 백엔드 > 스프링 프레임워크' 카테고리의 다른 글

스프링_ DB 데이터 객체 DAO  (0) 2023.07.20
스프링_테스트_JUnit  (0) 2023.06.28
스프링_DAO + Transaction 트랜잭션  (0) 2023.06.27
스프링_AOP  (0) 2023.06.27
스프링_개념 개요  (0) 2023.04.30