[Spring] JDBC Template

Dodam·2023년 8월 4일
0

[Spring]

목록 보기
2/9
post-thumbnail

Template 패턴

  • 어떤 소스 코드상의 알고리즘에서 특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용하게 사용하는 패턴

  • Template 패턴의 장점

    • 코드 중복 감소
    • 자식 클래스의 역할을 감소시키면서 핵심 로직 관리 용이
    • 객체 추가 및 확장이 용이
    • 재사용성 증가

JDBC Template

  • 스프링의 가장 기본적인 Data Access 템플릿으로, 쿼리 기반으로 데이터 베이스에 접근 가능
  • 모든 영속성 프레임워크는 내부적으로 JDBC API를 이용
  • DAO 계층에서 Jdbc Template API를 사용
  • JDBC Template의 경우, 제네릭을 사용해 어떠한 값이 오든 그대로 반환

영속성 프레임워크의 종류

  • SQL Mapper: MyBatis, Ibatis, JDBC Template
  • ORM: JPA, Hibernate

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를 사용

Spring JDBC

  • Spring JDBC가 하는 일
    - Connection 및 Statement 열기와 닫기 기능 실행
    - Statement 실행
    - ResultSet 처리
    - Exception 처리
    - Transaction 처리

  • 개발자가 Spring JDBC에서 하는 일
    - DataSource를 설정
    - JDBCTemplate에서 dataSource를 주입
    - 메소드에 SQL문 작성
    - JDBC Template 메소드를 활용해 쿼리문 처리

  • JDBC Driver
    : DBMS가 이해할 수 있는 프로토콜로 변환해주는 어댑터

  • DBCP(DB Connection Pool): DB와 커넥션을 맺고 있는 객체를 관리하는 역할

    • DB Connection Pool을 사용하는 이유
      : DB를 연결할 때마다 Driver를 로드하고 커넥션 객체를 반복적으로 작업해야 하는데, Connection Pool을 만들어 반복하지 않게 해준다.
    • WAS를 실행시키면
      1) 미리 DB Connection 객체를 생성하고
      2) Pool이라는 공간에 저장했다가
      3) 요청이 오면 저장소에서 가져다 쓰고 반환한다.
    • 이로 인해 시간 및 자원의 절약이 가능

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));
    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;
            }
        };
    }
profile
Good things take time

0개의 댓글