본문 바로가기

스프링 부트

스프링부트(Spring boot) 구현하는 DI 프로젝트 - Spring DI 개념

스프링 부트 프로젝트로 간단하게 DI개념에 대해서배워보겠습니다.

 

해당 프로젝트는 가장 빨리 만나는 스프링 부트 서적 예제소스 입니다.

해당 책은 굉장히 얇고 보기 쉽게 되어있습니다.

 

한권사셔서 읽어보심을 추천드립니다.

 

스프링 프레임워크(SpringFrameWork) DI란 무엇인가? 

 

DI란 의존성 주입(Dependency injecion)의 줄임말이며 IOC/DI 스프링프레임워크의 핵심 기술입니다.

 

IOC와 DI를 분리해서 생각하지 마시고 DI를 IOC 한개념으로 보시면 됩니다.

 

IOC = DL (Dependency Lookup) 의존성 검색 + DI(Dependency injecion) 의존성 주입 

 

DI를 사용하면 클래스 간의 의존 관계를 자동으로 구성할 수 있습니다.

 

DI 컨테이너 (보통 컨테이너라고..) 는 인스턴스를 관리하는데 인스턴스를 생성하고 그 인스턴스에 필요한 인스턴스를 설정하여 반환하여 줍니다.

 

 

다음과 같은 DI의 이점이 있습니다.

 

1. DI를 사용하게 되면 애플리케이션 안에 있는 객체 사이의 의존관계가 느슨해집니다.

--> 의존관계가 느슨해지면 유지보수시에 도움이 됩니다.

 


 

▼ 변경 전 소스 (Console에서 값을 입력하면 Scanner 객체로 값을 입력받아 덧셈해주는 간단한 프로그램)


public class App {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

System.out.println("Enter 2 numbers like 'a b ' :");

int a = input.nextInt(); // 첫번째 입력값

int b = input.nextInt(); // 두번째 입력값

Calculator calculator = new AddCalculator(); 

int result = calculator.calc(a,b);

System.out.println("result =" + result);

}

}

 

 ▼ 변경 후 소스 (Frontend 소스를 생성하여 인자값 받는부분과 계산로직을 외부(frontend)로 뺀후 App Class는 호출만함)


App Class

@ComponentScan

public class App  {


public static void main(String[] args) {

try(ConfigurableApplicationContext context = 

SpringApplication.run(App.class, args); //@EnableAutoConfiguration 붙인 클래스 지정하여 @Import 로 Config 파일 찾기 

){

Frontend frontend = context.getBean(Frontend.class);

frontend.run();

}

}


}


Frontend Class 생성

@Component

public class Frontend {

@Autowired//-> DI 컨테이너가 argumentResolver 필드에 맞는 객체를 자동으로 찾아줌

ArgumentResolver argumentResolver;

@Autowired

Calculator calculator;

/*

 * 계산 작업 수행

 * */

public void run() {

System.out.println("Enter 2 numbers like 'a b' :");

Argument argument = argumentResolver.resolve(System.in);  // 인자 받는부분

int result = calculator.calc(argument.getA(), argument.getB()); // 계산로직

System.out.println("result =" + result);

}


상세로직 : 깃허브 주소


2.  인스턴스 스코프를 제어가 가능하다. (스프링은 보통 싱글톤인데 싱글톤으로 생성할지 매번 새로운 객체를 생성할지 에 대한 제어가 가능하다.)

 

3. 인스턴스 생성할때와 소멸할때를 이벤트처리로 제어할 수 있다.

 

4. 공통 처리를 포함할 수 있다. (ex) 로깅, 트랜잭션, 보안)

 


소스 출처 : 가장 빨리 만나는 스프링 부트 서적 참고하여 만든 소스