Day86 Java프로그래밍 기초(Spring IOC)
Spring IOC
1. IOC(Inversion of Control)
1) IOC의 정의
- 기존의 코드들은 객체나 의존성은 개발자가 직접 생성하고 관리하여 코드의 유지보수가 난해하다.
- 객체 생성, 라이프사이클 관리 등을 프레임워크에 위임하고, 필요한 객체를 받아서 사용한다.
- IOC컨테이너를 통해 의존성을 자동으로 주입(Dependency Injection, DI컨테이너)
2) DI컨테이너, IOC컨테이너, Bean컨테이너의 관계
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 { // 필드나 메서드로 스프링 관련 설정을 수행할 수 있다. }
- AnnotationConfigApplicationContext 실행결과
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 라이센스를 따릅니다.