스프링 삼각형과 설정 정보 #
스프링을 이해하기 위해 스프링의 3대 프로그래밍 모델을 이해할 수 있어야 한다.
스프링의 3대 프로그래밍 모델이란?
- IoC/DI
- AOP
- 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)을 통해 속성을 주입해준다.
설정 파일을 보고 자동으로 속성의 설정자 메서드에 해당하는 역할을 해주겠다는 의미이다.
즉, 이전 코드에서 보인 bean
의 propert
부분을 자동으로 설정해 주는 것이다. (자동 의존성 주입)
스프링 통해 의존성을 주입하기 3 (@Resource 주입)
의사 코드는 이전과 동일하다.
// xml 설정 추가 부분 생략
@Resource
Tire tire;
정리하면 다음과 같다.
스프링을 통해 의존성을 주입하기 위해서는 아래와 같은 방법이 있다.
<property>
@Autowired
@Resource
@Autowired | @Resource |
---|---|
스프링 어노테이션 | 자바 표준 어노테이션 |
type 우선순위 > id 우선순위 | id 우선순위 > type 우선순위 |
책에서는 다음과 같은 순위로 사용을 권장한다.
<property>
> @Resource
> @Autowired
* 설정 파일(xml) 을 사용하는 가장 중요한 이유는 재컴파일/재배포 없이 변경할 수 있다는 것이다.