본문 바로가기

Spring

JdbcTemplate

3일동안 중복 예외 처리가 안돼서 db에 회원가입이 되지않았다.. 다시 강의보면서 계속 매달렸는데 알고보니 sql구문에서 매개변수 name을 "name"이라고 문자열로 엮는 바람에 중복된 객체가 있는지 확인하는 findByName에서 객체에서 확인되지않아 중복처리가 안되는거였다.... 그것도 모르고 sql문 놔두고 서비스클래스랑 db연동하는 클래스만 계속 다시 짰다... 

이 작은 문제를 알아차리지 못해 시간을 버린거같아 너무 속상했지만 이 또한 경험치가 되기를....ㅎ 

 

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional : 테스트케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

 

순수한 자바코드로 최소한의 단위로 테스트 하는것을 단위 테스트라고 부르고, 스프링 컨테이너와 DB까지 연동해서 하는 테스트를 통합 테스트라고 한다.

 

*가급적이면 순수한 단위 테스트로 쪼개서 하는 테스트가 좋은 테스트일 확률이 높다.

 

스프링 JdbcTemplate

-순수한 jdbc와 동일한 환경설정으로 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL문은 직접 작성해야 한다.

 

@Override
public Optional<Member> findById(Long id) {
    String sql = "select * from member where id = ?";

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setLong(1, id);

        rs = pstmt.executeQuery();

        if(rs.next()){
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return Optional.of(member);
        }else{
            return Optional.empty();
        }
    } catch (SQLException e) {
        throw new IllegalStateException(e);
    } finally {
        close(conn, pstmt, rs);
    }
}

이랫던 코드를

@Override
public Optional<Member> findById(Long id) {
    List<Member> result =  jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
    return result.stream().findAny();
}

 

이렇게 할 수 있는 JdbcTemplate! 

 

*하지만 이것도 스프링처럼 깊이가 있는 지식이 필요함으로 공부를 충분히 하고 사용해야 한다!