본문 바로가기
웹 프로그래밍(풀스택-->java)/웹프로그래밍(백엔드-->java)

51. IoC 컨테이너

by 백엔드개발자0107 2021. 12. 17.

자, 이제 본격적으로 스프링에 관련된 다양한 예제들을 공부해볼것이다.

 

이 스프링 프레임워크에 기반이 되는 주요한 개념이 몇가지가 있는데

 

그중에 가장중요하고도 제일 처음 배워야할 개념이 ioc컨테이너이다.

 

제어역전 (IOC 컨테이너)--> 즉 기존에 있는 스프링 프레임워크를 개발자가 따라가는 것을 의미하고 개발자가 셋팅해놓은 코드를 분석해서 프레임워크가 제어하는것을 개발자가 아닌 프레임워크가 갖는것을 의미한다. 작업이 반복이 되는 경우가 많기 때문에 반복이 되는 코드를 개발자가 미리 만들어놓는게 아닌, 프레임워크가 미리 만들어 놓고 따라하는것이다. 대표적인 경우로 빈 객체를 생성하는 경우가 있다.

 

 

스프링에서는 ioc컨테이너에서는 POJO CLASS를 대표적으로 사용하고 있고 대표적인게 Bean이다. 우리가 흔히 아는 빈클래스, 맞다.

Metadata는 xml이나 java코드를 가지고 설정한 정보를 메타데이터라고 하고, 스프링 컨테이너(IOC 컨테이너)가 우리가 설정해놓은

 

정보를 읽어와서 그 정보를 토대로 클래스를 만들고 객체를 만들어서 반환하는 그런 IOC 컨테이너 이다.

 

 

BeanFactory 는 옛날 버전에서 사용했던 것이고,

ApplicationContext는 현재 버전에서 사용하는 것이다.

 

스프링 프레임워크같은 경우는 항상 최신 버전을 사용한다는 보장이 없다.

두가지 버전 사용법을 그래서 알아야만 한다.

 

 

--> 객체를 생성하고 이를 전달하는것 ,상속등 즉 클래스를 만들고 객체를 만들어서 객체의 주소값을 반환하는 딱 이정도의 기능만을 

가지고 있다.

 

--> 빈팩토리 외에 국제화 지원등 문자열에 관련된 다양한 기능을 제공한다.

즉 빈팩토리보다 많은 기능을 가지고 있다.

 

 

 

 

MainClass.java

package kr.co.softcampus.main;


import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;

import kr.co.softcampus.beans.TestBean;

public class MainClass {

	public static void main(String[] args) {
		
//		test1();
//		test2();
//		test3();
		test4();
	}
	//BeanFactory - 패키지 내부 
	
	public static  void test1() {
		ClassPathResource res =  new ClassPathResource("kr/co/softcampus/config/beans.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
		
		TestBean t1 = factory.getBean("t1",TestBean.class);
		//t1에 대한 객체를 팩토리에서 만들고 보관한다.그래서 t2라는 TestBean 클래스를 만들고 있는 것이다.
		
		
		System.out.printf("t1 : %s\n",t1);
		
		TestBean t2 = factory.getBean("t1",TestBean.class);
		System.out.printf("t2 : %s\n",t2);
		
		
	}
	
	//BeanFactory - 패키지 외부 
	public static void test2() {
		FileSystemResource res =  new FileSystemResource("beans.xml");
		XmlBeanFactory factory = new XmlBeanFactory(res);
//xml 빈팩토리는 자동으로 객체를 생성하지 않고 factory.getBean할때만 컨테이너에 객체를 저장하고 쓸수있겍끔한다.
		
		TestBean t1 = factory.getBean("t2",TestBean.class);
		System.out.printf("t1 : %s\n",t1);

		TestBean t2 = factory.getBean("t2",TestBean.class);
		System.out.printf("t2 : %s\n",t2);
		
		
	}
	
	//ApplicationContext - 패키지 내부 
	public static void test3() {
		
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
//		ClassPathXmlApplicationContext는 우리가 다른 설정만 안하면 beans.xml에 있는 객체들이 다 설정이 되서 연동된다.
//		하지만 이것도연동이된다. 
		
		
		TestBean t1 = ctx.getBean("t1",TestBean.class);
		System.out.printf("t1 : %s\n",t1);

		TestBean t2 = ctx.getBean("t1",TestBean.class);
		System.out.printf("t1 : %s\n",t2);
		//결과적으로 같은 객체가 나온다.
		ctx.close();
	}
	
	
	//ApplicationContext - 패키지 외
	public static void test4() {
		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("beans.xml");
		//객체 생성이 된다.
		TestBean t1 = ctx.getBean("t1",TestBean.class);
		System.out.printf("t1 : %s\n",t1);

		TestBean t2 = ctx.getBean("t1",TestBean.class);
		System.out.printf("t1 : %s\n",t2);
		
		ctx.close();
		//이렇게 하면 똑같은 객체 주소값이 나온다. 
	}
	
}

TestBean.java

 

package kr.co.softcampus.beans;

public class TestBean {

	public TestBean() {
		System.out.println("TestBean의 호출자");
		
	}
	
	
}

 

beans.xml

<?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.xsd">

<!-- <bean id="hello" class="kr.co.softcampus.beans.HelloWorldEn"/> -->
<bean id="t1" class="kr.co.softcampus.beans.TestBean"/></beans>

 

학습정리

 

스프링 프레임워크는 IoC컨테이너를 이용해 Bean 객체들을 관리한다.