[Spring] IoC, DI란?

snowcat471·2022년 5월 5일
0

IoC (Inversion of Control)

스프링에서는 스프링 컨테이너가 bean의 life cycle 관리.
코드 내부에서 new로 객체를 생성하는 것이 아니라, 스프링 컨테이너에서 생성한 객체를 주입한다.

package com.snowcat471.spring;

public interface Character {

	public String move();
	
}

public class Warrior implements Character {
	
    @Override
    public String move() {
    	return "전사 이동";
    }
}

public class Mage implements Character {
	
    @Override
    public String move() {
    	return "마법사 이동";
    }
}
  • 3가지 설정 방법
    • xml
    • annotation
    • java code
  1. 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" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="mage"
    	class="com.snowcat471.spring.Mage">
    </bean>
    
</beans>
  1. annotation
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- add entry to enable component scanning -->
    <context:component-scan base-package="com.snowcat471.spring" />
    
    
</beans>

//@Component("mage")
@Component // bean id를 지정하지 않으면 class 이름에 맞춰 "mage"로 생성됨
public class Mage implements Character {
	
    @Override
    public String move() {
    	return "마법사 이동";
    }
}
  1. java code
@Configuration
@ComponentScan("com.snowcat471.spring")
public class MyConfig {

}

//@Component("mage")
@Component // bean id를 지정하지 않으면 class 이름에 맞춰 "mage"로 생성됨
public class Mage implements Character {
	
    @Override
    public String move() {
    	return "마법사 이동";
    }
}
  • 1,2번 app 실행
package com.snowcat471.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext context =
				new ClassPathXmlApplicationContext("파일명.xml"); 
		
		// 스프링 컨테이너에서 bean 가져오기
		Character character = context.getBean("mage", Character.class);
		
		// bean의 메서드 호출
		System.out.println(character.move());
        // 마법사 이동
		
		// 컨텍스트 close
		context.close();

	}

}
  • 3번 app 실행
package com.snowcat471.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

	public static void main(String[] args) {
		
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(MyConfig.class); 
		
		// 스프링 컨테이너에서 bean 가져오기
		Character character = context.getBean("mage", Character.class);
		
		// bean의 메서드 호출
		System.out.println(character.move());
        // 마법사 이동
		
		// 컨텍스트 close
		context.close();

	}

}

DI (Dependency Injection)

의존하는 객체를 new로 코드에서 생성하지 않고 스프링 컨테이너로부터 주입 받는 것.

package com.snowcat471.spring;

public interface Character {

	public String move();
    public String attack();
	
}

public interface Weapon {

	public String attack();
    
}

public Road implements Weapon {
	
    @Override
    public String attack() {
    	return "지팡이 공격";
    }
}

public class Mage implements Character {

	private Weapon weapon;
	
    @Override
    public String move() {
    	return "마법사 이동";
    }
    
    @Override
    public String attack() {
    	return weapon.attack();
    }
}
  • 3가지 방법
    • @Autowired
    • constructor injection
    • setter injection
  1. @Autowired
public class Mage implements Character {

	@Autowired
    private Weapon weapon;

}
  1. constructor injection
public class Mage implements Character {
	
    private Weapon weapon;
    
    public mage(Weapon weapon) {
    	this.weapon = weapon;
    }
    
}
<bean id="weapon"
      class="com.snowcat471.spring.Road">
</bean>

<bean id="mage"
      class="com.snowcat471.spring.Mage">
	
	<constructor-arg ref="weapon" />
  
</bean>
  1. setter injection
public class Mage implements Character {

    private Weapon weapon;
    
    public setWeapon(Weapon weapon) {
    	this.weapon = weapon;
    }
    
}
<bean id="weapon"
      class="com.snowcat471.spring.Road">
</bean>

<bean id="mage"
      class="com.snowcat471.spring.Mage">
	
	<property name="weapon" ref="weapon" />
  
</bean>
profile
back-end developer

0개의 댓글