무엇인가?
Inversion Of Control ⇒ 제어의 반전
IoC(제어 반전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미합니다.
스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데,그것이 바로 IoC 컨테이너(=스프링 컨테이너) 이다. 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다.
자바로 객체를 생성할 때 우리는 new 연산자를 이용하여 리모콘을 생성하여 사용하였다. 하지만 IoC컨테이너가 new하지 않고 직접 인스턴스를 생성 시켜주는 작업을 말한다. 코드에 직접적인 연관 관계가 발생하지 않아 느슨한 결합이 가능하다. 심지어 싱글톤으로 하나만 사용되기 때문에 무척 유용하다.
왜 사용할까?
한 어플리케이션에는 객체가 무수히 많이 존재하고 서로 참조하고 있을 것이다. 그 정도가 심할 수록 의존성이 높다고 표현한다. 낮은 결합도와 높은 캡슐화로 대변되는 객체지향프로그래밍에서 높은 의존성은 프로그램의 유지보수가 힘들고 변경이 어려워진다. 의존성 제어, 즉 객체 간의 의존성을 낮추기 위해 바로 Spring 컨테이너(IoC)가 사용된다
특징
객체 관리 주체가 프레임워크(Container)가 된다.
IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다. 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
개발자는 로직에 집중할 수 있다.
IoC Container에 의해 관리되는 오브젝트들은 Bean 이라고 부른다.
IoC Container는 Bean을 저장한다고 하여, BeanFactory 라고도 불린다.
BeanFactory는 하나의 인터페이스이며, Application Context는 BeanFactory의 구현체를 상속받고 있는 인터페이스이다.
실제로 스프링에서 IoC Container 라고 불리는 것은 Application Context의 구현체이다.
POJO(Plain Old Java Object)란?
주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다.
Java Bean 객체가 대표적이다.
간단하게 getter / setter를 생각하면 될 것 같다.
종류
StaticApplicationContext =>
StaticApplicationContext는 코드를 통해 빈 메타정보를 등록하기 위해 사용한다. 스프링의 기능에 대한 학습 테스트를 만들 때를 제외하면 실제로 사용되지 않는다. 웹 관련 기능을 공부하며 학습 테스트로 검증하고 싶을 때는 StaticWebApplicationContext를 사용한다.
GenericApplicationContext =>
실전에서 사용될 수 있는 모든 기능을 갖추고 있는 애플리케이션 컨텍스트이다. StaticApplicationContext와 달리 XML 파일과 같은 외부의 리소스에 있는 빈 설정 메타정보를 리더를 통해 읽어들여서 메타정보로 전환하여 사용한다.
GenericXmlApplicationContext =>
GenericApplicationContext에서 XmlBeanDefinitionReader를 내장하고 있어, Xml을 읽어 사용할 때 편리하다.
WebApplicationContext =>
스프링 애플리케이션에서 가장 많이 사용된다. Xml 설정 파일을 사용하는 경우에는 XmlWebApplicationContext를 사용하며, 애노테이션을 사용한다면 AnnotationConfigWebApplicationContext를 사용한다.
떼어낼 수 없는 DI
IoC를 이해했다면 DI는 간단하다. DI(Dependency Injection)는 말 그대로 의존 관계 주입이다. IoC 컨테이너에서 관리하는 빈 객체들을 상황에 맞는 객체에 연결하여 의존성을 주입한다.
방법은 https://sh970901.tistory.com/35 를 참고해보도록 하자…
'IT' 카테고리의 다른 글
Git rebase 실습 (0) | 2022.09.13 |
---|---|
Git merge 실습 (0) | 2022.09.13 |
알약 랜섬웨어 오류 해결 방법 (0) | 2022.08.30 |
Linux(centOS9) 설정 1(CentOS, Virtural BOX, PuTTy 원격 접속) (0) | 2022.08.24 |
Spring MVC 구조 (0) | 2022.08.22 |