어떤 소스 코드상의 알고리즘에서 특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용하게 사용하는 패턴
Template 패턴의 장점
영속성 프레임워크의 종류
SQL Mapper: SQL을 직접 작성하고 Object 필드를 매핑하여 데이터를 객체화 하는 것
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
DataSource를 인자로 넣고 초기화 한다.
DataSource
Spring JDBC가 하는 일
- Connection 및 Statement 열기와 닫기 기능 실행
- Statement 실행
- ResultSet 처리
- Exception 처리
- Transaction 처리
개발자가 Spring JDBC에서 하는 일
- DataSource를 설정
- JDBCTemplate에서 dataSource를 주입
- 메소드에 SQL문 작성
- JDBC Template 메소드를 활용해 쿼리문 처리
JDBC Driver
: DBMS가 이해할 수 있는 프로토콜로 변환해주는 어댑터
DBCP(DB Connection Pool): DB와 커넥션을 맺고 있는 객체를 관리하는 역할
간단하게 데이터를 저장하기 위해 만들어진 구현체
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는 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;
}
};
}