본문 바로가기
언어/JAVA

JDBC 사용법

by 이민우 2022. 7. 25.
728x90
반응형

DB내 특정 테이블을 다른 DB내 테이블과 동기화시켜야 하는 요구사항이 발생했다.


해당 기능의 구현을 위해서는 Spring의 DataSource를 두 개로 설정해서 개발해도 되지만, "고작 테이블 하나를 퍼오는 작업에 굳이 그 정도의 노력을 감수해야 할까?" 하는 생각이 들었다.

 

결과적으로 그 정도의 노력을 감수하고 싶지 않았고, 해당 기능은 일반 JDBC로 사용하기로 결심했다.

 

그러나 JPA에 너무 익숙해진 탓에 일반 JDBC를 사용하는 방법을 잊어먹어버렸고,

똑같은 상황이 발생할 경우 언제든 다시 사용할 수 있도록 코드를 저장해놓고자 한다.

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
public class DataRepository {

   Logger logger = LoggerFactory.getLogger(DataRepository.class);

   @Value("${outDB.driverClassName}")
   private String driverClass;
   @Value("${outDB.url}")
   private String url;
   @Value("${outDB.username}")
   private String username;
   @Value("${outDB.password}")
   private String password;

   private Connection con = null;
   private ResultSet rs = null;
   private PreparedStatement psmt = null;

   @Transactional(readOnly = true)
   public List<SOME_CLASS> exportTable() throws Exception {

      StringBuilder query = new StringBuilder();
	  
      query.append("SELECT \n");
      query.append("   * \n");
      query.append("FROM SOME_DB.SOME_TABLE");
      query.append(";");
      logger.debug(" @@@ executeQuery : {}", query.toString());

      List<SOME_CLASS> scList = new LinkedList<>();

      try {
         Class.forName(driverClass);

         con = DriverManager.getConnection(url, username, password);
         logger.debug(" @@@ DATA MART CONNECTED.");
         psmt = con.prepareStatement(query.toString());

         rs = psmt.executeQuery();

         // 하나씩 뺴서 리스트 구성
         while (rs.next()) {
			SOME_CLASS sc = new SOME_CLASS();
			sc.setSOME_VAR(rc.getString("some_var");
			sc.setSOME_INT(rc.getInt("some_int");
			sc.setSOME_LNG(rc.getLong("some_lng");
			...
            scList.add(sc);
         }
      } catch (Exception e) {
         logger.error(" @@@ DB CONNECTION ERROR : {}", e.getMessage());
         throw e;
      } finally {
		 // 필수
         rs.close();
         psmt.close();
         con.close();
      }

      logger.debug(" @@@ found {} data", scList.size());

      return scList;
   }
}

 

728x90
반응형

'언어 > JAVA' 카테고리의 다른 글

[JAVA] 코테용 함수들  (0) 2023.07.08
1970년 01월 01일 00시 00분 00초  (0) 2023.03.17
리눅스 OS에 명령어 보내기  (0) 2022.07.21
[JAVA] 온점 단위 Split  (0) 2022.03.10
[JAVA] Call by Value & Call by reference  (0) 2021.04.29