IOC & Container

박찬호·2022년 4월 18일
0

Spring

목록 보기
3/6
post-custom-banner

IOC(Inversion of Control, 제어의 역행)

IOC 개요

  1. 객체지향 언어에서 Object간의 연결 관계를 "런타임"에 결정.
    new 객체를 직접 연결 X,
  2. 객체간의 관계가 느슨하게 연결됨(loose coupling)
    느슨하다
  3. IoC의 구현 방법 중 하나가 DI(Dependency Injection)
    DL -> 커넥션풀, 필요할 때 찾아씀

IOC 유형

  1. Dependency Lookup
    컨테이너가 lookup context를 통해 필요한 Resource나 Object를 얻는 방식
    관련된 코드를 만들어야 하고, 형변환, 익셉션 처리도 해주어야 함

  2. Dependency Injection
    컨테이너가 직접 의존 구조를 Object에 설정 할 수 있도록 지정(xml, annotaion)
    Object가 컨테이너의 존재 여부를 알 필요가 없음. Lookup 관련 코드 필요없음.

Container

객체의 생성, 사용, 소멸에 해당하는 라이프 사이클을 담당

기능: 라이프사이클 관리, Dependency 객체 제공
서비스 객체를 사용하기 위해 Factory 또는 Singleton 패턴을 직접 구현하지 않아도 됨

IOC Container

오브젝트의 생성/관계설정/사용/제거 등의 작업을 코드 대신 독립된 컨테이너가 담당.
오브젝트에 대한 제어권을 가지고 있음
스프링 컨테이너 = IOC 컨테이너
스프링에서 IOC를 담당하는 컨테이너에는 BeanFactory, ApplicationContext가 있음.

BeanFactory: 객체(Bean)을 만드는 공장
ApplicationContext: BF 하위클래스, Application를 관리하는 context, 메모리의 영역

Spring DI Container

Spring DI Container가 관리하는 객체를 Bean이라 하고 이 Bean들의 생명주기를 관리하는 의미로 BeanFactory라고 한다.
BeanFactory에 여러가지 컨테이너 기능을 추가하여 ApplicationContext라고 한다.

일반적으로 ApplicationContext 사용.

IOC 개념

  1. 객체 제어 방식
    기존: 개발자가 필요한 객체 생성 로직 구현
    IOC: 객체 생성을 Container에게 위임하여 처리
  2. 장점
    객체간의 결합도를 떨어뜨릴 수 있음(loose coupling)

단계별 결합도
1. 클래스 호출 방식: 객체간 강한 결합, 구현되어 있기 때문에 변화 불가능
2. 인터페이스 호출 방식: 다형성을 통해 결합도 낮춤, 인터페이스 교체 시 호출 클래스도 수정
3. 팩토리 호출 방식: Factory를 통해 결합도 낮춤, 팩토리에 의존함
4. IoC 호출 방식: 팩토리 장점에 더해 어떠한 것에도 의존하지 않음. 런타임에 클래스 간의 관계 형성

코드

ApplicationContext 객체가 필요함.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
  
<bean id = "kor" class = "com.ssafy.hello.di4.HelloMessageKor">

</beans>

xml 설정

public class HelloMain {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("xml위치");
    	//객체 생성
		HelloMessage helloMessage = context.getBean("kor", HelloMessageKor.class);
        //이름, 클래스
	}
}
profile
Develop for Fun
post-custom-banner

0개의 댓글