IoC/DI & Spring Bean Life Cycle
해당 내용은 DOM의 발표자료 를 참고하여 재구성하였습니다. 자세한 설명은 해당 사이트를 통해 확인하시길 바랍니다.
Java Bean 규약
Handlebar도 Java Bean 규약에 의거해서 데이터를 가져옵니다. 그런데 Java Bean은 Spring Bean과는 전혀 관련이 없습니다!!
직렬화
시스템 내부에서 사용하는 객체 혹은 데이터를 외부 시스템에서도 사용할 수 있도록 변환시키는 것입니다. JSON이나 CSV 형식으로 내보내는 것도 직렬화라고 하네요.
public class Person implements Serializable
Dependency(의존성)
추상적인 것에 구체적인 것을 매핑하고 있다는 것입니다.
new
키워드를 중심으로 의존관계가 발생하고 있다는 것을 중점적으로 살펴봐야 합니다. 객체를 생성하고 있는 부분이 반대편 해당 필드에 가진 객체에 의존하고(의존성 주입하고) 있는 것입니다.public Car() { this.tire = new KoreaTire(); }
의존성의 역전. 무엇이 어디로 역전이 되었다는 것일까요?
- 기존 구체적인 것에 의존하고 있었던 것을 추상적인 것(예를들어 Interface)에 의존을 바꾼다는 말입니다.
DI(Dependency Injection)
'의존성 주입을 받는다'?
- 주입을 받는다는 것은 외부에서 의존성을 받는다는 뜻입니다. 위에서
Car
는 생성자 내부에서 직접 의존성을 맺어주었기 때문에 '의존성 주입'은 아닐 것 같네요.
- 주입을 받는다는 것은 외부에서 의존성을 받는다는 뜻입니다. 위에서
방법
- 생성자를 통한 의존성 주입
public Car(Tire tire) { this.tire = tire; }
기존에는 Car 내부에서 구체적으로 어떤 타이어를 사용할지 직접 결정하였습니다. 하지만 생성자 매개변수에서 어떤 타이어를 사용할지 결정하면 더이상 자동차는 어떤 타이러를 사용할지 고민하지 않아도 됩니다. 다만 자동차를 만들때 결정하는 것이죠.
이렇게 사용하면 어떤 이점이 있을까요?
전에는 자동차 내부에서 직접 타이어를 결정하다보니 어떤 타이어를 사용하여야 할지 직접 다 알아야 했습니다. 하지만 생성자를 통해 의존성을 주입하면 매개변수를 통해 오는
Tire
를 사용하면 됩니다. 그리고 새로운 타이어(ChinaTire, JapanTire 등)가 나중에 나오더라도 바로 대처가 가능합니다!
속성을 통한 의존성 주입
Tire tire = new KoreaTire(); Car car = new Car(); car.setTire(tire);
'생성자를 통한 의존성 주입'의 단점은 객체를 생성할 때만 의존성을 설정가능하다는 점입니다. 그런데 차를 타다가 타이어를 바꿀 일이 생기면 어떻할까요? 그런 경우 필요한 것이 '속성을 통한 의존성 주입'입니다. 스프링에서 애노테이션(
@
)을 사용하는 경우 getter/setter가 있어야 하기 때문에 주로 이 방법을 사용한다고 하네요.
스프링을 통한 의존성 주입 - 스프링 설정 파일(XML)에서 속성 주입
이제부터 스프링을 통한 의존성 주입인데요. 스프링에선 위에서 본 '생성자를 통한 의존성 주입', '속성을 통한 의존성 주입' 모두를 제공한다고 합니다. 그런데 XML설정파일을 통해 속성을 주입하면 의존관계를 파악하기가 힘들어 요즘엔 잘 사용되지 않는다고 하네요. 따라서 '스프링 설정 파일에서 속성 주입' 부분은 현재 단계에선 이 정도로 정리할게요!
'스프링'과 '스프링 부트'의 큰 차이점 중의 하나가 이러한 설정 파일을 자동으로 해주는 것의 유무입니다. 처음엔 스프링부트가 스프링의 light버전이라고 이해했지만 그것이 아니라 스프링을 좀 더 쉽게 이용할 수 있게끔 도와주는 도구라고 이해하게 되었습니다.
- 스프링을 통한 의존성 주입 - @Autowired를 통한 속성 주입
@Component("AmericaTire")
public class AmericaTire implements Tire {
@Override
public String getBrand() {
return "미국 타이어";
}
}
@Component
public class Car {
@Autowired
@Qualifier("AmericaTire")
private Tire tire;
public String getTireBrand() {
return "장착된 타이어: " + tire.getBrand();
}
}
@RestController
public class Driver {
@Autowired
private Car car = new Car();
@RequestMapping("/car")
public String driver() {
return car.getTireBrand();
}
}
@Component
는 Bean으로 등록한다는 뜻입니다. @RestController
도 Bean에 등록이 됩니다. @Autowired
는 이렇게 Bean으로 등록된 객체를 가져와 의존성을 주입시키는데요. 만약 Car
내에 Tire
속성에 대해 의존성 주입이 필요하다면 해당 빈 이름을 @Qualifier
로 등록시켜 주입이 가능합니다. 여기서 주의할 점은 주입시키고 싶은 속성이 특정 객체(Car
) 내에 있다면 그 특정 객체도 Bean으로 등록시켜야 한다는 것입니다.
오늘은 여기까지 정리해볼게요. 내일은 Spring Container에 대해 좀 더 자세히 살펴볼 것 같아요!!
'Spring' 카테고리의 다른 글
AOP2 (0) | 2018.12.13 |
---|---|
AOP (0) | 2018.12.11 |
devtools 사용법 (0) | 2018.12.08 |
IoC/DI & Spring Bean Life Cycle3 (0) | 2018.12.06 |
IoC/DI & Spring Bean Life Cycle2 (0) | 2018.12.05 |