[Spring] Ioc와 DI, Xml 방식 이론

김승현·2022년 1월 8일
0

결합도와 의존성

  • 결합도는 모듈과 모듈사이의 관련 정보를 표현한다.

  • 객체간 종속관계가 낮을 수록 결합도와 상호 의존성이 낮아지고 독립성이 높아져 좋은 코드가 됨.

  • 독립성이 높아질수록 코드간의 간섭이 일어나는 일이 줄어들게 되고, 유지보수 또한 용이함.

  • 코드간의 간섭을 줄이고 결합도를 낮추는 방법

    • 코드간의 모듈화 처리
    • 공통 처리

IoC

  • Inversion of Control로써 제어의 역행 이라는 뜻을 가지고 있음
  • 프로그램을 구동하는데 필요한 객체에 생성, 변경, 생명주기 등의 관리를 프로그램을 개발하는 사람이 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말함

IoC 컨테이너

  • 객체의 생명 주기와 의존성 주입 관리
    • 생명 주기 : 생성 -> 초기화 -> 사용 -> 소멸
    • 의존성 주입 : 개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현의 시간을 단축 할 수 있음

DI (Dependency Injection : 의존성 주입)

  • DI는 IoC 구현의 핵심 기술로, 사용하는 객체를 직접 생성하여 만드는 것이 아니라 컨테이너가 bean의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 말함

DI의 장점

  • 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화 할 수 있음
  • 각 객체 간의 종속 관계(결합도)를 해소할 수 있음
    • new를 이용하여 객체를 만들거나 데이터를 직접적으로 작성 : 객체를 변경, 수정해야할때 또 다시 코드를 수정하고 재컴파일해야 됨
    • DI를 이용하면 소스코드를 재수정하고, 재컴파일 하는 경우를 줄일 수 있음

DI의 종류

  • 메소드를 통한 의존성 주입

    • 의존성을 입력 받는 일반 메소드를 만들고 이를 통해 의존성을 주입
    • 팩토리 패턴 사용 하는 방식
  • XML을 이용한 Setter 메소드를 통한 의존성 주입

    • 의존성을 주입받는 Setter 메소드를 만들고, 이를 통해 의존성을 주입
  • XML을 이용한 생성자를 통한 의존성 주입

    • 필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입

XML 선언 및 setter 사용

<bean id="레퍼런스변수명" class="클래스 풀네임">
	<property name="OOO">
		<value>ㅁㅁㅁ</value>
	</property>
</bean>
  • property의 name: class의 필드 이름
  • value: 대입할 값
    • 대입할 값이 객체라면 property에 ref 속성을 사용 해야 한다.
      • <property name="OOO" ref="ㅁㅁㅁ">

XML 선언 및 생성자 사용

<bean id="불러 올 객체" class="클래스 풀네임">
	<constructor-arg index="0" value="OOO"/>
	<constructor-arg name="OOO" ref="OOO"/>	
</bean>

index: 필드 순서에 따라 접근 가능

스프링 XML 설정

  • <beans>

    • 스프링 컨테이너는 <bean> 저장소에 해당하는 XML 설정 파일을 참조하여 <bean>들의 생명주기를 관리하고 여러가지 서비스를 제공
  • <import> 엘리먼트

    • 프로젝트 안에 포함해야 하는 bean xml이 많은 경우에는 import 속성을 가진 bean xml을 만들어서 사용 가능
    • ex)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

<import resource="/PersonContext.xml"></import>
<import resource="/sampleContext.xml"></import>

</beans>
  • scope 속성

  • scope 속성을 이용하면 객체를 singleton 형태로 만들것인지 아니면 새롭게 생성할 것인지를 설정

  • 속성 값

    • prototype : 하나의 Bean 정의로 다수의 객체를 생성할 수 있음
    • singleton : 하나의 Bean 정의에는 단 하나의 객체를 가지고 사용 (default 값)

스프링 컨테이너의 종류

  • 스프링에서는 BeanFactory와 이를 상속한 ApplicationContext 라는 두 가지 유형의 컨테이너를 제공

  • BeanFactory

    • 스프링 설정 파일에 등록된 <bean> 객체를 생성하고 관리하는 가장 기본적인 컨테이너 기능만 제공
  • ApplicationContext

    • BeanFactory를 상속 받았으며 <bean> 객체 관리 기능 외에도 트랜잭션 관리나 메시지 기반의 다국어 처리 등 다양한 기능 제공
    • 웹 애플리케이션 개발도 지원하므로 대부분 스프링 프로젝트는 ApplicationContext 유형의 컨테이너를 이용

ApplicationContext의 구현 클래스

  • GenericXmlApplicationContext

    • 파일 시스템이나 클래스 경로에 있는 XML 설정 파일을 로딩하여 구동하는 컨테이너
  • XmlWebApplicationContext

    • 웹 기반의 스프링 애플리케이션을 개발할 때 사용하는 컨테이너
profile
개발자로 매일 한 걸음

0개의 댓글