본문 바로가기

프로그래밍/스프링 프레임워크

Spring FrameWork(스프링 프레임워크) IOC Container과 Dependency injection

안녕하세요 1편 스프링 프레이워크의 IOC의 개념의대해 설명하다가 지쳐버린 엉뚱한 마녀입니다.
뭔 개념 설명하는데에 글이 길어지는지 모르겠어염~~

하이튼 이번엔 약간의 휴식을 통하여 힘을 얻은 엉뚱한 마녀가 IOC 모듈 즉 Container의 대해 알려드리도록 하겠습니다.

최대한 키워드 노출을 많이 일으키기위해서 제목을 저렇게 적어둔겁니다.

급 설명할려고 하니 갑자기 머리가 하얗게 변할려고 합니다 help me 치고 싶지만..
흠.. 머리만큼은 귀차니즘의 걸리지 말아야할텐데.. 난쉬고 머리는 일해!

자 그러면 전에 내용일단 싹 접어두고.. 지금 내용을 같이 공부해보도록 합시다.
필자도 전에 글이 생각안납니다~~ 그래서 접어두는거임...

일단 IOC의 최종 목표는! 뭐? 결합도를 낮추는 것입니다.
결합도는 뭐? 두개의 객체 쉽게 설명하기위해 클래스라고 해보죠.. 아직 인스턴스화는 안된 틀이지만..

두개의 클래스가 있습니다. 이 두개의 클래스 안에 있는 변수와 메소드를 쓰고 싶네요?
어떻게 해야할까요?

정답 : 객체를 생성시켜주고, 메소드 호출을 시켜줍니다.

객체 생성이 뭐야?
메소드 호출시켜? 잘 이해가 안된다 하시는 분은 전에 내용을 참고하시기 바랍니다.
2011/08/31 - [프로그래밍/스프링 프레임워크] - Spring FrameWork(스프링 프레임워크) IOC 개념과 Container

아니면 자바의 대해 기초지식부터 쌓고와!! - 난 정말 자바를 공부한적이 없어 무료 자바 강좌!
[참고] 위의링크는 광고성도 아니며, 홍보도 아닙니다. 회원가입만 하시면 자바 무료강좌 평생~

위의 설명이어가겠습니다.

결합도라는것은 위의처럼 두개의 클래스를 하나의 클래스가 참조변수를 통해서 객체를 생성시키고 메소드를 호출 시켜 이용하면서 생기는 관계? 라고 설명하면 될까요?

이해 안되시면 댓글이라도 남겨주시면 알려드릴게요^^ (댓글 유도?)

원래 super를 이용해서 결합도를 낮출수 있지만 그것은 이용결합밖에 낮추지 못하기에..
생성결합을 낮춰주는 ...
 Factory 클래스를 이용하여 결합도를 확 낮춰 보겠습니다.. (설명이 부족하고 잘못되었다고 생각해도 아직 저도 배우는 입장이라 설명이 힘듭니다 ㅠㅠ 이해 부탁드려요..)

Factory 클래스를 이용한 코드를 확인해봅시다.
class Factory{ // Factory 클래스를 하나 만들었어요
static Super createB(){
return new B();
}
static Super createC(){
return new C();
}
static Super createD(){
return new D();
}
}


Factory 클래스를 이용할려는 A클래스
public class A{
Super b1=Factory.createB();
Super c1=Factory.createC();
Super d1=Factory.createD();

void a(){
b1.method();
c1.method();
d1.method();
}
}

 자 그러면 소스를 살펴봅시다.

팩토리 소스를 알기 쉽게 표현하기위하여 평상시 사용하는것으로 전환해봅시다.

 
public class A{
B b1= new B();
C c1= new C();
D d1= new D();

void a(){
b1.method();
c1.method();
d1.method();
}
}


일단 b클래스 c클래스 d클래스가 모두 있다고 한 가정입니다.
또한 b,c,d에는 각각 method라는 메소드가 선언되어있구요..

위와 아래 소스코드를 보면 뭐가 다르나요? 좀 자바좀 안다 하시는분은

new B(); new C(); new D(); 이 부분이 다 Factory.createB()이런 형식으로 변해있습니다. 맞나요?

Factory 클래스의 Factory.createB() 부분에서보면 B클래스를 생성하고 있다는 문장이 안보이면서 B객체가 생성이 되었습니다.

이게 바로 생성결합을 없애주는 부분입니다.

아셨을지 모르지만 이게 생성결합을 없애주어 결합도를 낮추어줬다라고 말할수 있는데요

이렇게 Factory 클래스로 할경우 Factory가 대신 해서 객체를 생성해주기에 B,C,D 클래스의 대한 정보가 적혀있지 않으므로 B,C,D클래스중 어떠한 코드가 변한다고해도 A는 유지보수 할필요가 사라지게 됩니다.

Fatory로 되어있으니까 변경 할필요가 없는거죠.. 저도 설명하면서 뭔가 꼬입니다만..




일단 이렇게 이해를 해두시면 되겠구요..
저는 설명력이 무지 딸리니 factory 클래스의 대해 다른분들께 여쭤보시면.. 자세히 ~알려줄거에요..

자 그러면 다시 Container로 넘어가서.. 이렇게 약간 복잡하고 복잡하다고 느껴지는 Factory 기능이 포함된게
Container이며 이것이 IOC 모듈이라고 불리웁니다.

Factory Pattern을 적용한게 Container 기능이며 이것이 IOC모듈이다 라고 가볍게 생각하시면 됩니다.

아정말 IOC 정말 중요한데 뭐라 표현할 방법이 없네!

점점 지쳐가기 시작한 필자~~ 그럼 마지막으로 Dependency 관리의대해서 알아보도록 하겠습니다.

Dependency 관리
Dependency 관리는 두가지 종류로 나뉘우게 되는데..

하나는 제목처럼
Dependency Injection 이며, 나머지 하나는 Dependency Look up 입니다.

Dependency Look up => Container가 Callback을 통해서 제공하는 Lookup Context 이용, 필요한 리소스나 Object를 얻는 방식

장점 : JNDI등을 이용하는데 Object 간에 Decoupling 해주게 됩니다.

단점 : 테스트가 어려우며, code가 길고 복잡하다.

Dependency Injection => Contatiner가 직접 의존구조를 Object에 설정을 지정해줍니다.

종류로는 Setter Injection과 Constructor Injection 이 있으며 Object가 Container의 의존적이지 않아서
Lookup의 관한 코드가 사라지며, 인터페이스 구현이나 클래스 상속이 필요가 사라지게된다.



자 그러면 지금까지 IOC의 개념과 Dependency 개념의 대해 알게 되었습니다.
허나 아직 제대로 된 Spring IOC의대해 설명하지 않았습니다..

그냥 IOC의 대한 정의를 내린것 뿐입니다.

Spring에서의 IOC는 Container를 말하는 것인데.. 이 Container는 bean의 객체에 생성부터 소멸 라이프사이클을 담당하게 됩니다.

이때까지 ioc의 최종목표는 결합도이며, 코드설명하고 이런저런 애기는 다했지만 결국 Spring에서의 ioc는 bean 객체의 생성부터 소멸을 담당하는 라이프사이클을 말하는 것입니다.

그러면 간단하게 말하면 될것이지.. 왜 이렇게 주주구절 설명했느냐? 더이해가 안가신다구요..

저도 마찬가지였어요.. 하지만 그래도 찬찬히보시면 이해가 될까요?.. 저도 의문입니다.

이상 여기서 힘들어서 마칠까? 하는데 .. 괜찮죠?