스프링의 IoC와 DI.. 이름만 들어도 다가가기 싫다
그치만, 스프링을 똑바로하려면 알아야한다! 기본이니까! ( 오글거리는 텍스트 )
무튼, 스프링을 공부하다보면 항상 나오는말이
1. 스프링은 IoC 컨테이너로 Bean 관리
2. 스프링은 DI 사용
이처럼 우리가 두가지를 꼭 알아야 스프링을 공부했다고 할 수 있다.
IoC는 Inversion of Control의 약자이다.
영어를 해석해보면, 제어의 역전 이라고 할 수 있는데... 해석만 해봐도 뭔소리인지 스프링에서 어디에서 사용하는지 알 수 없다.
학습한대로 말하자면
IoC는 제어의 반전으로서, 객체의 생성, 생명주기의 관리까지 모든 객체의 제어권이 바뀌었다는 것을 의미한다.
해당 작업은 애플리케이션 코드가 담당하는 것이 아닌, 스프링 컨테이너가 담당하며
스프링 컨테이너를 IoC 컨테이너라고 부른다.
스프링에서 IoC를 담당하는 컨테이너를 빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트라고 부른다.
컨테이너의 역할은 앞서말한대로 객체의 생명주기를 관리, 생성된 인스턴스에게 추가적인 기능을 제공하는 역할과 하며,
스프링 프레임워크도 객체를 생성하고 관리하며 의존성을 관리해주는 IoC 컨테이너가 있다.
특징)
1. 객체 생성코드가 없기에 TDD가 용이
2. 개발자가 직접 Getter/Setter 와 같은 Bean 객체를 생성할 수 있지만 컨테이너가 대신해서 담당한다.
3. 2번과 같은 특징으로 개발자는 비즈니스 로직에 더욱 집중할 수 있다.
Dependency Lookup (DL)
: 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 사용
Dependenct Injection (DI)
: 각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 직접 자동으로 연결하고 수정자 , 생성자, 필드 주입이 대표적이다.
앞서 말한 IoC 분류 중 우리가 흔히 사용하는 것이 DI로서 DI가 바로 의존성주입 이다.
장점)
1. 클래스들 간 의존관계를 최소화
2. 프로젝트 유지보수 용이
3. 개발자가 직접 객체 생성 및 소멸한 부분을 대체
주의!
DI는 객체의 생성, 소멸, 의존관계를 개발자가 직접 설정하는 것이 아닌, Annotation과 XML을 활용하여 스프링 프레임워크가 제어함.
@RequiredArgsConstructor public class Post { private PostService postService; }
public class Post { @Autowired private PostService postService; }
public class Post { private PostService postService; @Autowired public void setPostService( PostService postService) { this.postService = postService; } }