티스토리 뷰
728x90
반응형
1. 정의
일반적으로 사용하는 JUnit Test와 많은 점이 같다. 다만 ApplicationContext를 사용하고 또 JUnit 테스트 메서드 사이에서 같은 ApplicationContext가 공유된다는 것을 의미한다.
왜 이것이 중요한가?
Bean이 몇개만 존재한다면 그렇게 문제될것은 없다. 하지만 application이라는 것을 만들때 Bean 이 한두개 뿐이겠는가? 당연 수도없이 많을 것이다.
이럴때 JUnit를 한번 돌리기 위해 ApplicationContext를 init하는데 이 많은 시간이 걸릴것이므로 Spring은 한번 만들고 그것들을 공유할 수 있도록 해준다.
물론 spring 자체가 applicationContext가 생성될때 만드는 모든 빈들을 singleton object로 만들기 때문에 그나마 빠르게 init되지만...이정도로는 안된다.
왜냐하면 JUnit method 하나 하나마다 이 applicationContext가 생성이 되기 때문이다.!!!!
그래서 Spring은 applicationContext를 생성하고 공유하는 것이다.
2.예제
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:config/spring/application-context.xml")
public class ibatisTest {
@Autowired ApplicationContext context;
@Before
public void setUp(){
this.dao = this.context.getBean(userDao",UserDao.class");
}
|
똑같은 내용...그러나 @Autowired의 대상이 dao로 바뀌었다. @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:config/spring/application-context.xml")
public class ibatisTest {
@Autowired UserDao dao;
|
위의 예에서 보면 참 이상하게도 ApplicationContext Object를 생성하지 않았는데도.. setUp()에서 잘 사용하고 있다...물론 에러는 나지 않는다..왜 그럴까?
바로 Annotation @Autowired라는 스프링DI에 사용되는 특별한 애노테이션때문이다!!!
3. @Autowired란?
이 어노테이션이 붙어있으면 변수의 타입과 일치하는 빈을 Context내에서 찾고 있으면 인스턴스 변수에 주입해준다.!
그런데 Application.xml 안 또는 @Configuration이라고 붙어 있는 것중 ApplicationContext bean이 있을까??? 당연히 있으니 위의 테스트 예제가 돌아가는 것이다.
하지만 그 어디에도 이 bean 이 등록되어 있는 부분은 없다..(사실 spring 내부 어디엔가는 있겠지..^^;) 스프링은 applicationContext가 초기화될때 자기 자신도Bean으로 등록한다.
만약 등록된 Bean 이 두개 이상일때는 변수명이 같은것을 DI해준다.
4. 질문!!!
만약 DB 커넥션을 사용할때 항상 simpleDirverDataSoure를 사용하려는 사람이 있다. 그리고 이 사람은 "왜 복잡하게 DataSource Interface를 사용해서 DI를 통해서 주입시키는 방식을 써야하나?"라는 질문을 가지고 있다...이런 질문엔 3가지 이유를 당당히 말해주자!!
1)소프트웨어란 절대 바뀌지 않는 것은 없다!
클래스 대신 인터페이스를 사용하고, new를 이용해 생성하는 대신 DI를 통해 주입받게 하는 건 아주 단순하고 쉬운 작업이다.
2)클래스의 구현 방식은 바뀌지 않는다고 해도 인터페이스를 이용해서 DI를 하면 다른 차원의 서비스 기능을 도입할 수 있다.
그 대표적인 기능은 AOP이다.
3)효율적인 테스트를 손쉽게 만들기 위해서이다.!!!
5. 테스트 방법
5.1. 첫번째 방법!
(설정파일<xml file>을 바꾸지 않고 소스상에서 살짝 바꾸자>
@DirtiesContext --테스트 메소드에서 애플리케이션 컨텍스트의 구성이나 상태를 변경한다는 것을 테스트 컨텍스트 프레임워크에 알려준다.
다시말해서 ApplicationContext를 공유하지 않고 테스트 메소드를 수행하고 나면 매번 새로 만든다.!!
그러나 이건 별로 추천하는 게 아니다.
차라리 application-context.xml을 새로 하나 더 만들고 그것을 가져다 쓰는것이 훨낫다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:config/spring/application-context.xml")
@DirtesContext
public class ibatisTest {
@Autowired UserDao dao;
@Before
public void setUp(){
DataSource dataSource = new SingleConnectionDataSource(
"jdbc:mysql://localhost/testdb","spring","book",true);
dao.setDataSource(dataSource) --> 코드에 의한 수동DI
}
|
5.2. 두번째 방법
(설정파일을 test, production 용으로 두개를 만든다)
5.3. 세번째 방법( the most recommend)
(Spring Container없이 테스트 한다.)
어노테이션을 사용하지 않고 그냥 객체를 생성해서 DI방식으로 주입시켜 사용하면 된다. 보통 JUnit 방식이라고 생각하면 된다.
반응형
'이제 관심밖의 IT 기술 > Spring' 카테고리의 다른 글
1장. Spring 오브젝트와 의존관계 (0) | 2011.07.08 |
---|
댓글
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- git proGit
- BC주
- Certificate
- cert
- Canada
- 옥빌
- RHEL
- ansible
- Red Hat
- 캐나다부동산
- RHCE
- BTBS
- 캐나다
- 미시사가
- 토론토
- 인터넷
- 부동산분석
- 정착서비스
- docker
- 부모님초청이민
- Jay
- 벌링턴
- 토론토정착서비스
- certification
- 온타리오
- 밀튼
- 우드워킹
- basement
- redhat
- TORONTO
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함