๐ŸŒฟ Spring

[SpringBoot] Apache Poi๋ฅผ ์ด์šฉํ•œ ์—‘์…€๋‹ค์šด๋กœ๋“œ๋Š” SXSSF๋ฅผ ์“ฐ์ž..!

์—ฐ_์šฐ๋ฆฌ 2022. 12. 3. 00:07
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์—๋Ÿฌ ๋ฐœ์ƒ!!!!!!!!!!!!

     

    https://lotuus.tistory.com/145

     

    [SpringBoot] Apache Poi๋ฅผ ์ด์šฉํ•œ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ตฌํ˜„

    ๋ชฉ์ฐจ ํ†ต๊ณ„ API๋ฅผ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ํ™”๋ฉด์—๋„ ๊ฐ’์„ ๋ณด์—ฌ์ฃผ์–ด์•ผํ•˜๊ณ , ์—‘์…€ ๋‹ค์šด๋กœ๋“œ๋„ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ใ…Žใ…Ž ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Apache Poi๋ฅผ ์ด์šฉํ•˜์—ฌ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹น! ์˜ˆ์ œ UserPoint En

    lotuus.tistory.com

     

    ์˜ˆ์ „์—๋„ ์—‘์…€๋‹ค์šด๋กœ๋“œ ๊ฒŒ์‹œ๊ธ€์„ ์˜ฌ๋ ธ์—ˆ๋Š”๋ฐ, 

    ์šด์˜์—์„œ ๊ฐ‘์ž๊ธฐ ํž™๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉฐ Out Of Memory ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.....

    ์ด์œ ๋Š” ๋‘๊ฐ€์ง€์˜€๋‹ค

     

     

     

    ์ฒซ๋ฒˆ์งธ ) ์š”์ฒญ ์ค‘๋ณต ํ•„ํ„ฐ๋ง ์•ˆํ•จ

    ํ™”๋ฉด์— ๋ณด์ด๋Š” ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ , ์‹ค์ œ ๋‹ค์šด๋กœ๋“œ ์ฐฝ์ด ๋œฐ๋•Œ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฐ๋‹ค

    ๊ทธ๋Ÿฐ๋ฐ ์ฐธ์„์„ฑ ์—†๋Š” ๋ถ„๋“ค์ด ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ (์‚ฌ์‹ค ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋„ ์•Š๋Š”๋‹ค...๊ณ  ์ƒใ„ฑ๊ฐ€ํ•œ๋‹ค ใ…œใ…œใ…œ)

    ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ„์† ์ค‘๋ณตํ•ด์„œ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์—ˆ๋‹ค

     

    ํ”„๋ก ํŠธ์—์„œ๋„ ์ค‘๋ณต ํด๋ฆญ ๋ฐฉ์ง€๊ฐ€ ์—†๊ณ .. ๋ฐฑ์—”๋“œ์—์„œ๋„ ์ค‘๋ณต ํด๋ฆญ์„ ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—

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

    ๊ฒฐ๊ตญ Out Of Memory๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋˜์—ˆ๋‹ค!

     

     

     

     

    ๋‘๋ฒˆ์งธ ) XSSF ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•˜์—ฌ ์—‘์…€ ํŒŒ์ผ ์ƒ์„ฑํ•จ

    - XSSF๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์ผ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์•„๋‘๊ณ  ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹
    - SXSSF๋Š” ์ž„์‹œํŒŒ์ผ์„ ์ค‘๊ฐ„์ค‘๊ฐ„ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

    (์œ„์˜ ์ฐจ์ด์ ์„ ์ผ์ฐ ์•Œ์•˜๋”๋ผ๋ฉด Out Of Memory ๋ฐœ์ƒ๋นˆ๋„๊ฐ€ ์ค„์ง€ ์•Š์•˜์„๊นŒ...? ๋ˆˆ๋ฌผ...)

     

    XSSF๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—‘์…€๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋†จ๋Š”๋ฐ

    ์ฒซ๋ฒˆ์งธ ์š”์ธ์ด ๊ฒน์น˜๋ฉด์„œ ๋‹ค์šด๋กœ๋“œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๊ณ„์† ์˜ฌ๋ ค๋†“๋Š” ์ƒํ™ฉ์ด ๋˜๋‹ˆ 

    Out Of Memory๊ฐ€ ๋ฐœ์ƒ๋˜๋Š”๊ฑด ๋‹น์—ฐํ•œ ๋ฌธ์ œ์˜€๋‹ค....

     

     

     

     

     

     

    ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    ์ฒซ๋ฒˆ์งธ ) ์ค‘๋ณต ์š”์ฒญ ํ•„ํ„ฐ๋ง

    ๋‚ด๊ฐ€ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋Š” ์—‘์…€๋‹ค์šด๋กœ๋“œ๊ฐ€ ํ•˜๋ฃจ์— ํ•œ๋‘๋ฒˆ? ์ •๋„๋งŒ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ ์žˆ์–ด์„œ 

    ์‹ค์ œ๋กœ ํ•ด๋ณด์ง„์•Š์•˜์ง€๋งŒ ์•„์ด๋””์–ด๋Š” ์žˆ๋‹ค.

    ๋‹ค์šด๋กœ๋“œ ์š”์ฒญ ์‹œ Request Parameter๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด ๊ฐ€์ง€๊ณ ์žˆ๋‹ค๊ฐ€

    ๋‹ค์Œ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ Request Parameter๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋ฐ”๊พผ๊ฐ’๊ณผ ์„œ๋กœ ๋น„๊ตํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

     

    1๋ฒˆ์งธ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•ด์‹œ๊ฐ’๊ณผ 2๋ฒˆ์งธ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ์ค‘๋ณต์š”์ฒญ์ด๋ฏ€๋กœ ๊ฑธ๋Ÿฌ๋‚ด๋ฉด ๋œ๋‹ค.

     

    ์ผ๋‹จ ๋‚˜๋Š”... ์—๋Ÿฌ๊ฐ€ ๋ง‰ ํ„ฐ์ง€๊ณ  ์žˆ๋˜ ์ƒํ™ฉ์ด์˜€์–ด์„œ ๋น ๋ฅด๊ฒŒ ํ”„๋ก ํŠธ์— ๋ง‰์•„๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ๋‹ค ^^..

     

     

     

     

    ๋‘๋ฒˆ์งธ ) SXSSF ๊ตฌํ˜„์ฒด๋กœ ์—‘์…€ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค

    ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ SXSSF๋Š”

    [์ž„์‹œํŒŒ์ผ์„ ์ค‘๊ฐ„์ค‘๊ฐ„ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹]์œผ๋กœ ์—‘์…€ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

    ๋ฐ”๋กœ ์ ์šฉํ•ด๋ณด์ž.

     

    /**
     * ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ตฌํ˜„ ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ
     */ 
    private void createExcelDownloadResponse(HttpServletResponse response, List<UserPoint> userPointList) {
    
        try{
            //์ œ๊ฑฐ
            //Workbook workbook = new XSSFWorkbook();  
            
            //์ถ”๊ฐ€๐Ÿ”ฅ : SXSSF ์‚ฌ์šฉ
            Workbook workbook = new SXSSFWorkbook();
            Sheet sheet = workbook.createSheet("์‚ฌ์šฉ์ž ํฌ์ธํŠธ ํ†ต๊ณ„");
    
    
            //์ˆซ์ž ํฌ๋งท ์ฒ˜๋ฆฌ
            //ํŒŒ์ผ๋ช… ์ฒ˜๋ฆฌ
            //ํ—ค๋” ์ฒ˜๋ฆฌ
            //๋ฐ”๋”” ์ฒ˜๋ฆฌ
    
    
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8")+".xlsx");
            //ํŒŒ์ผ๋ช…์€ URLEncoder๋กœ ๊ฐ์‹ธ์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค!
            
            
            //์ œ๊ฑฐ
            //workbook.write(response.getOutputStream());
            //workbook.close();
    
            
            //์ถ”๊ฐ€๐Ÿ”ฅ : ์ค‘๊ฐ„์ค‘๊ฐ„ ์ž„์‹œํŒŒ์ผ์„ ๋งŒ๋“ค์–ด OOM์„ ๋ฐฉ์ง€ํ•œ๋‹ค
            OutputStream tempFile = response.getOutputStream();
            workbook.write(tempFile);
            tempFile.close();
            
            response.getOutputStream().flush();
            response.getOutputStream().close();
            
            workbook.dispose();  //์ž„์‹œํŒŒ์ผ ์‚ญ์ œ
    	    
        }catch(IOException e){
            e.printStackTrace();
        }
    
    }

     

     

     

     

    ์—‘์…€๋‹ค์šด๋กœ๋“œ SXSSF๋กœ ๋ฐ”๊พผ ํ›„ Out Of Memory ๋ฌธ์ œ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค!

    ํŽธ์•ˆํ•œ ์ฃผ๋ง์„ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ๊ผญ. ํ•„์ˆ˜๋กœ SXSSF ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ž!!!

     

     

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ