DI (Dependency Injection)
스프링에 들어가기 앞서, 스프링의 기본 원리인 DI에 대해 살펴보자.
보통 클래스로부터 객체 생성, 이때 이 객체(X)가 여러 객체(Y, Z)에 의존관계가 있을때 (Y, Z 객체를 사용할 때)
1) 객체 X가 필요할 때 직접 Y, Z를 생성
2) 외부에서 객체 Y, Z를 생성하고 X객체에서 사용
이때 2번처럼 외부에서 객체를 생성해 넣는 것을 주입(Injection)이라 한다.
따라서 의존성을 주입한다 해서 DI(Dependency Injection)인 것이다.
이런 DI의 장점은 다음과 같다
- 재사용성 증가
- 코드 읽기 쉬움, 단순화
- 더 많은 테스트 코드
- 종속성 감소 (엮인 관계가 적음 -> 변경시 조금만 바꾸면 됨)
[활용예시 1. setter]
class X{
Y y;
public void sety(Y y){
this.y = y
}
}
[활용예시 2. 생성자]
class X{
Y y;
public X(Y y){
this.y = y;
}
}
이때 주입하는 객체들을(Y, Z...) 부품이라 생각하면, 부품들을 정의해놓은 것이 IOC 컨테이너라 할 수 있다.
스프링에서는 이 객체를 주입하는 외부, IOC 컨테이너를 사용하여 이러한 원리를 바탕으로 프로그래밍한다.
DI 실습 (XML 사용)
예시를 통해서 살펴보자. 일단 Example 클래스를 정의한다.
public class Example {
public String name;
public Example(String name){
System.out.println("객체 생성");
this.name = name;
}
public void setName(String name){
this.name = name;
}
public void printName(){
System.out.println("객체의 이름은 : " +name);
}
}
이제 XML 파일을 사용하여 클래스들을 내부에 정의해준다.
위치는 src/resources에 만들어준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id ="example" class="com.birdmissile.demo.Example"> <!-- 변수설정-->
<property name="name" value="example name"/> <!--필드설정-->
</bean>
</beans>
이제 실제로 main 메소드를 실행하여 클래스를 사용해주자.
public static void main(String[] args) {
String location = "classpath:appCTX.xml"; //xml 파일의 위치
//xml을 parsing해주는 클래스
AbstractApplicationContext context = new GenericXmlApplicationContext(location);
//getBean으로 받아오기
Example ex = context.getBean("example", Example.class);
ex.printName();
context.close();
}
이때 자바 이외 파일들의 경로에서 classpath: ~ 를 많이 사용한다.
classpath란 컴파일된 class 파일들의 위치 경로이다. 한마디로, 컴파일된 파일의 경로를 달라는 뜻이다.
.classpath에 그 내용이 저장되어 있어서, 기본적으로 target/classes에 저장되는것을 확인할 수 있다.
예로 아래의 경우 src/main/java의 파일을(src) target/classes 로 컴파일한다는 것을 확인할 수 있다
추가적인 프로퍼티 설정 예시들은 다음과 같다. [언제나 클래스에 setter가 정의되어 있어야 한다!!!!!!!]
<bean id ="anotherclass" class="com.birdmissile.demo.AnotherClass"/>
<bean id ="example" class="com.birdmissile.demo.Example"> <!-- 변수설정-->
<property name="name" value="example name"/> <!--필드설정-->
<property name ="anotherclass"> <!--다른 빈 객체 사용-->
<ref bean = "anotherclass"/> <!--물론 위에처럼 미리 정의되어있어야 함-->
</property>
<property name ="lists"> <!--리스트 사용-->
<list>
<value>리스트1</value> <!--스프링이 알아서 자료형으로 변환해줌-->
<value>리스트2</value>
</list>
</property>
</bean>
프로퍼티를 설정할 때 생성자가 정의되어 있으면 이런 방식으로 사용할 수 있다.
<bean id ="example" class="com.birdmissile.demo.Example">
<constructor-arg> <!--순서는 매개변수 순서이다.-->
<value>새 이름</value>
</constructor-arg>
</bean>
DI 실습 (JAVA 사용)
JAVA를 사용하여 DI설정 역시 가능하다. 이런 식으로 클래스를 정의한 다음
@Configuration //스프링 설정에 사용한다고 명시해야함.
public class AppConfig {
@Bean
public Example example2(){
Example example2 = new Example();
example2.setName("example name2");
return example2;
}
}
사용시에 GenericXml이 아닌, AnnotationConfig클래스를 이용하면 된다.
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
XML과 JAVA를 함께 쓰고 싶으면 아래와 같이 할 수 있다.
1) XML 파일에 JAVA 파일을 포함시키기 -> 이후 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--context추가-->
<context:annotation-config />
<bean class = "com.birdmissile.demo.AppConfig"/>
2) JAVA 파일에 XML 파일을 포함시키기 -> 이후 JAVA로 사용
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(value = {"classpath:appCTX.xml"})
'코딩 > 스프링 [JAVA]' 카테고리의 다른 글
Spring MVC [Controller, servlet-context, eclipse] (1) | 2021.01.12 |
---|---|
AOP (Aspect Oriented Programming) [Spring] (0) | 2021.01.11 |
외부 환경 파일 설정 (Environment, Property)[Spring] (0) | 2021.01.08 |
컨테이너 생명 주기 [Spring] (0) | 2021.01.08 |
VS Code로 Spring 시작하기 (0) | 2021.01.02 |
Comment