글을 읽기에 앞서 DI의 개념이 아직 잘 잡히지 않았다면 아래 링크 참조.
https://swdevelopment.tistory.com/272
!이 글은 Lombok과 spring-test 라이브러리를 활용하여 DI를 테스트한다.
DI를 하기전 먼저해야할 것이있다. 바로 DI 설정이다. 스프링은 클래스에서 객체를 생성하고 객체들의 의존성에 대한 처리 작업까지 내부에서 모든 것이 처리된다. 스프링에서 관리되는 객체를 흔히 'Bean'이라고 하며, 이에 대한 설정은 크게 XML 방식과 JAVA 방식이 있다. 두 가지 방법이 어떻게 처리되는지 아래에서 살펴보자.
XML로 DI 설정하기
1. 'root-context.xml' 파일로 이동하여 아래쪽에 위치하는 'NameSpaces' 탭을 클릭하고 'context' 항목 체크
2. 'Source' 탭을 클릭하고 아래 코드 추가하고 저장하면 끝
<context:component-scan base-package="org.zerock.sample">
</context:component-scan>
'Bean Graph' 탭을 클릭하여 아래 이미지처럼 'Service'와 'Repository'가 보여지면 객체 설정이 정상적으로 된것이다.
자바로 DI 설정하기
자바로 DI 설정은 간단하다. 아래 코드처럼 작성하면 끝
package org.zerock.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages={"org.zerock.sample"})
public class RootConfig {
}
이렇게 DI 설정을 마쳤으니 본론으로 들어가보자.
DI 구현
스프링 레거시에서는 DI를 구현하는 방법이 크게 2가지가 있다.
- setter메서드를 이용한 DI
- 생성자를 이용한 DI
setter메서드를 이용한 DI 예제
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Repository {
}
우선 주입할 클래스를 위 코드처럼 작성한다. 코드를 보면 @Component 어노테이션과 Lombok이 가지고 있는 @Data 어노테이션이 보이는데, @Component 어노테이션은 해당 클래스를 스프링에서 객체로 만들어서 관리하는 대상임을 명시하고, @Data 어노테이션은 setter를 생성하는 기능과 생성자, toString() 등을 자동으로 생성해주는 것이다.
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.Setter;
@Component
@Data
public class Service {
@Setter(onMethod_ = @Autowired)
private Repository repository;
}
위 코드는 주입 받는 클래스에 작성된 코드이다. 위 코드의 의미는 Service라는 객체가 Repository타입의 객체를 필요로 한다는 것이다. @Setter 어노테이션이 할당된 repository변수는 컴파일시 자동으로 setRepository()가 생성되며, @Setter에서 사용된 onMethod 속성은 생성되는 setRepository()에 @Autowired 어노테이션을 추가하도록 한다. 이렇게 구성된 코드가 DI, 즉 의존성 주입이되는 것이다.
생성자를 이용한 DI
생성자를 활용하는 DI는 두 가지 방식이 있으며 예제는 다음과 같다.
-첫번째 방법-
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
public class Service {
private Repository repository;
public Service(Repository repository) {
this.repository = repository;
}
}
-두번째 방법-
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
@AllArgsConstructor
public class Service {
private Repository repository;
public Service(Repository repository) {
this.repository = repository;
}
}
여러 개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면 아래와 같은 방법들도 있다.
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
@RequiredArgsConstructor
public class Service {
@NonNUll
private Repository repository;
}
or
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.ToString;
@Component
@ToString
@Getter
@RequiredArgsConstructor
public class Service {
private final Repository repository;
}
DI가 스프링의 실행과 함께 구현되는 과정
- 스프링 프레임워크가 시작되면 먼저 스프링이 사용하는 메모리 영역을 만들게 되고, 이를 컨텍스트라고 한다. 스프링에서는 ApplicationContext라는 이름의 객체가 만들어진다.
- 스프링은 자신이 객체를 생성하고 관리해야 하는 객체들에 대한 설정이 필요하다. 이에 대한 설정은 root-context.xml파일이 한다. (참고 : 어노테이션 등을 이용해 객체를 생성하고 관리하는 것을 컨테이너 또는 팩토리가 한다.
- root-context.xml에 설정되어 있는 <context:component-scan>태그의 내용을 통해서 설정한 패키지를 스캔하기 시작한다.
- 해당 패키지에 있는 클래스들 중에서 스프링이 사용하는 @Component라는 어노테이션이 존재하는 클래스의 인스턴스를 생성한다.
- 주입받는 객체는 주입하는 객체가 필요하다는 @Autowired 어노테이션 설정이 있으므로, 스프링은 주입하는 객체의 레퍼런스를 주입받는 객체에 주입한다.
'Spring > Spring Legacy' 카테고리의 다른 글
Spring Legacy / MyBatis 연동 및 사용하기 (1) | 2020.09.23 |
---|---|
Spring Legacy / DBCP 설정하기 (0) | 2020.09.15 |
Spring Legacy / JDBC 연결 테스트하기 (0) | 2020.07.30 |
Spring Legacy / 단위 테스트하는 방법 (0) | 2020.07.29 |
Spring Legacy / 자바파일로 스프링 관련 설정하기 (0) | 2020.07.23 |