7장. 스프링 삼각형과 설정 정보

7장. 스프링 삼각형과 설정 정보

스프링 삼각형과 설정 정보 #

스프링을 이해하기 위해 스프링의 3대 프로그래밍 모델을 이해할 수 있어야 한다.

스프링의 3대 프로그래밍 모델이란?

  1. IoC/DI
  2. AOP
  3. PSA

* POJO 기반임을 기억하자.

IoC/DI #

제어의 역전, 의존성 주입

* 주입이란? 외부에서 라는 뜻을 내포하고 있다. 즉, 외부에서 생성되어 주입이 되는 것이다.

다음과 같은 코드가 있다.


// 운전자
public class Driver {
  public static void main(String[] args) {
    Car car = new Car();
  }
}

// 자동차
public class Car {
  Tire tire;

  public Car() {
    tire = new KoreaTire();
  }

  ...
}

// 타이어 (인터페이스)
interface Tire {
  String getBrand();
}

// 한국 타이어
public class KoreaTire implements Tire {
  public String getBrand() {
    return "한국 타이어!";
  }
}

// 미국 타이어
public class AmericaTire implements Tire {
  public String getBrand() {
    return "미국 타이어!";
  }
}

위의 코드는 운전자 -> 자동차 -> 타이어 형태의 의존 관계가 맺어지고 있다.


스프링 없이 의존성을 주입하기 1 (생성자 주입)

운전자 클래스에서 타이어를 생산하고, 자동차 에 주입해준다.

public class Driver {
  public static void main(String[] args) {

    Tire tire = new KoreaTire();

    Car car = new Car(tire); // 타이어 주입
  }
}

// 이하 생략
  • 기존의 코드는 자동차가 어떤 타이어를 사용할지 결정했다.
  • 개선된 코드는 운전자가 어떤 타이어를 사용할지 결정한다. (유연성이 향상되었다고 볼 수 있다. 조금 더 객체 지향적이다.)
  • 자동차의 입장에서는, Tire 에 대해 더 이상 알 필요가 없다. 그저 주입만 받으면 된다.

스프링 없이 의존성을 주입하기 2 (속성 주입)

public class Driver {
  public static void main(String[] args) {

    Tire tire = new KoreaTire();

    Car car = new Car();

    car.setTire(tire); // 타이어 주입
  }
}

// 이하 생략
  • 속성 주입을 통해, 자동차를 생성할 때만 타이어를 주입할 수 있는 문제가 해결되었다. 즉 언제든지 주입, 교체할 수 있다.
  • 생성자 주입, 속성 주입 중 무엇이 더 나은지는 호불호가 갈릴 수 있다.

지금까지는 스프링을 사용하지 않고 의존성을 주입했다.


스프링 통해 의존성을 주입하기 1 (XML 파일 사용, 소스 코드에서 주입)

생성자 주입, 속성 주입 모두 가능하다.

속성 주입을 예시로 하여, 의사 코드를 작성하면 다음과 같다.

운전자종합 쇼핑몰에서 타이어를 구입한다.
운전자종합 쇼핑몰에서 자동차를 구입한다.
운전자자동차타이어를 장착한다.

여기서 눈 여겨 볼 점은 종합 쇼핑몰이 생겼는데, 종합 쇼핑몰의 역할을 하는 것이 바로 스프링 프레임워크 다.

현실 세계와 더 유사해졌다. (= 조금 더 객체 지향적이다.)

public class Driver {
  public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("~~.xml");

    Car car = context.getBean("car", Car.class); // 자동차 구입

    Tire tire = context.getBean("tire", Tire.class); // 타이어 구입

    car.setTire(car);
  }
}

// 이하 생략
  • 가장 큰 이점은 자동차의 타이어 브랜드(구현체 클래스)를 변경할 때 재컴파일/재배포가 이뤄지지 않아도 된다는 점이다. XML 파일만 변경하면 된다.
    즉, 타이어 브랜드가 변경되어도 소스 코드는 아무것도 변경되지 않는다.

스프링 통해 의존성을 주입하기 2 (XML 파일 사용, XML에서 주입)

의사 코드는 다음과 같다.

운전자종합 쇼핑몰에서 자동차를 구매한다.
종합 쇼핑몰자동차를 생산한다.
종합 쇼핑몰타이어를 생산한다.
종합 쇼핑몰자동차타이어를 장착한다.
운전자종합 쇼핑몰로부터 자동차를 전달받는다.

<bean id="koreaTire" class="~~.KoreaTire">
<bean id="americaTire" class="~~.AmericaTire">

<bean id="car" class="~~.Car">
  <property name="tire" ref="koreaTire"></property>
</bean>  

스프링 통해 의존성을 주입하기 3 (@Autowired 주입)

의사 코드는 이전과 동일하다.

// xml 설정 추가 부분 생략

@Autowired
Tire tire;

설정자 메소드(setter)를 사용하지 않고, 설정 파일(xml)을 통해 속성을 주입해준다.

설정 파일을 보고 자동으로 속성의 설정자 메서드에 해당하는 역할을 해주겠다는 의미이다.

즉, 이전 코드에서 보인 beanpropert 부분을 자동으로 설정해 주는 것이다. (자동 의존성 주입)


스프링 통해 의존성을 주입하기 3 (@Resource 주입)

의사 코드는 이전과 동일하다.

// xml 설정 추가 부분 생략

@Resource
Tire tire;

정리하면 다음과 같다.

스프링을 통해 의존성을 주입하기 위해서는 아래와 같은 방법이 있다.

  1. <property>
  2. @Autowired
  3. @Resource
@Autowired@Resource
스프링 어노테이션자바 표준 어노테이션
type 우선순위 > id 우선순위id 우선순위 > type 우선순위

책에서는 다음과 같은 순위로 사용을 권장한다.

<property> > @Resource > @Autowired

* 설정 파일(xml) 을 사용하는 가장 중요한 이유는 재컴파일/재배포 없이 변경할 수 있다는 것이다.