23. error

OOM ๋ฐœ์ƒ 2 - ์—‘์…€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ Apache POI ์˜ SXSSFWorkbook ์‚ฌ์šฉ

keemzeehae 2025. 4. 7. 15:27

 

๊ธฐ์กด ๋ฐฉ์‹

๊ธฐ์กด์— ์—‘์…€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋ฐฉ์‹์€ list๋กœ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ modelMap ์— ๋‹ด์•„์ฃผ๊ณ  return ํ• ๋•Œ new ModelAndView("fileroot/testExcelDownload", modelMap); ์ด๋Ÿฐ์‹์œผ๋กœ ์—‘์…€ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค.

modelMap.put("alist",alist);

 

๋ฌธ์ œ๋ฐœ์ƒ ์›์ธ

๊ทผ๋ฐ <c:forEach itmes ="${alist}" var = "row" varStatus = "i"> ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด N ๋งŒ๊ฑด ์ •๋„๊ฐ€ ๋˜๋‹ค ๋ณด๋‹ˆ ์ง€๋‚˜์ง€๋‚˜์นœ forEach ํƒœ๊ทธ์˜ ๋ฐ˜๋ณต์œผ๋กœ OOM ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. 

 

์•ž ๊ธ€์—์„œ ๋งํ–ˆ๋˜๊ฒƒ ์ฒ˜๋Ÿผ ์ž์„ธํ•œ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

 

 Java WAS์˜ Heap ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ ธ Full GC๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ–ˆ๊ณ , ๊ฒฐ๊ตญ Heap ๋ฉ”๋ชจ๋ฆฌ2GB ์ค‘ 1.6GB๋ฅผ ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ์ ์œ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

๋Œ€๋žต์ ์ธ ๊ณผ์ •์€ ์ด๋žฌ๋‹ค.

- ์ธํ”„๋ผ ๋ฆฌ์†Œ์Šค ํŠน์ด์‚ฌํ•ญ์€ 17์‹œ 19๋ถ„ ๋ถ€ํ„ฐ cpu ์‚ฌ์šฉ๋ฅ ์ด ๊ธ‰์ฆํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ was ํ”„๋กœ์„ธ์Šค ์žฌ๊ธฐ๋™ ์ „๊นŒ์ง€ cpu ์‚ฌ์šฉ๋ฅ  90% ๊ณผ์ ์œ 
- cpu ๊ณผ์ ์œ ๋Š” jboss heap ๋ฉ”๋ชจ๋ฆฌ์—์„œ java.lang.outofMemoryError(OOM) ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋ฅผ ์œ„ํ•œ full GC ์ˆ˜ํ–‰ ์˜ํ–ฅ์œผ๋กœ ํ™•์ธ 
- Full GC ์ˆ˜ํ–‰์œผ๋กœ๋„ java heap ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ™•๋ณด๊ฐ€ ๋˜์ง€ ์•Š์•˜๊ณ  17:32 ์— Interneal Exception ์ด ๋ฐœ์ƒํ•˜๋ฉฐ java crash ๋ฐœ์ƒ 
(java crash log ์‚ดํŽด๋ณด๋ฉด heap ๋คํ”„ ์ƒ์„ฑ ์ค‘ jdk ๋‚ด๋ถ€ jplisagent.c ์ฝ”๋“œ ์ˆ˜ํ–‰ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ ์‹คํŒจํ•œ internal exception ๋กœ ํŠน์ด์‚ฌํ•ญ ์—†์Œ) 
- ๋”ฐ๋ผ์„œ ์›์ธ๋ถ„์„์„ ์œ„ํ•ด heap ๋คํ”„ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ , ๋„๋ฉ”์ธ ํ†ตํ•ฉ ๊ด€๋ฆฌ ์„œ๋น„์Šค์˜ heap ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ‘œ์ค€๊ฐ’์ธ 2GB ๋กœ ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด์ƒ์ง•ํ›„ ๋‹น์‹œ ๋‹ค๋Ÿ‰์˜ org.apache.tagilbs.standard.tag.rt.core.ForEachTag ํด๋ž˜์Šค์—์„œ ๋ฉ”๋ชจ๋ฆฌ 2GB ์ค‘ 1.6GB ๊ณผ์ ์œ ํ•˜๋ฉฐ ๋ฐœ์ƒ 

 

๋ฌธ์ œํ•ด๊ฒฐ ๋ฐฉ์‹

๊ทธ๋ž˜์„œ '์—‘์…€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋Œ€์šฉ๋Ÿ‰'์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ Java์—์„œ Microsoft Office ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ , ์“ฐ๊ณ , ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ apache ์˜ POI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

ํŠนํžˆ **์—‘์…€(Excel)**์„ ๋‹ค๋ฃจ๋Š” ์šฉ๋„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค๊ณ ํ•จ.

 

 

1) ๊ธฐ์กด ๋ฐฉ์‹๊ณผ ์ฐจ์ด์ 

์•„๋ž˜๋Š” ๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์ฑ—์ง€ํ”ผํ‹ฐํ•œํ…Œ ๋ฌผ์–ด๋ณธ ๊ฒฐ๊ณผ์ด๋‹ค.

apache POI ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ JSP ์—†์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง์ ‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

JSP View ์ฒ˜๋ฆฌ ๋ฐฉ์‹ JSP๊ฐ€ View๋กœ HTML์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์—ฌ์คŒ HTML ํŽ˜์ด์ง€ ์กฐํšŒ
Apache POI ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ JSP ์—†์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง์ ‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์ œ๊ณต ์—‘์…€, PDF ๋“ฑ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

 

๊ตฌ๋ถ„ ModelAndView (JSP) Apache POI (Excel)
ํ™”๋ฉด ์ถœ๋ ฅ HTML๋กœ ํ™”๋ฉด์— ์ง์ ‘ ์ถœ๋ ฅ ํ™”๋ฉด ์ถœ๋ ฅ ์—†์ด ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
๋ฐ์ดํ„ฐ ํ˜•ํƒœ HTML๋กœ ๊ฐ€๊ณต (View์—์„œ ๊ฐ€๊ณต์ฒ˜๋ฆฌ) Excel๋กœ ์ง์ ‘ ๊ฐ€๊ณต (Java ์ฝ”๋“œ๋กœ ๊ฐ€๊ณต)
ํ…œํ”Œ๋ฆฟ ๋ฐฉ์‹ JSP, Thymeleaf ๋“ฑ์˜ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ ํ…œํ”Œ๋ฆฟ ์—†์ด Java ์ฝ”๋“œ๋งŒ์œผ๋กœ ์ƒ์„ฑ

 

โœ”๏ธ์—‘์…€ํŒŒ์ผ๋‹ค์šด๋กœ๋“œ ํ๋ฆ„

Client(๋ธŒ๋ผ์šฐ์ €)
      โ”‚ ์š”์ฒญ (GET /excel/download)
      โ–ผ
Controller โ”€โ”€โ”€โ”€โ–ถ Service โ”€โ”€โ”€โ”€โ–ถ DAO/Repository
      โ”‚                   (DB์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ)
      โ–ผ ๋ฐ์ดํ„ฐ๋ฅผ POI๋กœ ์—‘์…€๋กœ ๋ณ€ํ™˜
Excel ํŒŒ์ผ ์ƒ์„ฑ (POI Workbook)
      โ”‚ ํŒŒ์ผ์„ Response OutputStream์œผ๋กœ ์ „๋‹ฌ
      โ–ผ
Client(๋ธŒ๋ผ์šฐ์ €)๋กœ ๋‹ค์šด๋กœ๋“œ

 

 

+ ์ถ”๊ฐ€๋กœ

๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ํŒŒ์ผ์— ๋Œ€ํ•ด ์—…๋กœ๋“œ ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๊ธฐ์กด์—๋Š” DOM ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ DOM๋ฐฉ์‹์€? Document Object Model์˜ ์•ฝ์ž์ด๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  - XML Parser๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋ฉด์„œ Object๋กœ ๊ตฌ์„ฑํ•˜์—ฌ DOM Tree๋ฅผ ์ƒ์„ฑ

  - DOM ๊ตฌ์กฐ๋Š” ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ

  - ํ–ฅํ›„ ๋ฉ”๋ชจ๋ฆฌ๋‚ด ๊ณ„์ธต๊ฐ„์˜ Random Access ๊ฐ€๋Šฅ

  - ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด ์ƒ์„ฑ ํ›„ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹(Pull ๋ชจ๋ธ)

 


๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ Cell, Row Type, Row, Sheet ๋“ฑ ์—‘์…€์˜ ๋ชจ๋“  ๋ถ€๋ถ„์— ๋Œ€ํ•ด DOM ๊ตฌ์กฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ณ  ์žˆ์œผ๋‹ˆ...

์—‘์…€ํŒŒ์ผ์˜ Row์™€ Cell์ด ์ •๋ง์ •๋ง์ •๋ง ๋งŽ์•„์ง€๊ฒŒ ๋œ๋‹ค๋ฉด...? (๊ทธ๋Ÿฌ๋ฉด ์—„์ฒญ...๋А๋ ค์ง€๊ตฌ...๋ฌด๊ฑฐ์›Œ์ง€๊ฒ ์ฃ ...?)

 

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด DOM๋ฐฉ์‹์ด ์•„๋‹Œ Apache POI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” SAX๋ฐฉ์‹์ด ๋‚˜์˜ค๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค!!!

SAX๋ฐฉ์‹์ด๋ž€? Simple API for XML์˜ ์•ฝ์ž์ด๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

- DOM ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Œ

- ์Šค์บ”ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉฐ, Random Access ๋ถˆ๊ฐ€

- XML ๋ฌธ์„œ๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ง€์†์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ, ์‚ฌ์šฉ์ž์ธก์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๋ณดํ•˜๋Š” ๋ฐฉ์‹(Push ๋ชจ๋ธ)

 

DOM ๋ฐฉ์‹์— ๋น„ํ•ด SAX๋ฐฉ์‹์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Œ

 

 

์œ„์— ํ‘œ์—์„œ ๋ณด๋ฉด ๊ฐ€์žฅ ํฐ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” ์ฒ˜๋ฆฌ์†๋„์™€ ๋Œ€์ƒ๋ฌธ์„œ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

dom ๋ฐฉ์‹์— ๋น„ํ•ด sax ๋ฐฉ์‹์ด ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ๋Œ€์šฉ๋Ÿ‰ ๋ฌธ์„œ์— ์ ํ•ฉํ•˜๊ธฐ ๋–„๋ฌธ์— sax ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๊ณ 

apache POI ๊ฐ€ ์ง€์›ํ•˜๋Š” ์ฃผ์š” ๋ฌธ์„œ ํ˜•์‹์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘ SXSSF ์„ ์„ ํƒํ–ˆ๋‹ค.

HSSF Excel 97~2003 ํ˜•์‹ (.xls) HSSFWorkbook
XSSF Excel 2007 ์ดํ›„ (.xlsx) XSSFWorkbook
SXSSF ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ๋ฌธ์„œ(.xlsx) ์ƒ์„ฑ (์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹) SXSSFWorkbook
HWPF Word (.doc) HWPFDocument
XWPF Word (.docx) XWPFDocument
HSLF PowerPoint (.ppt) HSLFSlideShow
XSLF PowerPoint (.pptx) XMLSlideShow

 

<-- poi ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์„ ์œ„ํ•œ pom.xml ์— ์˜์กด์„ฑ ์ฃผ์ž…-->

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.12</version>

<scope>system</scope>

<systemPath>{project.basedir}/lib/poi-3.12.jar</systemPath>
</dependency>

 

 

 

2) SXSSFWorkbook ์‚ฌ์šฉ

 : SXSSFWorkbook์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์—ฌ ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ํŒŒ์ผ ์ƒ์„ฑ์— ์ ํ•ฉํ•˜๋‹ค.

  • ์ˆ˜๋งŒ~์ˆ˜์‹ญ๋งŒ ๊ฑด ์ด์ƒ์˜ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์—‘์…€๋กœ ์ƒ์„ฑํ•  ๋•Œ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ OOM(OutOfMemory) ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ๋•Œ

 

โœ… SXSSFWorkbook ์‚ฌ์šฉํ•œ ์—‘์…€ํŒŒ์ผ ์ƒ์„ฑ ์˜ˆ์‹œ

 

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriteSXSSFExample {
    public static void main(String[] args) {
        // SXSSFWorkbook ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (flush ๋‹จ์œ„ 100 row)
        SXSSFWorkbook workbook = new SXSSFWorkbook(100);
        Sheet sheet = workbook.createSheet("๋Œ€์šฉ๋Ÿ‰ ์‹œํŠธ");

        // ํ–‰ ์ƒ์„ฑ
        Row headerRow = sheet.createRow(0); // ํ—ค๋” ํ–‰ ์ƒ์„ฑ
        headerRow.createCell(0).setCellValue("๋ฒˆํ˜ธ");
        headerRow.createCell(1).setCellValue("์ด๋ฆ„");
        headerRow.createCell(2).setCellValue("์ ์ˆ˜");

        // ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ (10๋งŒ๊ฑด) Cell ์ƒ์„ฑ
        for (int i = 1; i <= 100000; i++) {
            Row row = sheet.createRow(i);
            row.createCell(0).setCellValue(i);
            row.createCell(1).setCellValue("์ด๋ฆ„-" + i);
            row.createCell(2).setCellValue(Math.random() * 100);
        }

   

String filename = "test"+currentDate + ".xlsx";

Stirng encodedFilename = URLEncoder.encode(filename , "UTF-8").replaceAll("\\u002B","%20");

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

response.setHeader("Content-Dispostion", "attachment; filename*= UTF-8""+encoderFilename);

 

workbook.write(bufferedOutputStream);

bufferedOutputStream.flush();


    }
}

 

 

 

์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  

Stirng encodedFilename = URLEncoder.encode(filename , "UTF-8").replaceAll("\\u002B","%20"); 

ํŒŒ์ผ๋ช… ์ธ์ฝ”๋”ฉ ๋ถ€๋ถ„

  • ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP ์‘๋‹ต ํ—ค๋”์˜ ํŒŒ์ผ๋ช…์„ ๋ฐ›์„ ๋•Œ ํŠน์ˆ˜ ๋ฌธ์ž๋‚˜ ํ•œ๊ธ€ ๋“ฑ์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŒŒ์ผ๋ช…์— ํ•œ๊ธ€์ด๋‚˜ ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๋ช…์„ URL ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ

 

 

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

์œ„ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ HTTP ์‘๋‹ต์„ ๋ฐ›์€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—‘์…€ ํŒŒ์ผ์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•จ

 

 

response.setHeader("Content-Disposition", "attachment; filename*= UTF-8""+encoderFilename);

 

  • ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•  ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.
  • ํŠนํžˆ ๊ตญ์ œ ํ‘œ์ค€(RFC 5987)์— ๋”ฐ๋ฅธ filename* ๋ฐฉ์‹์€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ UTF-8 ์ธ์ฝ”๋”ฉ๋œ ํŒŒ์ผ๋ช…์„ ์ง€์›
  • attachment: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด ํŒŒ์ผ์„ ์ฒจ๋ถ€ํŒŒ์ผ(๋‹ค์šด๋กœ๋“œ)๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •.
  • filename*: ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ UTF-8๋กœ ๋ช…์‹œํ•˜๋ฉฐ ์ธ์ฝ”๋”ฉ๋œ ํŒŒ์ผ๋ช…์„ ์ง€์ •.

 

workbook.write(bufferedOutputStream);

Workbook ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์กด์žฌํ•˜๋Š” ์ƒํƒœ์ด๋ฉฐ,
์ด๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ํŒŒ์ผ๋กœ ๋‚ด๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

๋™์ž‘ ๊ณผ์ •

  • Apache POI๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ด์•„๋‘” Workbook ๋ฐ์ดํ„ฐ๋ฅผ OutputStream์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์—‘์…€ ํŒŒ์ผ๋กœ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

 

bufferedOutputStream.flush();

  • Java์˜ BufferedOutputStream์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ฒ„ํผ์— ์ž„์‹œ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„ํผ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด?

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „๋‹ฌํ•ด๋„, ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ‰์‹œ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
  • ํŒŒ์ผ์˜ ๋๋ถ€๋ถ„์ด ์ „์†ก๋˜์ง€ ์•Š์•„ ์—‘์…€ ํŒŒ์ผ์ด ๊นจ์ง€๊ฑฐ๋‚˜ ์†์ƒ๋  ์ˆ˜ ์žˆ์Œ

 

 

https://poi.apache.org/

 

Apache POI™ - the Java API for Microsoft Documents

<!--+ |breadtrail +--> <!--+ |start Menu, mainarea +--> <!--+ |start Menu +--> <!--+ |end Menu +--> <!--+ |start content +--> Apache POI™ - the Java API for Microsoft Documents Project News 8 January 2025 - POI 5.4.0 available The Apache POI team is plea

poi.apache.org

 

๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ OOM(Out Of Memory) ํ•ด๊ฒฐ ๊ณผ์ •

์„œ๋ฒ„๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋จนํ†ต์ด ๋œ ๊ฒฝํ—˜์„ ํ–ˆ๋‹ค.์šด์˜ ์ค‘์ธ ์„œ๋ฒ„์˜ CPU ์‚ฌ์šฉ๋ฅ ์ด ๊ธ‰๊ฒฉํžˆ ์ƒ์Šนํ•˜๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋ฒ„๋ ธ๋‹ค.์„œ๋ฒ„๋ฅผ ์ฆ‰์‹œ ์žฌ๊ฐ€๋™ํ•˜๊ณ  ์›์ธ์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, OOM(Out Of Memory)์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„๊ฐ€ ์ค‘๋‹จ๋œ

dev-coco.tistory.com

https://devinn.dev/blog/detail/237

 

Blog | Dev.Inn | Apache POI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ํŒŒํ•ด์ณ๋ณด์ž!!!

Apache POI๋Š” ์•„ํŒŒ์น˜ ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋‹จ์—์„œ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์˜คํ”ผ์Šค ํŒŒ์ผ ํฌ๋งท์„ ์ˆœ์ˆ˜ ์ž๋ฐ” ์–ธ์–ด๋กœ์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์—‘์…€๋‹ค์šด๋กœ๋“œ ๋ฐ ์—‘์…€ ํŒŒ์ผ์„ ์ฝ์„

devinn.dev