Spring DI
: μ€νλ§ νλ μμν¬λ₯Ό μ¬μ©νμ¬ μμ‘΄μ± μ£Όμ
μ νλ λ°©λ²
λΉ λ±λ‘ λ°©λ²
1.
XML μ€μ 
a.
root-context.xml 
b.
<bean id=ββ class=ββ /> λΉ νκ·Έλ‘ λ±λ‘
2.
μ΄λ
Έν
μ΄μ
μΌλ‘ λ±λ‘
a.
@Component, @Service, @Repository, @Controller 
3.
μλ° λΉ μ€μ  νμΌλ‘ λ±λ‘
a.
@Configuration μ€μ  ν΄λμ€ μ μ
b.
@Bean 
κ°μ²΄λ₯Ό λ°ννλ λ©μλλ₯Ό μ μ
λΉ λ±λ‘ - XML μ€μ 
β’
root-context.xml
<!-- BoardDAO λΉμ μ μ -->
<bean id="boardDAO" class="com.aloha.spring.dao.BoardDAO">
</bean>
XML
볡μ¬
λΉ λ±λ‘ - @μ΄λ Έν μ΄μ 
| μ΄λ
Έν
μ΄μ
 | μν  | 
| @Component | μΌλ°μ μΈ μ€νλ§ λΉμΌλ‘ μ¬μ©λ¨. | 
| @Controller | Spring MVC 컨νΈλ‘€λ¬λ‘ μ¬μ©λλ ν΄λμ€λ₯Ό λνλ. | 
| @Service | λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μλΉμ€ ν΄λμ€λ₯Ό λνλ. | 
| @Repository | λ°μ΄ν° μ‘μΈμ€ κ°μ²΄ (DAO)λ₯Ό λνλ. | 
β’
servlet-context.xml
<context:component-scan base-package="com.aloha.spring" />
Java
볡μ¬
μ΄λ
Έν
μ΄μ
μΌλ‘ λΉμ λ±λ‘νλ €λ©΄, servlet-context.xml μ μ»΄ν¬λνΈ μ€μΊ νκ·Έλ₯Ό λ±λ‘ν΄μΌνλ€.
μ€νλ§ λΉμ κ²μν  base-package μμ±μ μ§μ νλ ν¨ν€μ§ νμμ κ²½λ‘μ μλ μ€νλ§ λΉ ν΄λμ€λ₯Ό μλμΌλ‘ κ²μνκ³  λΉμΌλ‘ λ±λ‘νλ€. 
β’
ν΄λμ€
@Component
public class MyComponent {
}
Java
볡μ¬
μ€νλ§ λΉμΌλ‘ λ±λ‘ν  ν΄λμ€λ `@Component` μ΄λ
Έν
μ΄μ
μ λΆμ¬μ£Όλ©΄ μ»΄ν¬λνΈ μ€μΊ μ, μΈμλμ΄ Ioc 컨ν
μ΄λμ λ±λ‘λλ€.
β’
BoardService.java
@Service
public class BoardService {
}
Java
볡μ¬
`@Service` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μ€νλ§ λΉ ν΄λμ€λ‘ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
β’
BoardDAO.java
@Repository
public class BoardDAO {
}
Java
볡μ¬
`@Repository` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λ°μ΄ν° μ‘μΈμ€ κ³μΈ΅μ ν΄λμ€μ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
β’
BoardControler.java
@Controller
public class BoardController {
}
Java
볡μ¬
`@Controller` μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ μΉ μ ν리μΌμ΄μ
μ 컨νΈλ‘€λ¬ ν΄λμ€λ‘ μ§μ νμ¬ Ioc 컨ν
μ΄ν°μ λΉμΌλ‘ λ±λ‘λλ€.
λΉ λ±λ‘ - μλ° μ€μ  νμΌλ‘ λ±λ‘(μ»΄ν¬λνΈ μ€μΊ)
β’
Config.java
@Configuration		// μ€νλ§ μ€μ  λΉμΌλ‘ λ±λ‘
public class Config {
	// 1. κ°μ²΄λ₯Ό λ°ννλ λ©μλλ₯Ό μ μ
	// 2. λ©μλμ @Bean μ΄λ
Έν
μ΄μ
 μ μ
	
	@Bean			// IoC 컨ν
μ΄λμ λΉμΌλ‘ λ±λ‘
	public Board board() {
		return new Board("μ λͺ©", "μμ±μ", "λ΄μ©");
	}
	
}
Java
볡μ¬
β’
`@Configuration` : ν΄λμ€λ₯Ό μ€νλ§μ Java κΈ°λ° μ€μ  ν΄λμ€λ‘ μ§μ 
β’
`@Bean` : @Configuration μ΄λ
Έν
μ΄μ
μ κ°μ§ ν΄λμ€ λ΄μμ λ©μλμ λΆμ¬νμ¬ ν΄λΉ λ©μλκ° μ€νλ§ λΉ(Bean)μ μμ±νκ³  κ΄λ¦¬νλλ‘ μ§μ 
β’
pom.xml
: @Configuration μ΄λ
Έν
μ΄μ
μ μ¬μ©νκΈ° μν΄μλ. CGLIB μμ‘΄μ±μ΄ νμ
<!-- CGLIB -->
		<dependency>
		    <groupId>cglib</groupId>
		    <artifactId>cglib</artifactId>
		    <version>3.1</version>
		</dependency>
		
		<dependency>
		    <groupId>cglib</groupId>
		    <artifactId>cglib-nodep</artifactId>
		    <version>3.1</version>
		</dependency>
XML
볡μ¬
CGLIB
μλ° νλ‘μ κ°μ²΄λ₯Ό μμ±νκ³  μμ νκΈ° μν λΌμ΄λΈλ¬λ¦¬
AOP(Aspect-Oriented Programming)μ DI(Dependency Injection)λ₯Ό ꡬννλ λ° μ¬μ©
μμ‘΄μ± μλ μ£Όμ
μμ‘΄μ± μλ μ£Όμ λ°©λ²
β’
κΈ°λ³Έ μμ‘΄μ± μλ μ£Όμ
β’
νμ
 κΈ°λ° μ£Όμ
β’
μμ±μ μ£Όμ
β’
λ©μλ μ£Όμ
μμ‘΄μ± μλ μ£Όμ μ΄λ Έν μ΄μ 
β’
@Autowired
β’
@Resource
β’
@Inject
μμ‘΄μ± μλ μ£Όμ λ°©λ²
κΈ°λ³Έ μμ‘΄μ± μλ μ£Όμ
β’
`@Autowired` : μμ‘΄μ± μλ μ£Όμ
 μ΄λ
Έν
μ΄μ
μ€νλ§ μ»¨ν
μ΄λκ° λΉμ μμ‘΄μ±μ μλμΌλ‘ ν΄κ²°νλλ‘ μ§μ
@Autowired
private MyBean myBean;
Java
볡μ¬
νμ κΈ°λ° μ£Όμ
β’
λΉ μ΄λ¦μ μ§μ ν΄μ μμ‘΄μ± μ£Όμ
νκΈ°
β¦
@Autowired
β¦
@Qualifier("λΉμ΄λ¦")
@Autowired
@Qualifier("myBean")
private MyBean myBean;
Java
볡μ¬
μμ±μ μ£Όμ
@Service
public class BoardService {
    private BoardDAO boardDAO;
    @Autowired
    public BoardService(BoardDAO boardDAO) {
        this.boardDAO = boardDAO;
    }
}
Java
볡μ¬
λ©μλ μ£Όμ
@Service
public class BoardService {
    private BoardDAO boardDAO;
    @Autowired
    public void setBoardDAO(BoardDAO boardDAO) {
        this.boardDAO = boardDAO;
    }
}
Java
볡μ¬
μμ‘΄μ± μλ μ£Όμ μ΄λ Έν μ΄μ 
β’
@Autowired
β’
@Resource
β’
@Inject
@Autowired
@Autowired(required = [false/true])
Java
볡μ¬
@Autowired μ¬μ©
β’
νλ(λ³μ)μ μ¬μ©
β’
μμ±μμ μ¬μ©
β’
λ©μλμ μ¬μ©
β’
νλ(λ³μ)μ μ¬μ©
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	// νλμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	@Autowired
	private BoardDAO boardDAO;    // λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
	
	...
}
Java
볡μ¬
β’
μμ±μμ μ¬μ©
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	private final BoardDAO boardDAO;
	
	@Autowired    // μμ±μμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	public BoardServiceImpl(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
	}
	
	...
}
Java
볡μ¬
β’
μν μμ‘΄μ± λ°©μ§
β’
νμ μμ‘΄μ± κ°μ 
β’
λ©μλμ μ¬μ©
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	private final BoardDAO boardDAO;
	
	@Autowired    // λ©μλμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	public setBoardDAO(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
	}
	
	...
}
Java
볡μ¬
μ€νλ§ νλ μμν¬μμ μλμΌλ‘ ν΄λΉ λ©μλλ₯Ό νΈμΆνμ¬, νμν μμ‘΄μ±μ μ£Όμ
ν©λλ€.
 @Autowired - required μ΅μ
 @Autowired - required μ΅μ
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	// νλμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	@Autowired(required = false)
	private BoardDAO boardDAO;    // λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
	
	...
}
Java
볡μ¬
β’
@Autowired(required = false)
β¦
νμκ° μλλ€. 
β¦
ν΄λΉ κ°μ²΄κ° λΉμΌλ‘ λ±λ‘λμ΄ μμ§ μμΌλ©΄ null λ‘ μ§μ 
β¦
λ±λ‘λμ§ μλ λΉμ κ°μ Έμ¬ λ, μλ¬ λ°©μ§ν  μ μλ€.
β’
@Autowired(required = true)   [κΈ°λ³Έκ°]
β¦
true μΆμ
κ°μ΄ κΈ°λ³Έκ°μΌλ‘, μλ΅ν΄λ λμΌνκ² μ μ©λ©λλ€.
required : νμ (νμκ° μ¬λΆλ₯Ό μ§μ ν  λ μ£Όλ‘ μ¬μ©νλ ν€μλ)
@Qualifier μ΄λ Έν μ΄μ 
κ°μ νμ
(λΆλͺ¨ ν΄λμ€, μΈν°νμ΄μ€)μ μ¬λ¬ λΉμ΄ μλ κ²½μ°, λΉ μ΄λ¦μ κΈ°μ€μΌλ‘ μμ‘΄μ± μ£Όμ
μ ν΄μ£Όλ μ΄λ
Έν
μ΄μ
β’
PostService
public interface PostService {
	
	...
}
Java
볡μ¬
β’
BoardServiceImpl
@Service("boardService")  // λΉ μ΄λ¦μ "boardService" λ‘ λΉ λ±λ‘
public class BoardServiceImpl implements PostService {
	
}
Java
볡μ¬
β’
CommentServiceImpl
@Service("commentService") // λΉ μ΄λ¦μ "commentService" λ‘ λΉ λ±λ‘
public class CommentServiceImpl implements PostService {
	
}
Java
볡μ¬
β’
Main
@Component
public class Main {
	
	@Autowired
	@Qualifier("boardService")  // "boardService" λΌλ μ΄λ¦μ λΉ μ£Όμ
(boardServiceImpl)
	private PostService boardService;
	@Autowired	
	@Qualifier("commentService") // "commentService" λΌλ μ΄λ¦μ λΉ μ£Όμ
(commentServiceImpl)
	private PostService commentService;
}
Java
볡μ¬
boardServiceImpl, commentServiceImpl λ λΉ(κ°μ²΄) λͺ¨λ PostService νμ
μ
λλ€. μμ‘΄μ± μλ μ£Όμ
μ νκΈ° μν΄μ μλμ κ°μ΄ μ½λλ₯Ό μμ±νλ©΄ μ΄λ€ λΉμ κ°μ Έμ¬ μ§ λͺ¨νΈν΄μ§κ³ , λν μλ¬κ° λ°μν©λλ€.
@Autowired
private PostService boardService;
Java
볡μ¬
λ°λΌμ, @Qualifier μ΄λ
Έν
μ΄μ
μ μ¬μ©ν΄μ μμ‘΄μ± μ£Όμ
 μ λΉ μ΄λ¦μ κΈ°μ€μΌλ‘ μ νν λΉμ μ£Όμ
ν  μ μμ΅λλ€.
@Resource
μμ‘΄μ± μλ μ£Όμ
μ νλ μ΄λ
Έν
μ΄μ
μ€νλ§ νλ μμν¬μ κΈ°λ°μ΄ μλλΌ javax ν¨ν€μ§μ κΈ°λ°νλ μ΄λ
Έν
μ΄μ
@Resource(name = "λΉ μ΄λ¦")
Java
볡μ¬
β’
@Autowired 
β¦
ν¨ν€μ§ :  org.springframework.beans.factory.annotation
β¦
Spring μ μ©μ μ΄λ
Έν
μ΄μ
β¦
νμ
μ κΈ°μ€μΌλ‘ μμ‘΄μ± μλ μ£Όμ
β’
@Resource 
β¦
ν¨ν€μ§ :  javax.annotation
β¦
Java νμ€ μ΄λ
Έν
μ΄μ
β¦
μ΄λ¦μ κΈ°μ€μΌλ‘ μμ‘΄μ± μλ μ£Όμ
@Resouce μ΄λ Έν μ΄μ  μ¬μ©
β’
νλμ μ¬μ©
β’
λ©μλ μ μ¬μ©
β’
νλμ μ¬μ©
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	// νλμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	@Resource(name = "boardDAOBean")    // λΉ μ΄λ¦μ κΈ°μ€μΌλ‘ μμ‘΄μ± μ£Όμ
	private BoardDAO boardDAO;    // λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
	
	...
}
Java
볡μ¬
@Repository("boardDAOBean")   // @Repository("λΉ μ΄λ¦")
public class BoardDAO {
	...
}
Java
볡μ¬
β’
λ©μλ μ μ¬μ©
@Service // μμ‘΄μ±μ μ£Όμ
 λ°λ ν΄λμ€λ λΉμΌλ‘ λ±λ‘λμ΄μμ΄μΌνλ€.
public class BoardServiceImpl implements BoardService {
	
	private final BoardDAO boardDAO;
	
	@Resource("boardDAOBean")    // λ©μλμ μ¬μ© - μμ‘΄μ± μλ μ£Όμ
	public setBoardDAO(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
	}
	
	...
}
Java
볡μ¬
@Inject
μλ° κΈ°λ°μ μμ‘΄μ± μ£Όμ
 μ΄λ
Έν
μ΄μ
β’
νλ μ£Όμ
, μμ±μ μ£Όμ
, λ©μλ μ£Όμ
 λͺ¨λ κ°λ₯ν©λλ€.
β’
BeanFactory 
β¦
Spring IoC 컨ν
μ΄λμ μ‘μΈμ€νκΈ° μν 루νΈΒ μΈν°νμ΄μ€
β¦
λΉ(Bean) κ°μ²΄μ μμ±, ꡬμ±, λ° κ΄λ¦¬λ₯Ό λ΄λΉ
β’
ApplicationContext
β¦
BeanFactoryλ₯Ό νμ₯ν μΈν°νμ΄μ€
β¦
λΉμ 미리 μ΄κΈ°ν, κ΅μ ν μ§μ, μ΄λ²€νΈ λ°ν, 리μμ€ λ‘λ© λ± λ λ§μ κΈ°λ₯μ μ κ³΅
β¦
AOP ν΅ν©, μ΄λ²€νΈ κ²μ, λͺ¨λ  μ νμ Bean λ²μ λ±μ μ§μ
β’
XmlBeanFactory
β¦
BeanFactory ꡬν μ€ νλλ‘, XML νμΌμμ λΉ μ€μ  μ λ³΄λ₯Ό λ‘λνλ λ° μ¬μ©
β¦
Spring 3.1λΆν° deprecated
β’
AnnotationConfigApplicationContext
β¦
μ΄λ
Έν
μ΄μ
 κΈ°λ°μ μ€μ μ μ¬μ©νμ¬ μ€νλ§ λΉμ κ΄λ¦¬νλ 컨ν
μ΄λ
β¦
@Configuration μ΄λ
Έν
μ΄μ
κ³Ό @ComponentScan μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ μ€μ  μ λ³΄λ₯Ό μ§μ 
β’
ClassPathXmlApplicationContext
β¦
ν΄λμ€ν¨μ€(classpath)μμ XML νμΌμ λ‘λνμ¬ μ€νλ§ λΉμ 컨ν
μ΄λ
β¦
μ£Όλ‘ XML νμΌ κΈ°λ°μ μ€μ μ μ¬μ©ν  λ νμ©
β’
FileSystemXmlApplicationContext
β¦
νμΌ μμ€ν
μμ XML νμΌμ λ‘λνμ¬ μ€νλ§ λΉμ ꡬμ±νλ 컨ν
μ΄λ
β¦
ν΄λμ€ν¨μ€ μ΄μΈμ κ²½λ‘μμ XML νμΌ κΈ°λ°μ μ€μ μ μ¬μ©ν  λ μ¬μ©
β’
XmlWebApplicationContext
β¦
μΉ νκ²½μμ νμν λΉ λ° μ€μ μ κ΄λ¦¬νλ 컨ν
μ΄λ
β¦
μ£Όλ‘ μλΈλ¦Ώ κΈ°λ°μ μΉ μ ν리μΌμ΄μ
μμ μ¬μ©
IoC 컨ν μ΄λ κ°μ²΄λ₯Ό μμ±ν΄μ λΉ κ°μ Έμ€κΈ°
β’
μ»΄ν¬λνΈ ν¨ν€μ§λ₯Ό μ§μ ν΄μ κ°μ Έμ€κΈ°
β’
@Configuration μ€μ  ν΄λμ€λ‘λΆν° κ°μ Έμ€κΈ°
β’
XML μ€μ νμΌλ‘λΆν° κ°μ Έμ€κΈ°
μ»΄ν¬λνΈ ν¨ν€μ§λ₯Ό μ§μ ν΄μ κ°μ Έμ€κΈ°
ApplicationContext context = new AnnotationConfigApplicationContext("com.aloha.spring"); // ν¨ν€μ§ μ΄λ¦ μ§μ 
Board board = context.getBean(Board.class);
Java
볡μ¬
@Configuration μ€μ  ν΄λμ€λ‘λΆν° κ°μ Έμ€κΈ°
β’
Config.java
@Configuration		// μ€νλ§ μ€μ  λΉμΌλ‘ λ±λ‘
public class Config {
	// λΉμ λ±λ‘ν΄μ£Όλ ν΄λμ€λ‘ μ§μ 
	
	// μλ° μ½λλ‘ λΉμ λ±λ‘νκ² λ€.
	// 1. κ°μ²΄λ₯Ό λ°ννλ λ©μλλ₯Ό μ μ
	// 2. λ©μλμ @Bean μ΄λ
Έν
μ΄μ
 μ μ
	
	@Bean			// IoC 컨ν
μ΄λμ λΉμΌλ‘ λ±λ‘
	public Board getBoard() {
		return new Board("μ λͺ©", "μμ±μ", "λ΄μ©");
	}
}
Java
볡μ¬
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Board board = context.getBean(Board.class);
Java
볡μ¬
XML μ€μ νμΌλ‘λΆν° κ°μ Έμ€κΈ°
ApplicationContext context = new ClassPathXmlApplicationContext("root-context.xml"); // XML νμΌ κ²½λ‘ μ§μ 
Board board = context.getBean(Board.class);
Java
볡μ¬
Spring Legacy νλ‘μ νΈμ κ²½μ°, μμ(리μμ€) νμΌκ³Ό μ€μ  νμΌμ μ μ₯νλ κΈ°λ³Έ κ²½λ‘λ src/main/resources λλ ν λ¦¬μ
λλ€.





