프로그래밍 언어/Java

[Java] JDBC 템플릿 공부

happy_life 2022. 3. 18. 14:17

김영한 선생님의 인프런 강좌로 java spring을 공부하고 있다. 따라하니까 구현도 금방금방되고 좋다. 그러나 코드가 내부적으로 정확히 어떤 동작을 하는지 그 원리에 대해 궁금해지기 시작해서 공부해보려고 한다.

JDBC 템플릿이란?

- jdbc와 마찬가지로 데이터를 저장하기 위해 도와주는 API. 다른 점은 SQL Mapper.

- 스프링의 가장 기본적인 Data Acess 템플릿으로 쿼리 기반으로 데이터 베이스에 접근 가능

- 모든 영속성 프레임 워크는 내부적으로 JDBC API를 이용

- DAO 계층에서 Jdbc Template API를 사용

- 제네릭을 사용해 어떤 값이 오든 그대로 반환

 

 

(*SQL Mapper: SQL을 직접 작성하고 Object필드를 매핑하여 데이터를 객체화 하는 것)

 

초기화

public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

DataSource 를 인자로 넣고 초기화 한다.

 

*DataSource 는 또 뭔가?

 - DB Server와 연결 시키는 연결 팩토리

 - JDBC의 일부분

 - Connection의 정보를 가지고 있고 Bean으로 등록하여 인자를 넘겨준다.

 - DB Connection Pooling 기능을 가지고 있음

       (Connection Pooling은 DB 커넥션을 위한 하나의 프레임워크)

 - 기본적으로 BasicDataSource를 사용

 

 

SimpleJdbcInsert 란?

 간단하게 데이터를 저장하기 위해 만들어진 구현체

 

  1. SimpleJdbcInsert 객체를 만든다.

  2. withTableName메소드로 어떤 테이블에 데이터를 삽입할지를 설정한다.

  3. usingGeneratedKeyColumns 메소드로 어떤 칼럼을 자동으로 값을 받아올지 설정한다.

  4. executeAndReturnKey() 메서드는 인자를 데이터베이스에 저장하고 자동 생성된 주 키의 값을 반환한다. 값은 Number 타입이므로 적절하게 변환해서 사용한다.

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

 

RowMapper란?

RowMapper는 JDBC의 인터페이스인 ResultSet에서 원하는 객체로 타입을 변환하는 역할을 합니다. 기본적인 전략을 구현한 클래스는 Spring JDBC에서 제공을 합니다. 

 (기존의 JDBC에서는 resultset을 받았음)

//객체생성
    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;
            }
        };
    }

 

 

https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#jdbc

 

Data Access

The Data Access Object (DAO) support in Spring is aimed at making it easy to work with data access technologies (such as JDBC, Hibernate, or JPA) in a consistent way. This lets you switch between the aforementioned persistence technologies fairly easily, a

docs.spring.io