본문 바로가기
프로그래밍/SpringMVC_기초

회원 관리 예제 - 13(스프링 JDBC Template)

by ILove_NS_MoKa 2023. 10. 25.

순수 Jdbc와 동일한 환경설정을 하면 된다.

스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분

제거해준다. 하지만 SQL은 직접 작성해야 한다.

 

 

JdbcTemplate은 JDBC 코어 패키지의 중앙 클래스로 JDBC의 사용을 단순화하고 일반적인 오류를 방지하는데 도움이 된다. 개발자가 JDBC를 직접 사용할 때 발생하는 다음과 같은 반복 작업을 대신 처리해준다.

 

  • 커넥션 획득
  • statement를 준비하고 실행
  • 결과를 반복하도록 루프를 실행
  • 커넥션 종료, statement 및 resultset 종료
  • 트랜잭션을 다루기 위한 커넥션 동기화
  • 예외 발생 시 스프링 예외 변환기 실행

 

쉽게 말해 JdbcTemplate은 개발자가 JDBC 기술을 쉽게 사용할 수 있도록 도와주는 클래스이다.

 

 

참고)

[Spring] JDBC(Java Database Connectivity)란? JDBC 드라이버란?

 

[Spring] JDBC(Java Database Connectivity)란? JDBC 드라이버란?

JDBC의 등장 배경 애플리케이션 서버에서 DB를 연결하기 위해선 어떤 동작이 필요할까? 1. 커넥션 연결 : 주로 TCP/IP를 사용해 애플리케이션 서버와 DB서버가 연결된다. 2. SQL 전달 : 애플리케이션 서

code-lab1.tistory.com

 

hello\hellospring\repository\JdbcTemplateMemberRepository.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
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;
    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 List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }
    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
        return result.stream().findAny();
    }
    private RowMapper<Member> memberRowMapper() {
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
}
cs

 

 

hello\hellospring\SpringConfig.java

memberRepository 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package hello.hellospring;
 
import hello.hellospring.repository.JdbcMemberRepository;
import hello.hellospring.repository.JdbcTemplateMemberRepository;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import javax.sql.DataSource;
 
@Configuration
public class SpringConfig {
 
    private DataSource dataSource;
    @Autowired  //이걸보고 Spring이 자체적을 빈도 생성해 준다.
    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);
        //추가
        return new JdbcTemplateMemberRepository(dataSource);
    }
}
 
cs