스프링 JdbcTemplate

Sunny·2023년 2월 25일
0

🌱 스프링 JdbcTemplate

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

🌱 스프링 JdbcTemplate 회원 리포지토리

부분 설명을 먼저 하고 전체 코드를 보여주겠다.


private final JdbcTemplate jdbcTemplate;

// @Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}
  • 생성자가 1개이면 @Autowired 애노테이션은 생략해도 된다.
  • 스프링이 DataSource를 자동으로 Injection 해준다.

private RowMapper<Member> memberRowMapper() {
	return (rs, rowNum) -> {
    	Member member = new Member();
        member.setId(rs.getLong("id"));
        member.setName(rs.getString("name"));
        return member;
    }
}
  • 객체 생성을 위해 만들어주었다.
  • Replace with lambda 형식으로 해서 람다로 바꿔주었다.

@Override
public Optional<Member> findById(Long id) {
   List<Member> result = jdbcTemplate.query("select * from member where id =?", memberRowMapper(), id);
   return result.stream().findAny();
}
  • Optional로 반환해주면 된다.

@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;
}
  • 위와 같이 쓰면 쿼리가 필요없다.

다음은 전체 쿼리이다.

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;
        };
    }
}

🌱 JdbcTemplate을 사용하도록 스프링 설정 변경

@Configuration
public class SpringConfig {

    private final DataSource dataSource;

    @Autowired
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        //return new MemoryMemberRepository();
        //return new JdbcMemberRepository(dataSource); // JdbcMemberRepository를 스프링 빈으로 등록
        return new JdbcTemplateMemberRepository(dataSource);
    }
}

위와 같이 해주면 Test가 성공했음을 알 수 있다.

profile
개발에 재미를 붙여보기 :)

0개의 댓글