[Spring] IoC (Inversion of Control)

Gabriela·2023년 10월 1일
0

Spring

목록 보기
3/8

IoC

Inversion of Control
제어의 역전


  • 개발자가 프로그램을 제어하지 않고, Framework가 프로그램을 제어하는 것을 의미함
  • 객체 생성, 의존관계 설정(Dependency), 생명주기(Lifecycle) 등을 Framework가 직접 관리하는 것을 말함

IoC 컨테이너

  • 컨테이너(Container) : 객체의 생명주기를 관리하고 생성된 인스턴스를 관리함
  • Spring Framework에서 객체생성과 소멸을 담당하고 의존성을 관리하는 컨테이너를 IoC 컨테이너라고 함
  • IoC 컨테이너 = 스프링 컨테이너

IoC 컨테이너 주요 종류

컨테이너의미
BeanFactory • 스프링 빈 설정 파일(Spring Bean Configuration File)에 등록된 bean을 생성하고 관리하는 가장 기본적인 컨테이너
• 클라이언트 요청에 의해서 bean을 생성함
ApplicationContext • 트랜잭션 관리, 메시지 기반 다국어 처리 등 추가 기능을 제공
• bean으로 등록된 클래스들을 객체 생성 즉시 로딩시키는 방식으로 동작
GenericXmlApplicationContext • 파일 시스템 또는 클래스 경로에 있는 XML 설정 파일을 로딩하여 <bean> 태그로 등록된 bean을 생성하는 컨테이너
AnnotationConfigApplicationContext• 자바 애너테이션(Java Annotation)에 의해서 bean으로 등록된 bean을 생성하는 컨테이너
• @Configuration, @Bean 애너테이션 등이 필요함

XML 파일을 이용한 Bean 생성


Bean

  • 데이터를 저장하는 자바 객체
  • 스프링 컨테이너에 등록된 객체
  • Spring Container에 의해서 관리되는 POJO(Plain Old Java Object)를 의미한다.
  • <bean> 태그를 사용하면 알아서 객체를 만든다.
    • <bean> 태그의 scope속성을 생략하면 디폴트는 싱글톤 패턴이다.

root-context.xml

  • View와 관련이 없는 객체를 정의
  • Service, Repository(DAO), DB 등과 관련된 Bean을 등록함
  • <bean> 태그를 이용해서 Bean을 등록

servlet-context.xml

  • 요청에 관련된 객체를 정의
  • Controller, ViewResolver, Interceptor 등과 관련된 설정을 처리함
  • <beans:bean> 태그를 이용해서 Bean을 등록함

  • Top Level Package = Base-Package
    • Top Level Package는 절대 수정하면 안 된다.

<property> 태그

  • Setter를 이용해서 값(value)을 전달하고 저장
  • 특정 Bean을 값으로 전달할 때는 ref 속성을 사용한다.

작성방법-1

<property name="필드">
<value></value>
</property>

작성방법-2

<property name="필드" value="" />

<constructor-arg> 태그

  • Constructor를 이용해서 값(value)을 전달하고 저장
  • constructor-argname 명시가 없기 때문에 생성자의 매개변수와 동일하게 반드시 순서대로 전달해야 한다.

작성방법-1

<constructor-arg>
<value></value>
</constructor-arg>

작성방법-2

<constructor-arg value="" />

xml 예제 사용시 생성한 방법

  • src/main/resources 파일 - 마우스 우클릭 - New - Spring Bean Configuration File
    • (이름 설정은 자유)

IoC 예제 프로젝트 실행 시

  • 메인 메소드는 서버(톰캣)가 아닌 Java Application으로 실행

XML to Annotation

XML을 이용한 Bean 생성의 한계

  • 프로젝트의 규모가 커지면XML의 관리가 어려워졌다.
  • XML에서는 자바 데이터사용하기가 불편하다.
  • 애노테이션을 이용하는 새로운 빈 생성 방식이 개발되었다.
  • 기존 XML을 이용하는 방식은 애노테이션을 이용한 방식으로 대체되는 중이다.
  • Spring Boot 프로젝트는 빈 생성을 위한 root-context.xml이나 servlet-context.xml 파일을 기본적으로 지원하지 않고 있다.

Annotation을 이용한 Bean 생성


  • 스프링은 기능을 축약시켜서 애노테이션 형식으로 제공한다.

@Configuration

  • 클래스 레벨 애노테이션
  • @Configuration이 명시된 클래스는 IocContainerBean등록하는 클래스가 된다.
  • @Bean을 등록하기 위해서는 반드시 @Configuration을 등록해야 한다.

@Bean

  • 메소드 레벨 애노테이션
  • @Bean이 명시된 메소드가 반환하는 값Bean으로 등록
  • 개발자가 직접 Bean을 만들어서 반환하는 방식
  • 스프링은 메소드 이름Bean의 이름으로 등록한다.
  • @Bean(name="") : Bean에 name속성을 이용해서 이름을 등록할 수 있다. (메소드명은 더이상 사용되지 않으므로 의미가 사라진다.)
  • @Bean을 사용하는 메소드가 포함된 클래스는 반드시 @Configuration을 사용해야 한다.

태그(xml) ‣ 애노테이션


👉 IoC 활용 예제(깃허브 클릭)



profile
개발이 세상에서 제일 재밌어요

0개의 댓글