본문 바로가기
Spring

jdbc와 jdbcTemplate

by yang sing 2022. 10. 21.

1. JDBC

- jdbc는 java database connectivity 의 약자로 java에서 데이터 베이스에 접근을 할 수 있게 만든 Java API다. 

- DriverManager 또는 Datasource 객체를 이용해 DB connection을 가져와서 사용한다.

- Statement, PreparedStatement 객체를 이용해 쿼리를 생성한다. 

- ResultSet 객체를 이용해 쿼리의 결과값을 받아 올 수 있다.

 

// DB config 파일에 bean 객체로 Datasoure 객체를 생성
@Bean
public DataSource dataSource() {
    HikariConfig hikariConfig = new HikariConfig();

    hikariConfig.setUsername(username);
    hikariConfig.setPassword(password);
    hikariConfig.setJdbcUrl(jdbcUrl);
    hikariConfig.setConnectionTestQuery("SELECT 1");
    hikariConfig.setMaximumPoolSize(100);
    hikariConfig.setLeakDetectionThreshold(30000);
    hikariConfig.setPoolName("MySQL-HikariCP");

    return new HikariDataSource(hikariConfig);
}


// bean 으로 등록한 datasource 객체 의존성 주입
@Autowired
private DataSource dataSource;
    
public void selectTest(){
	Connection con = null;
    Statement stmt = null;
    ResultSet result = null;
	try{
        // DB 연결을 위한 connection 객체 생성
        con = dataSource.getConnection();
        // SQL 쿼리 객체 생성
        stmt = con.createStatement();
        // 쿼리 작성
        String sql = "select * from test_table";
        // 쿼리 실행 및 결과 데이터 받아오기
        result = stmt.executeQuery(sql);
        
        // 반목문을 통한 쿼리 결과값 출력
        while(result.next()){  
        
        }
        
    }catch(Exception e) {
    	// 예외 처리
    }finally{
    	// try 구문이 끝나면 필수적으로 DB 연결 및 자원 해제
        if(con != null) con.close();
        if(stat != null) stat.close();
        // result 객체는 stat 객체가 종료되면 자동으로 종료되 된다고 명시 되어서 수동으로 직접 종료 시킬 필요는 없다.
        if(result != null) result.close();
    }
}

 

2. JdbcTemplate

- jdbcTemplate는 위에서 설명했던 jdbc의 단점을 보완하기 위해서 나온 기능이다.

- jdbc에서 매번 DB, 자원 생성 및 해제를 반복하는 코드를 spring framework에서 대신 해준다.

- 개발자는 jdbc와는 다르게 sql 코드에만 집중할 수 있어 관리 포인트가 줄어드는 장점이 있다.

 

// DB config 파일에서 jdbcTemplate 객체를 bean으로 등록한다.
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("hikariDataSource") DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);

    return jdbcTemplate;
}

// bean으로 등록해둔 jdbcTemplate 객체 의존성 주입
@Autowired
private JdbcTemplate jdbcTemplate;

public String selectTest() {

    String res = null;
    String sql = "select * from test_table;"
    // bean으로 등록시켜둔 jdbcTemplate 객체를 이용해 쿼리 조회만 하면 된다.
    List<Map<String, Object>> result = jdbcTemplate.query(sql, new ColumnMapRowMapper());
    return res;
    
}