[스프링 입문] Section07. 스프링 DB 접근 기술[4] - 스프링 JdbcTemplate

Euiyeon Park·2025년 6월 17일

갓영한 스프링🍀

목록 보기
8/12
post-thumbnail

JDBC Template

  • 순수 JDBC와 동일한 환경 설정
  • JdbcTemplate은 JDBC의 반복 코드를 제거
  • 단, SQL은 직접 작성해야 함

📂 JdbcTemplateMemberRepository

public class JdbcTemplateMemberRepository implements MemberRepository {
    private final JdbcTemplate jdbcTemplate;

    // 생성자가 1개인 경우 @Autowired 생략가능
    // JdbcTemplateMemberRepository에 DataSource객체를 주입
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        // SimpleJdbcInsert : JdbcTemplate을 만들어서 넘김
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);

        // 테이블명, PK를 넘기면 insert문 쿼리 작성할 필요❌
        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;
    }

    // 📌 조회는 쿼리 실행의 결과를 RowMappeer로 매핑이 필요
    @Override
    public Optional<Member> findById(Long id) {
        // query() : 반환타입 List, SQL 쿼리 결과를 조회하고 객체로 매핑
        // query(String sql, RowMapper<T> rowMapper)
        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());
    }

    // 📌 RowMapper
    private RowMapper<Member> memberRowMapper(){
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
}
profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글