@RequestMapping(value = "/downloadExcel", method = RequestMethod.GET)
클라이언트가 "/downloadExcel" URL로 GET 요청을 보내면 이 메서드를 실행하도록 설정.
public void downloadExcel(HttpServletResponse response) throws IOException {
-> 이것은 downloadExcel이라는 메서드를 선언하는 부분.
이 메서드는 클라이언트에게 HTTP 응답을 보내기 위해 HttpServletResponse 객체를 매개변수로 받음.
Workbook workbook = new XSSFWorkbook();
-> Apache POI 라이브러리를 사용하여 XLSX 형식의 새로운 엑셀 워크북을 생성.
Sheet sheet = workbook.createSheet("게시판 리스트");
-> 워크북에 새로운 시트를 생성하고 "게시판 리스트"라는 이름을 부여.
Row row = null;
-> 엑셀 행을 참조할 Row 객체를 선언. 아직 어떤 행도 참조하고 있지 않으므로 null로 초기화.
int rowNo = 1;
-> 엑셀 행의 인덱스를 저장할 변수를 선언하고 1로 초기화.
0번 행은 헤더로 사용될 것이므로, 데이터는 1번 행부터 시작.
Row headerRow = sheet.createRow(0);
-> 0번 행에 새로운 행을 생성하고, 이를 headerRow라는 변수가 참조.
headerRow.createCell(0).setCellValue("번호");
-> headerRow 행의 0번 셀을 생성하고, 이 셀의 값을 "번호"로 설정. 이하 4줄도 마찬가지.
List<Map<String, Object>> list = boardService.list();
-> boardService의 list 메서드를 호출하여 게시판의 모든 게시물을 가져옴.
각 게시물은 Map 객체로 표현되며, 이 Map 객체들의 리스트가 반환.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-> 날짜를 "yyyy-MM-dd" 형식의 문자열로 변환하기 위한 SimpleDateFormat 객체를 생성.
for (Map<String, Object> map : list) {
-> 가져온 모든 게시물에 대해 반복을 수행.
row = sheet.createRow(rowNo++);
-> 새로운 행을 생성하고, 이를 row 변수가 참조. 그리고 행 인덱스를 1 증가시킴.
row.createCell(0).setCellValue((Integer) map.get("no"));
-> row 행의 0번 셀을 생성하고, 이 셀의 값을 게시물의 번호로 설정. 이하 4줄도 마찬가지.
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;");
-> HTTP 응답의 Content-Type 헤더를
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"으로 설정하여,
클라이언트에게 엑셀 파일이 반환될 것임을 알림.
response.setHeader("Content-Disposition", "attachment; filename=board_data.xlsx");
-> HTTP 응답의 Content-Disposition 헤더를 설정하여,
클라이언트가 이 파일을 "board_data.xlsx"라는 이름으로 다운로드하도록 함.
workbook.write(response.getOutputStream());
-> 워크북의 내용을 HTTP 응답의 출력 스트림에 쓰고, 이를 클라이언트에게 보냄.
workbook.close(); }
-> 워크북을 닫음. 이렇게 하면 사용한 리소스를 해제하여 메모리 누수를 방지할 수 있음.