[Spring5입문] DB 연동

2021. 9. 14. 18:19CSE/Spring

1. JDBC 프로그래밍의 단점을 보완하는 스프링

- JDBC API를 이용하면 데이터 처리와 상관없는 코드를 반복적으로 사용하게 된다.

- 구조적인 반복을 줄이기 위한 방법은 템플릿 메서드 패턴과 전략 패턴을 함께 사용하는 것이다.

=> 스프링은 이 두 패턴을 엮은 JdbcTemplate 클래스를 제공한다

- 스프링의 @Transactional 애노테이션을 사용하면 트랜잭션 관리가 쉽다.

 

2. 예시

public class MemberDao {

	private JdbcTemplate jdbcTemplate;

	public MemberDao(DataSource dataSource){
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public Member selectByEmail(String email) {
		List<Member> results = jdbcTemplate.query(
				"select * from MEMBER where EMAIL = ?", new RowMapper<Member>(){
					@Override
					public Member mapRow(ResultSet rs, int rowNum) throws SQLException{
						Member member = new Member(
								rs.getString("EMAIL"),
								rs.getString("PASSWORD"),
								rs.getString("NAME"),
								rs.getTimestamp("REGDATE").toLocalDateTime());
						member.setId(rs.getLong("ID"));
						return member;
					}
				}, email);
		return results.isEmpty() ? null : results.get(0);
	}
}
@Configuration
public class AppCtx {

    @Bean(destroyMethod = "close")
    public DataSource dataSource(){
        DataSource ds = new DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
        ds.setUsername("spring5");
        ds.setPassword("spring5");
        ds.setInitialSize(2);
        ds.setMaxActive(10);
        ds.setTestWhileIdle(true); // 유휴 커넥션 검사
        ds.setMinEvictableIdleTimeMillis(1000*60*3); // 최소 유휴 시간 3분
        ds.setTimeBetweenEvictionRunsMillis(1000*10); // 10초 주기
        return ds;
    }

    @Bean
    public MemberDao memberDao(){
        return new MemberDao(dataSource());
    }
}

- 위와 같이 MemberDao 클래스의 생성자가 DataSource를 주입받도록 구현한 후, 이를 이용해서 JdbcTemplate을 생성하면 된다.