너와 나의 프로그래밍

Spring Framework - 의존성 주입 방식 본문

Back-End/Spring Framework

Spring Framework - 의존성 주입 방식

Whatever App's 2020. 7. 8. 23:43

 

 

 

 

[Spring] 의존성 주입 방식

 

 

 

스프링 프레임워크의 핵심인 IoC를 이해했다면 그 다음 당연히 알아야 될 특징이 '의존성 주입'의 대해서다.

 

 

IoC의 핵심원리는 '객체의 생성과 의존관계를 컨테이너가 자동으로 관리'해주는 점이기 때문이다.

 

 

여기서 의존 관계란 '객체와 객체의 결합 관계'를 이야기 한다.

 

 

즉, 하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면 객체에 대한 객체 생성과 생성된 객체의 레퍼런스 정보가 필요하다.

 

 

스프링의 IoC는 두 가지로 나뉜다.

 

  • Dependency Lookup : 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 Lookup(검색)하여 사용하는 방식(실제 개발에서는 사용하지 않음)
  • Dependency Injection : 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해주는 방식(실제 개발에서 사용 함)

 

그 중 Dependency Injection은 'Setter Injection'과 'Constructor Injection'으로 나뉜다.

 

Constructor Injection

생성자(Constructor) 기반으로 하는 방식

 

스프링 컨테이너는 XML 설정 파일에 등록된 클래스를 찾아서 객체를 생성할 때 기본적으로 매개 변수가 없는 생성자를 호출한다.

 

하지만 기본 생성자가 아닌 매개 변수를 담고 있는 다른 생성자를 호출 할 수도 있는데, 이때 '생성자 인젝션'을 사용할 수 있다.

 

 

생성자를 생성한 클래스 안에 기본 생성자를 선언하고, Engine이라는 객체를 선언한 뒤 Engine 매개 변수를 가지는 생성자를 재 선언한다.

 

 

Hyundai 클래스에서 사용할 EngineStart, EngineStop 메소드를 선언해 준다.

 

 

생성자 인젝션을 위해서 Hyundai 클래스 <bean> 등록 설정에서 시작과 끝 태그 안에 <constructor-arg> 엘리먼트를 추가한다.
생성자 인자로 전달할 객체의 아이디를 ref 속성에 추가만 해주면 된다.

 

 

Main Method를 생성 후 결과를 확인 할 수 있다. 스프링 컨테이너는 기본적으로 bean으로 등록된 순서대로 객체를 생성하며, 모든 객체는 '기본(default) 생성자' 호출을 원칙으로 한다.

하지만 Hyundai의 생성자가 먼저 호출을 한 것이 아닌 Engine을 매개변수로 갖고 있는 생성자를 먼저 호출을 했다는 것을 알고 있다. 

 

 

Setter Injection

Setter 메소드를 기반으로 하는 방식

생성자 인젝션은 말 그래도 Setter를 사용하여 의존성 주입을 처리하는 방식이다. 보통 Setter 메소드가 제공되지 않는 클래스는 '생성자 클래스'를 사용하지만 대부분 Setter 인젝션을 사용한다.
 

 

생성자를 생성한 클래스 안에 기본 생성자를 선언하고, Engine이라는 객체를 선언한 뒤 engine의 Setter 메소드를 생성한다.

Setter 메소드는 스프링 컨테이너가 자동으로 호출하며, 호출하는 시점은 <bean> 객체 생성 직후다. Setter 인젝션은 '기본 생성자'도 반드시 필요하다.

 

 

Kia 클래스에서 사용할 EngineStart, EngineStop 메소드를 선언해 준다.

 

 

Setter 인젝션을 사용하려면 <property> 엘리먼트를 사용해야 하며 name 속성값이 호출하고자 하는 메소드 이름이다. 즉 engine이면 호출되는 메소드는 'setEngine()'다. 변수 이름에서 첫 글자를 대문자로 바꾸고 앞에 'set'을 붙인 것이 호출할 메소드 이름이 된다.

 

 

Setter 인젝션을 사용한 결과다. 생성자 인젝션과 다른 점은 '기본 메소드'를 그대로 쓸 수 있다는 점. 다른 점은 생성자 인젝션과 같은 결과 값을 보여준다.

 

 

 

 

 

 

 

참조 : 스프링 퀵 스타트

 

 

반응형