-
OpenAPI 데이터베이스 저장Java 2023. 5. 2. 16:54
나이스 대국민 서비스 openAPI에서 제공하는 학원, 교습소 정보를 로컬 pc에 있는 mariadb에 저장하는 데에는 크게 나눠보면
1. API를 호출할 것인지, 데이터베이스에 저장 후 사용할 것인지
본인은 학교 프로젝트로 오픈 API를 활용한 서비스를 만들고 싶었기에 아무래도 매번 API를 호출하는 것 보단 데이터베이스에 저장하여 사용하는 게 좋을 것 같다고 판단되어서 나이스 대국민서비스에서 csv파일을 다운로드 받았습니다.
2. csv파일을 읽고 파싱하여 vo객체로 저장하는 과정
BufferedReader로 FileReader(csv파일경로)를 읽습니다.
csv 파일은 컬럼을 기준으로 ',' 로 구분되기에 String의 split메서드를 사용해 ','로 구분지어 데이터를 읽고 원하는 부분만 파싱하였습니다.
파싱한 데이터들은 미리 작성해놓은 VO클래스에 List로 저장을 하고 반환하는 메서드를 만들어 구현하였습니다.
public class ReadData { private String url; public ReadData(String url) { this.url = url; } public List<Info> list () throws IOException { List<Info> dataList; try { FileReader fileReader = new FileReader(url); BufferedReader br = new BufferedReader(fileReader); String line; dataList = new ArrayList<>(); while ((line = br.readLine()) != null) { String[] data = line.split(","); String city = data[1]; String gu = data[2]; String groupName = data[3]; String name = data[5]; String filedName = data[13]; String courseName = data[16]; String price = data[17]; String isOpen = data[18]; String addressNumber = data[20]; String address = data[21] + data[22]; Info info = Info.builder() .city(city).gu(gu) .name(name).groupName(groupName) .fieldName(filedName) .courseName(courseName) .price(price) .isOpen(isOpen) .addressNumber(addressNumber) .address(address).build(); dataList.add(info); } br.close(); fileReader.close(); } catch ( FileNotFoundException e) { throw new RuntimeException(e); } return dataList; } }
3. 데이터베이스 테이블 생성
필요한 컬럼을 가진 테이블을 생성해주었습니다. price가 가질 수 있는 최대 길이를 구한 뒤 해당 길이에 맞게 크기를 설정해주었습니다.
4. JDBC 드라이버 다운로드, 라이브러리 경로 추가
본인은 인텔리제이를 사용하고 있어서 인텔리제이 기준으로 작성된 것입니다.
JDBC 드라이버는 사용할 DB에 맞는 드라이버를 다운로드하면 됩니다.
저는 mariadb를 사용하여 mariadb 드라이버를 다운로드 받고 인텔리제이에서 Project Structure 설정에 들어가 Library에 다운로드 받은 파일을 추가해주었습니다.
5. 데이터베이스에 저장한 리스트의 값 저장하기
데이터베이스 정보들을 작성해준 뒤 커넥션을 가져와 상황에 맞는 SQL을 작성한 뒤 list가 끝날 때 까지 데이터베이스에 값을 저장합니다.
import java.sql.*; import java.util.List; public class Main { public static void main(String[] args) throws Exception{ ReadData readData = new ReadData(csv파일 경로); // 입력 List<Info> list = readData.list(); String url = 데이터베이스url; // 입력 String user = 사용자이름; // 입력 String password = 비밀번호; // 입력 Connection conn = null; PreparedStatement pstmt; try { Class.forName("org.mariadb.jdbc.Driver"); // 드라이버 로드 conn = DriverManager.getConnection(url, user, password); System.out.println("MariaDB 연결 성공"); for (Info info : list) { String sql = "INSERT INTO class_info(city, gu, group_name, name, field_name, course_name, price, is_open, address_number, address) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, info.getCity()); pstmt.setString(2, info.getGu()); pstmt.setString(3, info.getGroupName()); pstmt.setString(4, info.getName()); pstmt.setString(5, info.getFieldName()); pstmt.setString(6, info.getCourseName()); pstmt.setString(7, info.getPrice()); pstmt.setString(8, info.getIsOpen()); pstmt.setString(9, info.getAddressNumber()); pstmt.setString(10, info.getAddress()); pstmt.executeUpdate(); } } catch (ClassNotFoundException e) { System.out.println("드라이버 로드 실패"); e.printStackTrace(); } catch (SQLException e) { System.out.println("MariaDB 연결 실패"); e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
결과 :
데이터가 문제 없이 잘 저장된 것을 확인할 수 있었습니다.
*price는 값이 있는 경우도 있고 없는 경우도 있어서 null값을 허용해주었습니다*
'Java' 카테고리의 다른 글
JVM 클래스로더 알아보기 (0) 2025.01.11 JVM 클래스 로딩 과정 알아보기 (0) 2025.01.09 JVM 바이트코드 알아보기 (1) 2025.01.04 자바와 코틀린 (0) 2024.08.29 커스텀 어노테이션 (0) 2024.02.13