티스토리 뷰
스프링 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 상에서 확인을 해볼 수가 있다.
소스코드 참고
'프로그래밍 > Spring Framework' 카테고리의 다른 글
스프링 프레임워크 컨테이너(IOC) (0) | 2018.04.07 |
---|---|
스프링 프레임워크란? (0) | 2018.04.07 |