데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭!
👉 https://github.com/DevLimK1/tistory-map 👈
Spring Framework의 기반이 되는 주요한 개념이 몇가지 있는데
그 중에 가장 중요하고도 먼저 배워야할 개념이 IoC 컨테이너라고 할 수 있다.
제어 역전?
스프링을 사용하기 전에는 개발자가 프로그램의 처음부터 종료될 때까지 다 제어하는 것이 일반적인 프로그램인데
IoC 개념의 적용 방식은 개발자가 몇가지 데이터만 설정해주면
전체 프로그램을 제어하는 것을 개발자가 하는게 아니라 프레임워크가 갖는 것을 제어 역전이라고 한다.
IoC 컨테이너에서 핵심적으로 사용하고 있는 POJO Class
POJO Class(Plain Old Java Object)란?
▶간단히 얘기해서 자바 빈이다.
▶자바 모델이나, 기능, 프레임워크 등에 따르지 않고 홀로 독립적이며 단순한 기능만을 가진 객체들을 의미
▶다른 클래스와 엮이지 않아서 해당 클래스가 변경되면 이에 따라서 변경돼야 하는경우가 아닌 것들을 의미한다.
IoC 컨테이너 종류
▶BeanFactory : 옛 버전 / deprecated된 경우(사용하지 않는 경우)가 많다.(스프링 ~3버전)
▶ApplicationContext : 현재 쓰고 있는 버전 (스프링 ~5버전)
BeanFactory
▶클래스를 통해 객체를 생성
▶상속 등 객체 간의 관계를 형성하고 관리함
▶클래스를 가지고 객체를 만들어서 주소값을 반환하는 까지의 기능을 갖춘 것.
ApplicationContext
▶BeanFactory가 가지고 있는 기능들은 다 갖추고 있음
▶국제화 지원 등 문자열 관련된 다양한 기능 제공
▶만들어진 객체에대해서 Bean에 이벤트를 발생시킬 수 있음
▶Bean에 관련된 설정을 위한 XML 파일은 즉시 로딩하면서 객체를 미리 생성해서 가지고 있음
글로 설명하니 어떤 차이가 있는지 확 와닿지가 않음으로...
빨리 IoC컨테이너가 어떻게 사용되는지 간단한 실습코드로 알아보자 : )
먼저, BeanFactory를 사용해보자. BeanFactory는 Deprecated 되었다.
하지만, 3점대 버전 기반으로 프로젝트하는 해야 할 경우도 있을 수 있으니 알아둘 필요는 있겠다.
Bean 객체를 정의하는 XML 파일이
패키지 안에 들어있느냐 <--> 외부에 있느냐에 따라 XML파일을 로딩하는 방법의 코드에 차이가 있다.
두가지 다 보도록하자.
아 참고로, 스프링을 작성하는 방법에는 XML 또는 자바 코드로 작성하는 방법 이렇게 2가지 방법이 있다.
아래 실습 하게 될 코드는 XML 파일로 작성하는 방법이다. (추후에 자바 코드로 작성하는 방법도 포스팅 해보겠다.)
ApplicationContext 사용방법
패키지 내부에 XML 파일이 있을 때
코드를 보려면 더보기를 눌러주세요.
MainClass.java
package kr.co.devlimk1.main;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainClass{
public static void main(String[] args){
}
//BeanFactory 패키지 내부
public static void test1(){
ClassPathResource res=new ClassPathResource("kr/co/devlimk1/config/beans.xml");
XmlBeanFactory factory =new XmlBeanFactory(res); //IoC 컨테이너
}
}
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="t1" class="kr.co.devlimk1.beans.TestBean"/>
</beans>
TestBean.java
package kr.co.devlimk1.beans;
public class TestBean { //객체를 생성하고, 객체가 잘 생성되었는지 주소값을 찍어보는 정도로 사용
public TestBean() {
System.out.println("TestBean의 생성자");
}
}
위 코드를 실행시켜보면, console에 아무것도 출력이 되지 않은 것을 볼 수 있다.
BeanFactory는 XML파일이 로딩될 때 자동으로 객체가 생성되지 않는다.
XML 로딩할 때 객체가 생성되지 않고, getBean메소드 호출할 때 객체가 생성되는 것을 확인할 수 있다.
이미 만들어진 객체를 IoC컨테이너가 보관해서 같은 id(beans.xml의 id="t1")로 객체를 가지고 오면 이미 생성된 객체 주소값을 반환해서 사용할 수 있겠다.
패키지 외부에 beans.xml 파일이 있을 때
패키지 내부와 외부를 비교해보면, 차이점은 beans.xml을 어떻게 로딩하느냐에 차이가 있을 뿐이다.
패키지 내부 : ClassPathResource 클래스 사용
패키지 외부 : FileSystemResource 클래스 사용
위 코드를 실행시켰을 때 역시나 객체 생성자가 호출되지 않음을 알 수 있다.
즉, xml파일에 정의되어 있는 bean 객체들이 자동으로 생성되지 않음
동일한 객체 주소값이 출력됨을 알 수 있다.
참고로, getBean할 때마다 새로운 객체 주소값을 반환하게 설정하는 것도 가능하다
자, 이제 ApplicationContext 사용방법을 알아보자
패키지 내부에 XML 파일이 있을 때
BeanFactory 예제와 다르게 xml파일이 로딩될 때 자동으로 객체의 생성자가 호출되는 것을 볼 수 있다.
참고로, getBean 메소드가 호출될 때에 객체를 생성하게 설정 할 수도 있다.
xml파일이 로딩될 때 이미 생성된 객체의 주소값을 동일하게 사용하는 것을 볼 수 있다.
패키지 외부에 beans.xml 파일이 있을 때
위 코드 또한 xml파일이 로딩될 때 객체 생성자가 자동으로 호출됨을 알 수 있다.
위 코드 또한 똑같은 객체주소값을 호출하는 것을 알 수 있다.
정리
- 스프링의 IoC컨테이너의 개념이 나오기 전
- 개발자가 직접 자바 객체를 생성하고 서로간의 의존관계를 연결시키는 작업 등 구조적인 설계를 처음부터 끝까지 제어했었다.
- 스프링의 IoC컨테이너의 개념이 나온 후
- 객체의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다.
- IoC(Inversion Of Control) = 제어 역전
- 객체의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다.
- IoC 컨테이너 종류는 2가지
- BeanFactory : 단순히 컨테이너에서 객체를 생성하여 의존성 주입을 처리해주는 기능 (스프링 3점대 버전까지 사용, deprecated 된 경우가 많음)
- 패키지 내부에서 XML 파일 로딩하는 클래스
- ClassPathResource res = new ClassPathResource("kr/co/devlimk1/config/beans.xml");
- 패키지 외부에서 XML 파일 로딩하는 클래스
- FileSystemResource res = new FileSystemResource("beans.xml");
- 패키지 내부에서 XML 파일 로딩하는 클래스
- ApplicationContext : BeanFactory의 기능에 더하여 빈의 이벤트 발생, 국제화 문자열 지원등 여러 기능 추가
- 패키지 내부에서 XML 파일 로딩하는 클래스
- ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/devlimk1/config/beans.xml");
- 패키지 외부에서 XML 파일 로딩하는 클래스
- FileSystemXmlApplicationContext ctx=new FileSystemXmlApplicationContext("beans.xml");
- 패키지 내부에서 XML 파일 로딩하는 클래스
- BeanFactory : 단순히 컨테이너에서 객체를 생성하여 의존성 주입을 처리해주는 기능 (스프링 3점대 버전까지 사용, deprecated 된 경우가 많음)
- 싱글톤패턴(Singleton Pattern)
- 스프링에서는 XML 파일이 로딩될 때 객체 id가 같은 경우 미리 생성된 동일한 객체 주소값을 반환한다.
끝!
[참고자료 및 사이트]
긴 글 끝까지 읽어주셔서 감사합니다 : )
TIL 포스팅은 강의, 블로그, 서적 등을 참고해서 지식을 습득하고, 이해한 것을 바탕으로 정보를 공유합니다.
포스팅에 문제가 있거나, 수정이 필요한 부분 , 질문이 있으시면 댓글 남겨주세요.
도움이 되셨다면 공감(♥)버튼, 댓글은 작성자에게 큰 힘이 됩니다.
댓글