테이블 스키마 초기화
UserDao findById, create method 구현
preparetestmin template 추가
database 접근 로직을 처리하기 위해 dao를 별도의 패키지(net.slipp.dao)를 만들고
그안에 user 모듈들을 관리할 수 있도록 패키지(net.slipp.dao.users)를 만든다.
src/main/java
ㄴnet/slipp/dao/users/UserDao.java
database를 연동과정을 살펴보기 위해 mybatis와 같은 프레임워크인를 사용하지 않고
springframework가 제공하는 기능(jdbc)을 활용해서 알아본다.
slipp.sql을 database에 초기화한다.
spring-jdbc 라이브러리를 추가해야 한다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
Dependency Hierarchy를 보면 의존성전의(추의)에 의해 몇가지가 더 추가된다.
spring-jdbc : 4.0.5.RELEASE
ㄴ spring-beans
ㄴ spring-core
ㄴ spring-tx
그러면 UserDao에 상속을 구현할 수 있다. extends JdbcDaoSupport
public class UserDao extends JdbcDaoSupport{
@PostConstruct
public void initialize() {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(new ClassPathResource("slipp.sql"));
DatabasePopulatorUtils.execute(populator, getDataSource());
}
}
DatabasePopulatorUtils클래스의 execute() 메소드를 실행하면 slipp.sql이 실행된다.
@PostConstruct을 추가해주면 UserDao가 스프링에 의해서 인스턴스되면서 initialize()가 호출되면서 초기화작업을 하게 된다.
JdbcDaoSupport에 DataSource가 전달되었다고 가정하고 getDataSource()를 한다.
UserDao 클래스를 프레임워크가 인스턴스를 생성하도록하고
<bean id="userDao" class="net.slipp.dao.users.UserDao" />
UserDao와 DataSource를 연결하는 설정을 추가 한다.
<bean id="userDao" class="net.slipp.dao.users.UserDao"
p:dataSource-ref="dataSource"/>
이렇게 스프링설정파일(applicationContext.xml)을 수정하였으면
잘 동작하는지 테스트(ApplicationContextTest.java)를 한다. 성공!!
사용자를 바로 추가하기 보다
앞에서(slipp.sql) 테이블을 생성하고 초기화한 한명의 사용자가 잘 들어갔는지
데이타베이스 콘솔화면에서 확인할 수 있지만
UserDao 클래스에 select query를 추가해서 확인해보자.
UserDao 에 대한 JUnit class를 만든다.(UserDaoTest)
UserDaoTest에서 스프링설정파일을 불러온다 (springtest template 으로 입력)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/applicationContext.xml")
테스트 하려고 하는 것은 UserDao이다. 그리고
스프링프레임워크가 UserDao 인스턴스가 생성하고 있기 때문에 주입받을 수 있다..
findById()메소드를 호출하기 전에 User 클래스를 net.slipp.domain.users 패키지에 생성한다.
findById()메소드는 구현에서 : UserDao
JdbcDaoSupport를 활용하면 spring jdbc에 의해서 jdbc API를 추상화한 API를 사용할 수 있다.
JDBC 코드를 리펙토링한 코드를 사용해보자.
userId를 이용해 spring jdbc api를 이용해보자. 메뉴얼은 아래와 같다.
getJdbcTemplate().queryForObject(sql, rowMapper, userId);
이 결과는 return type은 User 객체이다.
userId를 이용해서 api가 sql을 실행해서 결과를 mapper객체에 매핑해서 리턴해준다.
UserDaoTest에서 junit 테스트를 하면 성공!
user정보를 입력하지 않고 (테스트 데이터로) 입력이 잘 되는 지 확인을 할 수 있다.
log.debug(user.toString());
이렇게 정상적으로 동작한다면 데이터베이스 연동까지 잘 된것을 확인할 수 있다.
DataSource라는 커넥션풀링이 정상적으로 세팅이 되었고
UserDao클래스에서 초기화 initialize()하는 부분도 정상동작한다는 것을 알 수 있다.
이렇게 프로그램을 step-by-step 단계적으로 프로그램을 구현 확인 할 수 있기 때문에
웹서버를 띄워서 이 과정을 하나씩 확인하는 것 보다
JUnit같은 단위테스트를 추가해서 과정들이 정상적으로 잘 되는지 확인하고
다음단계로 간다면 버그 발생을 줄일 수 있다.
그러면 그 다음단계는 무엇을 해야 할까?
사용자를 추가할 수 있어야 한다. create()
추가한 사용자와 디비에 select한 user가 같으면 입력이 잘 된 것이다.
junit으로 테스트를 한다.
preparetestmin
${is1:importStatic('org.junit.Assert.*')}${is2:importStatic('org.hamcrest.CoreMatchers.*')}
'프로그래밍 > JAVA & SPRING' 카테고리의 다른 글
[백기선] 예제로 배우는 스프링 프레임워크입문 (Spring PetClinic ver 2019.02) (0) | 2020.06.07 |
---|---|
[기타] Spring 추천사이트 (0) | 2020.06.07 |
[박재성] Spring Web 8강 - database settings & connection pooling (0) | 2020.06.07 |
[박재성] Spring 기반 웹 프로그래밍 7강 - dependency injection (0) | 2020.06.07 |
[박재성] Spring 기반 웹 프로그래밍 6강 - logback settings (0) | 2020.06.07 |