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 |