포스트

Day86 Java프로그래밍 기초(Spring IOC)

Spring IOC

1. IOC(Inversion of Control)

1) IOC의 정의

  • 기존의 코드들은 객체나 의존성은 개발자가 직접 생성하고 관리하여 코드의 유지보수가 난해하다.
  • 객체 생성, 라이프사이클 관리 등을 프레임워크에 위임하고, 필요한 객체를 받아서 사용한다.
  • IOC컨테이너를 통해 의존성을 자동으로 주입(Dependency Injection, DI컨테이너)

2) DI컨테이너, IOC컨테이너, Bean컨테이너의 관계

  • 넓은 의미에서는 모두 의존성객체를 주입하는 의미로 사용된다.
  • 각 용어의 관계는 다음과 같다. image

2. IOC Cotainer의 종류

1) BeanFactory

  • 가장 기본적인 IoC 컨테이너이다.
  • 필요할 때만 객체를 생성하는 지연 로딩(lazy loading) 방식을 사용한다.
  • 성능이 중요한 경우나 리소스를 많이 절약해야 하는 상황에서 적합하다.
  • 장점: 메모리 효율성이 뛰어나다.
  • 단점: 추가적인 기능(예: AOP, 이벤트 리스너 등)이 제한적이며, 애플리케이션의 복잡성이 커질수록 이를 관리하기가 어렵다.

2) AutowireCapableBeanFactory

  • Spring의 IoC 컨테이너 중 하나로, BeanFactory의 하위 인터페이스이다.
  • 기존의 빈을 자동으로 의존성 주입할 수 있는 기능을 제공한다.
  • 주요 기능:
    • 이미 존재하는 객체에 의존성을 주입할 수 있다. 일반적인 빈 팩토리와 달리, 새로운 객체를 생성하지 않고도 의존성 주입을 수행할 수 있다.
    • 수동으로 빈을 생성하거나 초기화할 수 있다.
    • 일반적인 빈 라이프사이클 콜백 메서드(@PostConstruct, @PreDestroy)를 호출할 수 있다.
  • 단점: 주로 내부용으로 사용되기 때문에 일반적인 애플리케이션 개발에서는 잘 사용되지 않으며, 지나치게 사용하면 IoC 컨테이너의 장점이 희석될 수 있다.

3) ApplicationContext

  • Spring에서 가장 많이 사용하는 IoC 컨테이너이다. BeanFactory를 확장한 것으로, 다양한 기능을 제공한다.
  • 즉시 로딩(eager loading) 방식을 사용하여 애플리케이션이 시작될 때 모든 빈(bean)을 미리 로드하고 초기화한다.
  • 추가 기능: AOP 지원, 메시지 리소스 처리, 이벤트 리스너 등록, 국제화(i18n) 지원 등.

3. IoC의 상속관계

4. ApplicationCeontext

1) ApplicationCeontext 종류

  • FileSystemXmlApplicationContext: XML 설정 파일을 파일 시스템 경로에서 로드할 때 사용한다.
  • ClassPathXmlApplicationContext: XML 설정 파일을 classpath에서 로드할 때 사용한다.
  • AnnotationConfigApplicationContext: 자바 기반의 설정 클래스를 로드할 때 사용한다.
  • AnnotationConfigWebApplicationContext: 웹 애플리케이션에서 사용되는 IoC 컨테이너로, Spring MVC에서 주로 사용한다.

2) FileSystemXmlApplicationContext

  • XML 설정 파일을 파일 시스템 경로에서 로드할 때 사용한다.
  • 설정 파일 경로를 지정할 때 파일 시스템 경로를 URL형식(file://) 지정해야 한다.
  • XML 파일의 위치가 바뀌면, 코드를 다시 수정해야 한다. 사용빈도는 낮다.

    1
    2
    3
    4
    5
    6
    7
    8
    
     public class test {
       public static void main(String[] args) {
         ApplicationContext iocContainer = new FileSystemXmlApplicationContext(
             "file:///Users/eomjinyoung/git/eomcs-java/eomcs-java-lang/app/src/main/java/com/eomcs/spring/ioc/ex01/b/application-context.xml");
       
         System.out.println("실행 완료!");
       }
     }
    
  • xmlns는 java의 기본 패키지 처럼 xml의 기본 네임 스페이스이다.
  • 문법은 schemaLocation = "네임스페이스명 명세서URL"을 사용한다.

    1
    2
    3
    4
    5
    6
    7
    
     <?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 
           https://www.springframework.org/schema/beans/spring-beans.xsd">
         
     </beans>
    

3) ClassPathXmlApplicationContext

  • ClassPath에서 XML 파일을 찾는다.
    • 컴파일 시 경로 설정 : $java -classpath c:\a\b;d:\xxx\yyy\zzz;c:\bb\x.jar Hello
    • 경로 미 설정 시 : OS에서 CLASSPATH 환경 변수로 등록한 경로
  • xml파일 설정은 동일하다.

    1
    2
    3
    4
    5
    6
    7
    8
    
     public class test {
       public static void main(String[] args) {
         ApplicationContext iocContainer = new ClassPathXmlApplicationContext(
             "com/eomcs/spring/ioc/ex01/a/application-context.xml");
       
         System.out.println("실행 완료!");
       }
     }
    

4) AnnotationConfigApplicationContext

  • 자바 클래스 파일의 애노테이션으로부터 설정 정보를 추출한다.
  • 자바 클래스로 설정 정보를 다루는 것을 ‘Java Config’ 라 부른다.
  • 생성자 파라미터로 Java Config 클래스의 타입 정보를 넘긴다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     public class test {
       public static void main(String[] args) {
        //AppConfig.class 클래스 타입 파라미터로 넘겨야한다.
         ApplicationContext iocContainer = new AnnotationConfigApplicationContext(
             AppConfig.class);
       
         System.out.println("실행 완료!");
       }
     }
    
  • xml파일 대신 AppConfig.java를 통해 IoC컨테이너를 설정한다.

    1
    2
    3
    4
    5
    6
    
    // 클래스 선언부에 애노테이션으로 스프링 설정에 관한 정보를 지정할 수 있다.
    public class AppConfig {
      
      // 필드나 메서드로 스프링 관련 설정을 수행할 수 있다.
    }
      
    

5. XML파일과 AppConfig.java파일

1) Bean 생성

  • 두 파일은 실행 시 불러오는 클래스의 차이가 있다.
  • XML파일은 0개의 Bean을 생성하지만 AppConfig는 기본 갯수의 Bean을 생성한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     //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 
     https://www.springframework.org/schema/beans/spring-beans.xsd">
         
       <!-- 여기에 Spring Framework의 설정 정보를 기술한다. -->
         
     </beans>
     //AppConfig.java파일
     public class AppConfig {
       
        // 필드나 메서드로 스프링 관련 설정을 수행할 수 있다.
     }
    
  • ClassPathXmlApplicationContext 실행결과 image

  • AnnotationConfigApplicationContext 실행결과 image

2) 객체 생성 방법

  • XML파일은 태그를 활용하여 객체를 자동생성한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     <?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 
           https://www.springframework.org/schema/beans/spring-beans.xsd">
         
       <!-- 객체 생성 -->
       <bean id="c1" class="com.eomcs.spring.ioc.ex01.Car"/>
         
     </beans>
    
  • AppConfig파일은 @Bean을 통해 객체를 자동 생성하며, 객체의 변수명은 메서드 명으로 생성한다.

    1
    2
    3
    4
    5
    6
    7
    8
    
     public class AppConfig {
       
       // 객체 생성
       @Bean
       public Car c1() {
         return new Car();
       }
     }
    

    3) Component Scan

  • ComponentScan 옵션은 패키지에 @Component 및 자식 에노테이션들이 붙은 클래스들을 자동으로 생성한다.
  • xml 파일에는 component-scan 설정을 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            https://www.springframework.org/schema/beans/spring-beans.xsd 
                            http://www.springframework.org/schema/context 
                            https://www.springframework.org/schema/context/spring-context.xsd">
            
      <!-- 클래스를 찾을 패키지 지정한다.
           그러면 IoC 컨테이너는 @Component 등의 애노테이션이 붙은 클래스를 찾아 
           인스턴스를 생성하여 보관한다. -->
      <context:component-scan base-package="com.eomcs.spring.ioc.ex01"/>
        
    </beans>
    
  • AppCofig는 @ComponentScan를 사용한다.

    1
    
    @ComponentScan("com.eomcs.spring.ioc.ex01")
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.