2013년 4월 12일 금요일

Spring 2일차



% Object Factory == Application Context == IoC

Bean == IoC 를 이용홰 관리되는 Object
Bean Factory == Bean 을 관리하는 Object
ApplicationContext == Bean Factory 를 확장한 IoC (각종 부가적인 기능을 제공)
Confituration Metadata == ...?
Bean 은 Spring 의 Singletone Register 에 의해 Singletone으로 관리된다. 따라서 getBean 메소드로 같은 Bean을 호출하더라도 하나의 Bean Object 를 Reference 한다.

Bean Scope == Bean이 생성되고 존재하고 적용되는 범위
DI == Defendency Injection (의존성 주입)
DI Container == DaoFactory 


-XML 을 이용한 DI
 
1. Connection Bean DI

@Bean -------------------------------------------> <bean
public ConnectionMaker 
connectionMaker(){  ----------------------------> id="connectionMaker"
     return new OracleConnectionMaker();-----> class="springbook.....OracleConnectionMaker" />
}


2. setConnectionMaker DI

userDao.setConnectionMaker(connectionMaker());
<property name"connectionMaker" ref="connectionMaker" />
name = set 을 제외한 함수이름
ref = parameter 의 의존성을 주입할 Bean 의 id ( 1번사항에서 id )

3. DataSource 를 XML 방식으로 값 주입

 <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource" >
     <property name="driverClass" value="com.mysql.jdbc.Driver" />
     <property name="url" value="jdbc:mysql://localhost/springbook" />
     <property name="username" value="root" />
     <property name="password" value="ampsetup" />
</bean>


- Junit 을 이용한 테스트기반의 프로그래밍 (TDD)


1. 기존 main 메소드에서 실행하는 코드를 별도의 UserDaoTest class 생성후 main을 다시 만들어 실행했음
 -> @Test 이용

public class UserDaoTest{
     
     @Test
     public void addAndGet() throws SQLExecption {   ------------ 반드시 public 으로 메소드 생성
          ApplicationContext context = new
~~~~~

}





2. if ~ else 문장으로 쿼리받은 데이터를 비교하는 방식을 assertThat 으로 치환

assertThat(user2.getname(), is(user.getName()));

user2.getName() 과 user.getName() 을 비교



3. 실제 main 부분

public static void main(String[] args){
     JUnitCore.main("springbook.user.dao.UserDaoTest");

}

JUnitCore 을 이용해서 테스트할 Class 를 넣어준다.

4. 테스트의 일관성을 위해 DB를 이용시 deleteAll() 과 getCount() 메소드를 추가함으로써
테스트 실행시 기존의 모든 데이터를 삭제 후에 코드를 수행한다.
이후 getCount를 통해 테스트코드가 몇레코드를 삽입하였는지 등을 체크할 수 있게 한다.


5. @Before

각 테스트 메소드에는 중복되는 ApplicationContext를 생성하고 Bean 을 get 하는 부분의 코드가 있다.
이를 모두 하나로 모아서 하나의 Context 설정을 따르기 위해서는
@Before 을 이용한 setUp() 메소드를 하나 정의한다.

@Befor
public void setUp(){
     ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
     this.dao = context.getBean("userDao", UserDao.class);

}


6. 모든 TEST class 가 하나의 ApplicationContext 를 공유하기위한 방법

public class UserDaoTest{
     @Autowired
     private ApplicationContext context;

@Before
public void setUp(){
     this.dao = this.context.getBean~~~  -------------> setUp 에 더이상 ApplicationConext를 생성하는 코드를 적지 않는다.


대신 모든 Test class에 @Befor이전의 Code를 적어야한다..(비슷한거같은데..)
하나의 Obejct 를 reference 한다는거 말곤 큰 차이는 없는듯 하다.

자 이제 2장을 끝냈고 3장에 Template Method Pattern 을 사용할 차례.. Exception 처리 부분의 코드를 최소화하는 과정인듯.

댓글 없음:

댓글 쓰기