Maven + Excel 연동

heeezni·2025년 6월 4일
post-thumbnail

Maven ➡ Build Tool (빌드 도구)

Maven Project란?

  • Java 프로젝트에서 빌드, 의존성 관리, 패키징, 테스트 등을 자동화해주는 빌드 도구
  • pom.xml 파일을 중심으로 프로젝트를 관리함

의존성 관리

  • Maven에서는 필요한 라이브러리를 직접 .jar 파일로 넣는 게 아니라,
    pom.xml의존성(dependency)만 선언하면 됨

1️⃣ jar가 jar를 의존

  • 하나의 JAR 파일이 동작하기 위해 다른 JAR 파일이 필요함
    (예: myapp.jar → log4j.jar, mysql-connector.jar 의존)

2️⃣ 🔥 충돌 위험

  • 버전 충돌: 서로 다른 라이브러리가 같은 클래스를 다르게 정의
  • 중복 포함: 여러 라이브러리에서 동일한 의존 jar 중복 포함
  • 누락: 필요한 jar를 누락하면 ClassNotFoundException 발생

3️⃣ ✅ Maven으로 의존성 자동 관리

  • pom.xml에 필요한 라이브러리만 명시하면
    Maven이 필요한 jar와 그 jar의 의존성까지 모두 자동 다운로드
  • 버전 충돌 조정, 중복 제거, 빌드 자동화 지원

✅ Maven으로 MySQL JDBC 설정하기

1️⃣ Maven Repository 접속
https://mvnrepository.com
➡ mysql jdbc 검색
➡ MySQL Connector/J 선택

2️⃣ MySQL 서버에서 현재 버전 확인

SELECT VERSION();
--➡ 해당 버전에 맞는 Maven 버전 클릭

3️⃣ pom.xml에 의존성 추가
<dependencies>에 밑에 복붙

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>버전번호</version>
    </dependency>
</dependencies>

4️⃣ Ctrl + Shift + F
➡ 자동 줄 맞춤 / 코드 정렬

5️⃣ 확인: .jar 파일 생성됨

왼쪽 Maven 라이브러리 목록에 mysql-connector-java-x.x.x.jar 보이면 성공


익명 내부 클래스

✅ JavaScript의 익명 함수와 개념적으로 비슷

✅ 재사용성이 낮은 클래스를 별도로 .java 파일로 만들지 않고,
클래스 안에 이름 없이 바로 정의해서 사용하는 방식 (코드만 가져다 붙이기)

  • 한 번만 쓸 클래스
  • 인터페이스나 추상 클래스 구현 시 간단히 처리하고 싶을 때

(예: 이벤트 리스너, 일회용 객체, 콜백 처리 등)

✅ 클래스 이름이 없음 (new 부모타입()) { ... }
코드의 이름이 없기 때문에 부모 클래스의 이름 붙이기

✅ 익명 내부 클래스의 장점: 자신을 감싸고 있는 외부 클래스 멤버에 접근 가능

bt_emp.addActionListener(new ActionListener(){ 
//ActionListener를 구현하는 익명내부클래스 
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("나 눌렀어?");
	}
});

Adapter

인터페이스의 메서드 중 필요한 것만 쓰기 : Adapter

🔌
전자기기(인터페이스) ↔ 220v(운영체제)
사이에 꽂는 어댑터처럼,
복잡한 인터페이스와 개발자 사이를 중간에서 완충해주는 역할

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyWindowAdapter extends WindowAdapter {

    @Override
    public void windowClosing(WindowEvent e) {
        System.out.println("창 닫았어?");
    }
}
비교인터페이스 직접 구현어댑터 클래스 상속
구현해야 할 메서드전부 다 구현해야 함필요한 것만 선택해서 오버라이딩 가능
코드량많고 번거로움간결함
예시WindowListenerWindowAdapter

어댑터 클래스 + 익명 내부 클래스를 동시에 활용

addWindowListener(new WindowAdapter(){
	// 익명 내부 클래스 + 어댑터
    public void windowClosing(WindowEvent e) { 
        if (con != null) {
            try {
                con.close(); // DB 연결 종료
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        System.exit(0); // 프로세스 종료
    }
});

Java-엑셀 연동

1. 버튼 클릭 → 엑셀 파일 선택

JButton bt_excel = new JButton("엑셀에서 로드");
JFileChooser chooser=new JFileChooser(); //파일탐색기
bt_excel.addActionListener(new ActionListener() { // 익명 내부 클래스 사용
    @Override
    public void actionPerformed(ActionEvent e) {
        // 📁 파일 선택 창 열기 (EmpLoad.this는 외부 클래스의 인스턴스 명시)
        int result = chooser.showOpenDialog(EmpLoad.this); 
        /*
         * ⚠ 그냥 this 안됨. 익명 내부 클래스 자신을 가리킴
         * 내부 클래스는 외부 클래스의 인스턴스 접근시, **외부클래스명.this**
         * → EmpLoad.this
         */

        if (result == JFileChooser.APPROVE_OPTION) { // 사용자가 "열기"를 선택했다면
            File file = chooser.getSelectedFile(); // 선택한 파일 정보 가져오기
            loadExcel(file); // 엑셀 파일 로딩 메서드 호출
        }
    }
});

bt_excel눌러서 파일 탐색기 열고, 엑셀파일 불러오기

2. Apache POI로 엑셀 파일 읽기

Java 기본 API에는 엑셀 파일 처리 기능이 없음
✅ Apache에서 제공하는 POI 라이브러리를 활용
주요 클래스: XSSFWorkbook, XSSFSheet, XSSFRow, XSSFCell

📁 엑셀 구조

Workbook(엑셀 파일)Sheet(시트)Row()Cell()

loadExcel() 구현

public void loadExcel(File file) {
    try {
        /* Excel 97~2003 구 버전 (.xls) → HSSFWorkbook 사용
		Excel 2007 이상 (.xlsx) → ✅ XSSFWorkbook 사용*/
        
        //📄 엑셀 파일 열기 (xlsx 전용)
        XSSFWorkbook workbook = new XSSFWorkbook(file);

        //📑 첫 번째 시트 선택
        XSSFSheet sheet = workbook.getSheetAt(0);

        //📌 첫 번째 행(Row)을 읽어 컬럼명으로 사용
        XSSFRow row = sheet.getRow(0);
        model = new DataModel();
        model.title = new String[row.getLastCellNum()]; // 컬럼 수만큼 배열 생성

        for (int i = 0; i < row.getLastCellNum(); i++) {
            model.title[i] = row.getCell(i).getStringCellValue(); // 셀 값 추출하여 title에 저장
        }

        //📊 실제 데이터(Row)를 읽어 2차원 배열에 저장
        model.data = new String[sheet.getLastRowNum()][model.title.length]; // 데이터 행 수만큼 생성

        for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) { // ✅컬럼명 제외한 행만 반복
            XSSFRow r = sheet.getRow(i);
            for (int a = 0; a < r.getLastCellNum(); a++) {
                XSSFCell cell = r.getCell(a);
                model.data[i - 1][a] = cell.getStringCellValue(); // ✅i-1 = 자바 배열은 0부터 시작
            }
        }

        //📋 JTable에 데이터 모델 적용
        table.setModel(model);
        table.updateUI();

    } catch (InvalidFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

⚠ 인덱스 주의

엑셀 시트는 1번 행부터 시작
자바 배열은 0번 인덱스부터 시작
i-1 처리를 반드시 해줘야 데이터가 0번 인덱스부터 정확히 채워짐

🧾 엑셀 로딩 전체 흐름 요약

단계내용
1단계.xlsx 엑셀 파일을 POI로 열기 (XSSFWorkbook)
2단계첫 번째 시트의 첫 행으로부터 컬럼명 추출
3단계두 번째 행부터 마지막 행까지 데이터 추출하여 2차원 배열 저장
4단계DataModeltitle, data 채워서 JTable에 반영
profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글