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μ΄λ
Έν
μ΄μ
μΌλ‘ λΉ μ΄λ¦ μ§μ ν΄μ μ£Όμ
νλ €λ©΄, @Qualifier μ΄λ
Έν
μ΄μ
κ³Ό ν¨κ» μ¬μ©ν΄μΌν©λλ€.
@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 μ΅μ
@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
볡μ¬
@Resource μ΄λ
Έν
μ΄μ
μΌλ‘λ λΉ μ΄λ¦μ λ°λ‘ μ§μ ν΄μ μ£Όμ
ν μ μμ΅λλ€.
νλμ λ©μλμλ§ μ¬μ©μ΄ κ°λ₯ν©λλ€.
μμ±μ μ£Όμ
λ°©μμ μ§μνμ§ μμ΅λλ€.
β’
@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 λλ ν 리μ
λλ€.