본문 바로가기

프로그래밍/- Spring

[ 스프링 DB 접근 기술 ] 스프링 통합 테스트 / 스프링 JdbcTemplate

 

 

스프링 통합 테스트

 

➡️ 스프링 컨테이너와 DB까지 연결한 통합 테스트

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

  🔸@Transactional : 테스트 케이스에 사용하면 테스트 시작 전에 트랜잭션 시작 > 완료 후 항상 롤백 >> DB에 데이터가 남지 않아 다음 테스트 계속 반복 가능 (중복 예외에 걸리지 않음)

 

➡️ 단위 테스트 : MemberServiceTest와 같이 자바 코드만으로 최소한의 단위로 테스트 하는 것

  🔸테스트가 가볍고(빠르고) 단위별로 쪼개어 테스트하기 때문에 테스트의 질이 더 좋을 가능성이 높음

 

 

 

 

 

 

스프링 JdbcTemplate

 

 

➡️ 순수 Jdbc와 동일한 dependencies

 

➡️ 스프링 JdbcTemplate, MyBatis와 같은 라이브러리는 JDBC API에서 한 반복 코드를 대부분 제거 / SQL은 직접 작성

 

➡️ 순수 JDBC 코드에 비해 매우 간결해짐

 

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    // @Autowired  생성자가 하나면 Autowired 생략 가능
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {

        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName());

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
        member.setId(key.longValue());

        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {

        List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
        return result.stream().findAny();

    }

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

    @Override
    public List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }

    private RowMapper<Member> memberRowMapper(){
        return new RowMapper<Member>() {
            @Override
            public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
                Member member = new Member();
                member.setId(rs.getLong("id"));
                member.setName(rs.getString("name"));
                return member;
            }
        };
    }
}

 

➡️ JdbcTemplateMemberRepository가 잘 작동되는지는 만들어놓은 Jdbc 통합 테스트 돌려보면 간단하게 확인 가능