Maven Project란?
pom.xml 파일을 중심으로 프로젝트를 관리함.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의 의존성까지 모두 자동 다운로드- 버전 충돌 조정, 중복 제거, 빌드 자동화 지원
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("나 눌렀어?");
}
});
🔌
전자기기(인터페이스) ↔ 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("창 닫았어?");
}
}
| 비교 | 인터페이스 직접 구현 | 어댑터 클래스 상속 |
|---|---|---|
| 구현해야 할 메서드 | 전부 다 구현해야 함 | 필요한 것만 선택해서 오버라이딩 가능 |
| 코드량 | 많고 번거로움 | 간결함 |
| 예시 | WindowListener | WindowAdapter |
addWindowListener(new WindowAdapter(){
// 익명 내부 클래스 + 어댑터
public void windowClosing(WindowEvent e) {
if (con != null) {
try {
con.close(); // DB 연결 종료
} catch (SQLException e1) {
e1.printStackTrace();
}
}
System.exit(0); // 프로세스 종료
}
});
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눌러서 파일 탐색기 열고, 엑셀파일 불러오기
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단계 | DataModel에 title, data 채워서 JTable에 반영 |