Java의 기본 라이브러리와 JDBC를 사용하여 CSV 파일을 읽고 데이터를 데이터베이스에 삽입하는 것을 구현하였다. 현재 진행 중인 프로젝트가 스프링 프레임워크로 만들어져 있어서 스프링 환경에서 코드를 작성하였지만 스프링이 아니더라도 상관이 없다.
1. 개발 환경 및 CSV 파일
🚀 개발 환경
▪ IDE : Eclipse 2023-06R
▪ JAVA : JDK 11.0.22
▪ STS : STS 3.9.18
▪ MySQL : 8.0.37.0
▪ MySQL Workbench : 8.0.36
🗄️ DB 스키마 및 테이블
📄 CSV 파일
▪ 만개의 레시피
https://kadx.co.kr/opmk/frn/pmumkproductDetail/PMU_6d212747-8bd4-42c2-bc55-60bc636d6121/5
2. 스프링 레거시 프로젝트 생성
1) 스프링 레거시 프로젝트 생성
2) 프로젝트 이름 설정
3) 프로젝트의 최상위 패키지 이름 설정 및 프로젝트 구조 확인
현재 자바 버전이 1.6으로 되어있고 home.jsp에 오류가 있다.
home.jsp 페이지는 사용하지 않을 것이라 삭제해도 상관이 없다.
3. 스프링 개발 환경 설정
1) pom.xml 파일 수정
자바 버전을 11로 변경하고 'mysql-connector-java dependency'를 추가
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>CSVtoDatabase</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</project>
2) 메이븐 프로젝트 업데이트
pom.xml을 변경하면 메이븐 프로젝트를 업데이트해야 적용이 된다.
두번째 이미지처럼 메이븐 업데이트 프로젝트를 하면 JavaSE-1.6에서 JavaSE-11로 변경이 된다.
4. CsvReader 클래스 생성
CSV 파일 데이터를 읽고 DB에 저장시켜주는 CsvReaer 클래스를 생성한다.
1) HomeController.java는 불필요하므로 삭제하고 CsvReader.java 클래스를 생성
2) 스키마명, 아이디, 비밀번호는 MySQL Workbench에서 설정해둔 값을 넣어준다.
3) filePath에는 csv파일의 위치를 넣어준다.
4) 현재 csv파일의 데이터를 5개만 가져오도록 count로 조건을 설정해주었다.
package com.smhrd.csvtodb;
import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import static java.lang.Integer.parseInt;
public class CsvReader {
public static void main(String[] args) {
String dbDriver = "com.mysql.cj.jdbc.Driver";
String jdbcUrl = "jdbc:mysql://localhost:3306/스키마명";
String username = "아이디";
String password = "비밀번호";
String filePath = "C:\\Users\\USER\\Desktop\\data.csv";
// 데이터를 DB에 넣을 때 한 번마다 넣을 수 있는 튜플의 개수 단위 (5개씩 작업)
// DB에 들어가는 총 데이터(튜플)의 개수가 아님!!!
int batchSize = 5;
Connection conn = null;
try {
System.out.println("DB 접속 시도");
Class.forName(dbDriver);
conn = DriverManager.getConnection(jdbcUrl, username, password);
conn.setAutoCommit(false);
String sql = "INSERT INTO food(food_id, food_name) VALUES (?, ?)";
PreparedStatement statement = conn.prepareStatement(sql);
BufferedReader lineReader = new BufferedReader(new FileReader(filePath));
String lineText = null;
int count = 0;
lineReader.readLine(); // 첫 번째 행은 헤더이므로 건너뛴다.
// count 조건을 주어 넣을 수 있는 데이터(튜플)의 수를 제한
while ((lineText = lineReader.readLine()) != null && count < 5) {
System.out.println("DB 데이터 받는 중");
String[] data = lineText.split(",");
String food_id = data[0]; // csv파일의 1번 컬럼 데이터
String food_name = data[1]; // csv파일의 2번 컬럼 데이터
statement.setInt(1, parseInt(food_id));
statement.setString(2, food_name);
statement.addBatch();
count++;
if (count % batchSize == 0) {
statement.executeBatch();
}
}
// 사용한 리소스를 닫습니다.
lineReader.close();
// DB에 못 들어간 데이터가 있으면 넣기 (5개 미만인 경우)
statement.executeBatch();
// DB 연결 종료
conn.commit();
conn.close();
System.out.println("DB 데이터 추가 완료");
} catch (Exception exception) {
System.out.println("DB 접속 실패");
exception.printStackTrace();
}
}
}
5. 프로그램 실행 · 데이터베이스 확인
프로그램을 실행하면 데이터베이스에서 데이터가 정상적으로 5개만 들어간 것을 확인할 수 있다.
6. 에러 및 해결
💥 에러 : Java compiler level does not match the version of the installed Java project facet.
🛠️ 해결 : 자바 컴파일러 버전이 맞지 않는 에러로 자바 컴파일러 버전을 설정해줘야 한다.
해당 프로젝트 우클릭 후, 'Properties' 클릭 > 'Project Facets'에서 'Java' 버전 11로 변경
⚠️ 경고 : Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result.
🛠️ 해결 : 해당 종속성을 다른 프로젝트와 공유할지 여부를 결정
1) 경고 문구 우클릭 후 'Quick Fix' 클릭
2) 첫번째 옵션 선택 후 'Finish' 클릭
첫번째 옵션 : 해당 클래스 패스 항목이 내보내지거나 발행되지 않도록 제외
➜ 해당 종속성을 다른 프로젝트와 공유할 필요가 없는 경우
두번쨰 옵션 : 해당 클래스 패스 항목이 내보내지거나 발행되도록 표시
➜ 해당 종속성을 다른 프로젝트에 종속성으로 공유해야하는 경우
🔥 이클립스에서 오류, 에러를 쉽게 확인하는 방법
프로젝트에 오류, 에러가 생기는 경우 Window > Show View > Problems 로 가서 확인 가능
'Language > Java' 카테고리의 다른 글
[Spring] STS3 Darkest Dark Theme 설치 (에러 해결) (0) | 2024.06.11 |
---|---|
[Spring] STS에서 Tomcat 서버 연결 (1) | 2024.06.11 |
☕ 자바(JDK) 환경 변수 설정 (0) | 2024.05.30 |
[Spring] 🌿 STS 설치 및 스프링 프로젝트 생성 (0) | 2024.05.29 |
페이지 테스트4 (0) | 2024.04.30 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!