티스토리 뷰

스프링 DI (Dependency Injection)


DI 는 Spring에서 새롭게 지원하는 IoC의 한 형태로서 각 계층의 사이, 각 Class 사이에 필요로 하는 의존관계가 있다면

이를 컨테이너에 자동적으로 연결시켜주는 것으로 각 Class 사이의 의존관계를 Bean 설정정보를 바탕으로 컨테이너가 자동적으로

연결해 주는 것을 의미합니다.


DI는 Dependency Injection의 약자로서, '의존 주입' 이라는 단어로 번역된다.

스프링은 기본적으로 DI를 기반으로 동작하기 때문에, 스프링을 잘 사용하려면 DI에 대한 이해가 필수적이다.


※ Dependency


DI는 의존에 대한 설계 패턴이므로 소프트웨어를 개발할 때, 단 한개의 클래스에 모든 코드를 몰아 넣는 경우는 없다.

아래 코드와 같이 FilePrint 클래스와 FileEncryptor 클래스에서는 의존하는 타입의 객체를 직접 사용하고 있다.


//FilePrint 클래스
public class FilePrint {
	public void print(String FilePath) throws IOException{

//의존하는 타입의 객체를 직접 생성

try(BufferReader br = new BufferedReader(new FileReader(filePath)))

String line = null;

}

}...

// FileEnCryptor 클래스

public class FileEncryptor{

private Encryptor encryptor = new Encryptor();

}...



DI 를 사용하는 방식의 코드는 의존 객체를 외부에서 조립한다는 것이다.

의존 객체를 직접생성하는 방식과 달리 의존객체를 외부로부터 전달받는 구현 방식이다.


public Class FileEncryptor{

	private Encryptor encryptor;

	public FileEncryptor(Encryptor encryptor){

			//생성자로 전달받은 객체를 필드에 할당

			this.encryptor = encryptor;

			}

	public void encrypt(File src,File target) throws IOException{

			...

			//DI 방식으로 전달받은 객체를 사용

			encryptor.encrypt(data,0,len);

			}

}



또 다른 간단한 예제를 들어보겠습니다.


스프링 컨테이너는 base-package 의 클래스를 검색해서 자동으로 자바 빈으로 등록한다.

이에 해당하는 것이 @Component / @Repository / @Service / @Controller / @RestController 등의 어노테이션으로 나뉜다.


자동스캔을 하기 위해서는 xml 파일에서 <context:component-scan base-package="패키지경로"/> 로 설정할 수 있다.


@Component


일반적인 용도의 컴포넌트들을 표시하는 기본 스테레오 타입, 멤버변수 와 getter, setter만 가지고 있는 DTO 같은 컴포넌트를 가리킨다. 

스프링이 @Component 붙은 자바 클래스를 클래스패스 경로에서 자동 으로 찾아 Application Context안에 이름을 부여하여 빈으로 등록한다.


@Service

비즈니스 로직을 담고 있는 서비스 레이어의 서비스 컴포넌트를 가리키며 @Component 어노테이션과 동작은 같지만, 서비스 계층의 클래스들은 @Service 어노테이션을 부여하는 것이 코드 가독성 면에서 좋다.

기본적으로 @Serivce와 @Component 를 사용하여 Main 상에서 확인을 해볼 수가 있다.







소스코드 참고 


springDI_Componet.zip


springDI_ex.zip



'프로그래밍 > Spring Framework' 카테고리의 다른 글

스프링 프레임워크 컨테이너(IOC)  (0) 2018.04.07
스프링 프레임워크란?  (0) 2018.04.07
댓글
공지사항
글 보관함
최근에 올라온 글
최근에 달린 댓글