JAVA 기초 다지기
* JAVA를 공부하면서 정리하고 있는 내용입니다. 잘못된 내용에 대한 피드백은 언제나 환영입니다. :)
JAVA 스터디를 하면서 간단한 콘솔 애플리케이션을 만들었다. 재무 관리 어플리케이션이고, 콘솔에서 메뉴를 선택하거나 입출금내역을 입력할 수 있다. 객체 지향 프로그래밍과 기본 JAVA의 자료형을 실습해볼 수 있었다. 코드 중에 엑셀파일로 저장하는 기능을 추가했던 내용을 적어본다.
(드래그할 수 있는 전체 코드는 글 제일 하단에 있습니다.)
처음 프로젝트를 만들때 Maven 빌더를 선택했다. 아직 Maven과 Gradle의 차이를 정확히 알진 못하지만 그저 npm과 yarn 정도의 차이라고 인지하고 있다. 어쨌든, Maven에서 라이브러리를 추가할 때는 pom.xml에 적어주면 된다. <dependencies> 안에다가 넣어줘야 되어서 아래와같이 넣어주었다. Apache POI 라이브러리를 추가했다. 버전은 공식홈페이지에서 최신 버전을 확인해서 적어주었다.
gradle에서는 아래와 같이 추가하면 된다고 한다.
implementation 'org.apache.poi:poi-ooxml:5.2.3'
데이터를 저장하는 순서가 있다. 엑셀을 생각해보면 쉽다. 엑셀 파일을 분석해보면 아래와 같은 계층이라고 볼 수 있다.
"파일" -> "Sheet" -> "Row"와 "Column"들
그래서 제일 먼저 "파일"을 만들어야 한다. 파일을 만들려면, 아래와 같은 코드를 사용한다.
Workbook workbook = new XSSFWorkbook();
Workbook이 하나의 엑셀 파일을 표현한다고 볼 수 있다. XSSFWorkbook은 Excel 2007 이상 버전인 XLSX 형식의 파일을 처리한다.
그 다음엔 Sheet을 만든다. 엑셀 파일 하나의 여러개의 시트가 있는 것처럼, sheet는 여러개를 만들 수 있다. 따옴표 안의 이름은 아무거나 해도 상관 없다. 시트의 이름이다.
Sheet sheet = workbook.createSheet("Transactions");
이렇게 만들어진 sheet에다가 이제 데이터를 입력하기만 하면 된다.
한줄씩 (Row) 입력한다고 보면 된다. 그래서 Row를 생성한다. 이렇게 생성하면 "빈 Row"가 생기는 것이다.
Row headerRow = sheet.createRow(0);
빈 Row에 이제 값을 담아야 된다. header 역할을 하는 Row이기 때문에 제목을 넣어준다. 제목을 Date, Type, Category, Amont 이렇게 4개 넣어줬다.
headerRow.createCell(0).setCellValue("Date");
headerRow.createCell(1).setCellValue("Type");
headerRow.createCell(2).setCellValue("Category");
headerRow.createCell(3).setCellValue("Amount");
이제는 Row들을 Transcation 개수만큼 넣어줘야 한다. for 문으로 transcation의 값들을 넣어준다.
int rowNum = 1;
for(Transaction transaction : transactions) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(transaction.getDate().toString());
row.createCell(1).setCellValue(transaction.getType().toString());
row.createCell(2).setCellValue(transaction.getCategory().toString());
row.createCell(3).setCellValue(transaction.getAmount());
}
이제 파일로 저장하기만 하면 끝!
try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
workbook.write(outputStream);
}
- try문: try 블록이 종료될 때 자동으로 리소스를 닫아준다. (여기너 FileOutputStream)
- FileOutputStream: Java의 입출력 클래스 중 하나, 파일에 바이트 단위로 데이터를 쓰는데 사용
- new FileOutputStream(filePath): 지정한 파일경로에 새로운 파일을 생성한다. (파일이 있다면 덮어쓴다.)
workbook.write(outputStream): 앞에서 생성한 객체(XSSFWorkbook 인스턴스)를 outputStream을 통해 파일로 쓴다. 이 메소드 호출을 해야 실제 엑셀파일에 생성된다.
전체 파일
빌드하는데 에러를 만났다.
파일은 만들어졌지만 파일이 열리지 않았다.
내가 저장하려는 경로가 읽기 전용 폴더여서 그런건데, 임시로 폴더의 읽기 전용을 해제해줬더니 파일을 저장할 수 있었다. 나중에 실제 실무에서는 그런 폴더 및 사용자 권한도 중요하게 설정해줘야겠다 0_0