본문 바로가기
강의 실습/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 JdbcTemplate

by jint 2026. 3. 14.

- 순수 JDBC와 동일한 build.gradle 환경설정
- 순수 JDBC 코드를 줄인 결과물 : Template은 템플릿 메서드 패턴을 많이 활용하여 이름이 붙음
- 실무에서도 많이 쓰임
- 스프링 JdbcTemplate, MyBatis 같은 라이브러리는 JDBC API의 반복 코드를 대부분 제거하지만, SQL은 직접 작성


1. 스프링 JdbcTemplate 회원 리포지토리
- src/main/java/hello/hello_spring/repository/JdbcTemplateMemberRepository.java

package hello.hello_spring.repository;

import hello.hello_spring.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.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class JdbcTemplateMemberRepository implements MemberRepository {

    private final JdbcTemplate jdbcTemplate;

    @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 (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }

}



2. JdbcTemplate을 사용하도록 스프링 설정 변경
- src/main/java/hello/hello_spring/SpringConfig.java

...
    @Bean
    public MemberRepository memberRepository() {
        // return new MemoryMemberRepository();
        // return new JdbcMemberRepository(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }
...


소스 구현 후, MemberServiceIntegrationTest을 통해 통합 테스트를 진행한다.
나도 모르는 곳에서 에러가 날 수 있으니 꼭 테스트 작성하고, 잘 작성하도록 항상 고민하자.

-> 현업 개발자들이 코드짜는 시간의 70~80%를 테스트 코드를 작성하고 나머지 시간에 프로덕션 코드를 작성한다.
작은 버그 하나가 수십억의 피해로 돌아오기 때문이다.
개발 잘하는 사람일수록, 테스트 코드와 테스트 케이스 꼼꼼히 작성한다.


참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8?cid=325630

 

[지금 무료]스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 120,745명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다. 예제를 만들면서 자연스럽게 스

www.inflearn.com

'강의 실습 > 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 카테고리의 다른 글

스프링 데이터 JPA  (0) 2026.03.16
JPA  (0) 2026.03.15
스프링 통합 테스트  (0) 2026.03.13
순수 JDBC  (1) 2026.03.12
H2 데이터베이스 설치  (0) 2026.03.11

댓글