Mybatis์™€ Apache POI ๋ฅผ ์ด์šฉํ•œ ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ฐœ์„ 

๊ฐœ์š”

์‚ฌ๋‚ด์˜ ๋ ˆ๊ฑฐ์‹œ ์–ด๋“œ๋ฏผ ์‹œ์Šคํ…œ์—์„œ ์ž๊พธ ํŠน์ • ์‹œ๊ฐ„์— ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ์ด ์น˜์†Ÿ๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๋ฉˆ์ถ”๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

์›์ธ์„ ๋ถ„์„ํ•ด๋ณธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ฑด์ˆ˜๊ฐ€ ๋งŽ์€ ๋ฉ”๋‰ด์—์„œ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ์š”์ฒญ์‹œ ์ „์ฒด ์กฐํšŒ -> List ํ˜•ํƒœ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ -> ์—‘์…€ ์ƒ์„ฑ -> ๋‹ค์šด๋กœ๋“œ ๊ณต์ •์œผ๋กœ ํŒŒ์ผ์„ ๋‚ด๋ ค์คฌ๋Š”๋ฐ,

 

๋ฐ์ดํ„ฐ๊ฐ€ ์ ์—ˆ๋‹ค๋ฉด ์ƒ๊ด€์—†์ง€๋งŒ ํ•ด๋‹น ๋ฉ”๋‰ด๋Š” ๊ธฐ๊ฐ„์„ ์กฐ๊ธˆ๋งŒ ๋Š˜๋ ค๋„ ์ˆ˜์‹ญ๋งŒ ๊ฑด์—์„œ 100๋งŒ๊ฑด ๊นŒ์ง€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋‰ด์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

 

๊ฒฐ๊ตญ ๋Œ€์šฉ๋Ÿ‰ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๊ณต์ •์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•ด์กŒ๋Š”๋ฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์žˆ์—ˆ๋˜ ๊ณผ์ •๋“ค์„ ๋ช‡๊ฐ€์ง€ ๊ธฐ๋กํ•ด๋ณผ๊นŒ ํ•œ๋‹ค.

์›์ธ ์ฐพ๊ธฐ

๊ฐœ์š”์— ์ž‘์„ฑํ–ˆ์ง€๋งŒ, ๊ธฐ์กด์˜ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ฐ์ดํ„ฐ ์ „์ฒด ์กฐํšŒ ์š”์ฒญ
  2. JDBC ๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ List ์— ์ผ๊ด„ ์ €์žฅ
  3. Apache Poi ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ผ๊ด„ ์—‘์…€ File ์ƒ์„ฑ
  4. ์ž„์‹œ ์ƒ์„ฑํ•œ ํŒŒ์ผ์„ response ๋กœ ์‘๋‹ต ์ฒ˜๋ฆฌ

์ž์„ธํ•œ ์ง„๋‹จ์„ ํ•˜๊ธฐ ์ „์—๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ XSSF ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์—‘์…€์„ ๋งŒ๋“ค๋˜ ๋„์ค‘ OOM(Out of Memory Error) ๋กœ ์ธํ•œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์ด๋ผ ์ถ”์ธกํ–ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆํ•œ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“ค์—ˆ๋˜ ๊ฒƒ์ด 100๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ List ์ž๋ฃŒํ˜•์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ”๋กœ ์˜ฌ๋ฆฌ๋Š”๋ฐ ์ด ์‹œ์ ์—๋Š” ์žฅ์• ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”์ง€๊ฐ€ ์˜๋ฌธ์ด์—ˆ๋‹ค.

 

๋งŒ์•ฝ ์˜๋ฌธ์ด ๋งž์•˜๋‹ค๋ฉด ์‹ค์ œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์€ 3๋ฒˆ์ด ์•„๋‹ˆ๊ณ  2๋ฒˆ ์‹œ์ ์ผ ๊ฒƒ์ด์—ˆ๋‹ค.

 

์‚ฌ์‹ค 2๋ฒˆ์ด๋˜ 3๋ฒˆ์ด๋˜ ์ด๋ฏธ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ฐฉํ–ฅ์€ ๋Œ€์ถฉ ๊ฐ์ด ์žกํ˜”์ง€๋งŒ, ์ด์ „๋ถ€ํ„ฐ ๋ผ์ด๋ธŒ ์„œ๋น„์Šค์˜ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ OOM์„ ๋ฉ‹์ง€๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ํ™˜์ƒ(?)์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์›์ธ์„ ์ง„๋‹จํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์กฐ๊ธˆ ๋” ์ •๋ฐ€ํ•˜๊ฒŒ ๋ถ„์„ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์žฌํ˜„์„ ํ•ด๋ณด์•˜๋‹ค.

 

๋กœ์ปฌ์—์„œ ๊ตฌ๋™ํ•˜๋”๋ผ๋„ ์‹ค์ œ ์„œ๋ฒ„์™€ Heap ๊ณต๊ฐ„ ํฌ๊ธฐ์— ์ฐจ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ์„  VM Option ์œผ๋กœ ๊ฐ™์€ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด ์ฃผ์—ˆ๋‹ค.

 

๊ทธ ํ›„ OutOfMemory ์‹œ HeapDump ํŒŒ์ผ์„ ๋‚จ๊ธฐ๋„๋ก ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

-Xms:1024m
-Xmx:2048m
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/path/to/dump/directory

 

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋กœ ์ถ”์ •๋˜๋Š” ์—‘์…€ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฝ๊ณผ๋ฅผ ์ง€์ผœ๋ณด์•˜๋”๋‹ˆ ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

ํ•ด๋‹น ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€

 

๋‹คํ–‰ํžˆ ์˜ˆ์ƒ๋Œ€๋กœ OOM ์ด ๋ฐœ์ƒํ•˜์˜€์œผ๋ฏ€๋กœ ๋ฐฉ๊ธˆ ์ค€ ์˜ต์…˜์œผ๋กœ ์ธํ•ด HeapDump ํŒŒ์ผ์ด ์ƒ์„ฑ ๋˜์—ˆ๊ณ ,
์ข€ ์ „ ์ง€์ •ํ•œ ๊ฒฝ๋กœ์— ์ƒ๊ธด hprof ํ™•์žฅ์ž์˜ heap dump ํŒŒ์ผ์„ Eclipse Memory Analizer ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ„์„ํ–ˆ๋‹ค.

(heapdump ๋ถ„์„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ฐธ์กฐํ•œ ๋งํฌ: https://jupiny.com/2019/07/15/java-heap-dump-analysis/)

 

 

๋ถ„์„ ๊ฒฐ๊ณผ Heap ์ ์œ ๋Š” iBtais ํŒจํ‚ค์ง€ ๋‚ด DefaultResultHandler ์—์„œ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋“ค๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

 

ํ•ด๋‹น API ๋Š” resultSet ์—์„œ ํ•œ ์ค„์”ฉ ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ List ์— ๋๊นŒ์ง€ add ํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค.


์˜ˆ์ƒ๋Œ€๋กœ repository layer ์—์„œ ์ตœ์ดˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํŽ˜์ด์ง•๋„ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์— ์Œ“๋Š” ์‹œ์ ๋ถ€ํ„ฐ ์ด๋ฏธ GC ๋ฅผ ๋งˆ๋น„์‹œํ‚ฌ ์ •๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ์ง„ํ–‰๋˜์—ˆ๋‹ค.

CustomResultHandler ์ œ์ž‘

Mybatis ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ResultHandler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ปค์Šคํ…€ ResultHandler ๊ฐ์ฒด๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


์•ž์„œ DefaultResultHandler ๊ฐ์ฒด๊ฐ€ ๋‹จ์ˆœํ•˜๊ฒŒ ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ์ค„์”ฉ List์— Add ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๋ผ๋ฉด, ์ž„์˜๋กœ ๋งŒ๋“  ResultHandler ๊ฐ์ฒด์—์„œ ํ•œ ์ค„์”ฉ Excel ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋  ์ผ์ด์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ธฐ์กด๋Œ€๋กœ XSSF ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์—‘์…€๋กœ ๋‚ด๋ณด๋‚ผ ๋•Œ ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๋ฏ€๋กœ ์•ž์„œ List ์— ์ €์žฅํ•˜๋˜ ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.


๋”ฐ๋ผ์„œ SXSSF ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด์•ผ ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ •๋ณด๋ฅผ ํŒŒ์ผ๋กœ flush ํ•ด์ฃผ๊ณ  ๋น„์šฐ๋Š” ๋™์ž‘์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•ž์„œ ๋งํ•œ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด CustomResultHandler ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.

@Slf4j
public class MyCustomResultHandler implements ResultHandler {

    private final Workbook workbook;
    private Sheet sheet;
    private rowIndex = 3;

    public MyCustomResultHandler(Workbook workbook) {
        this.workbook = workbook;
        createSheet();
    }


    private void createSheet() {
        sheet = workbook.createSheet("Sheet Name");

        //Set Styles ...
        //Create Title ROW ...
        //Create Header ROW ...
    }

    @Override
    public void handleResult(ResultContext resultContext) {

        Map<String, Object> result = (Map<String, Object>) resultContext.getResultObject();

        Row row = sheet.createRow(rowIndex++);

        //๊ธฐ๋กํ•˜๋Š” ๋กœ์ง
    }
}

 

์œ„์—์„œ ๋งŒ๋“  MyCustomResultHandler ๊ฐ์ฒด๋Š” Mybatis ์˜ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ResultHandler ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ServiceLayer ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฐธ์กฐํ•  SXSSF Workbook ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

public void createExcel() {

    SXSSFWorkbook workbook = new SXSSFWorkbook(10000); //flsuh ํ•ด์ค„ row ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    MyCustomResultHandler handler = new MyCustomResultHandler(workbook, resultCount);

    sqlsession.select("statement", params, handler);

    //write and dispose Excel File
}

 

๋‚จ์€ ๊ณผ์ œ

์‚ฌ์‹ค ๊ธฐ์กด ์žฌ์ง ์ธ์›๋“ค์€ ๋ˆ„๋ฅด๋ฉด ์„œ๋น„์Šค๊ฐ€ ์ฃฝ์—ฌ๋ฒ„๋ฆฌ๊ณ  ๋งˆ๋Š” ์น˜๋ช…์ ์ธ ์ŠคํŽ™๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ƒ๊ฐ๋„ ์•ˆํ•˜์ง€๋งŒ, ์‹ ๊ทœ ์ž…์‚ฌ์ž๋“ค๋งŒ ํ•œ๋ฒˆ์”ฉ ๋ˆŒ๋Ÿฌ๋ด์„œ ์‚ฌ๊ณ ๋ฅผ ์น˜๊ณ ์•ผ ๋งˆ๋Š” ๊นœ์ง์ƒ์ž๊ฐ™์€(?) ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ฐœ๋ฐœํŒ€์—์„œ๋„ ์—ฌ์ฐจํ•˜๋ฉด DB์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์„œ ๋ณด๋‚ด์ฃผ๊ณ  ๋ง์ง€ ๋ผ๋Š” ๋Š๋‚Œ์œผ๋กœ ๋‚จ์•„์žˆ๋˜ ์ผ€์ผ€๋ฌต์€ ๊ณผ์ œ์ด๊ธฐ๋Š” ํ•˜์˜€๋Š”๋ฐ, ๋ง‰์ƒ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณด๋‹ˆ ๊ฐœ์„ ํ•ด์•ผ ํ•  ์ ์ด ๋” ๋งŽ์ด ๋ณด์ด๊ธด ํ–ˆ๋‹ค.

  1. 100๋งŒ row ์ •๋„๋ฅผ ์“ฐ๊ฒŒ ๋˜๋ฉด ์ผ๋‹จ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š”๋ฐ ๋„ˆ๋ฌด ์˜ค๋žœ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  2. ๊ธฐ์กด์˜ ๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์–ด์„œ, ์‚ฌ์šฉ์ž๋Š” ๊ฒฐ๊ตญ ์ตœ๋Œ€ 20๋ถ„๊นŒ์ง€ ๋‹ค์šด๋กœ๋“œ ์ค‘ ํ™”๋ฉด๋งŒ ํ•˜์—ผ์—†์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์šฐ์„  ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์ธ ํŒŒ์ผ ์ƒ์„ฑ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด ๋ฌด์—‡์ด ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•ด๋ณธ ๊ฒฐ๊ณผ, JDBC ์กฐํšŒ ์‹œ resultSet ์˜ ๋ฒ„ํผ๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.


ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—๋Š” 10000 row ๊นŒ์ง€ ์—‘์…€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“ค๊ณ  ์žˆ๋‹ค๊ฐ€ flush ํ•˜๋Š”๋ฐ, resultSet ์˜ ํฌ๊ธฐ๋„ 10000์œผ๋กœ ๋งž์ถ”์–ด์ฃผ๋ฉด ์ƒ์„ฑ์†๋„๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ–ˆ๋‹ค.

<select id="queryName" parameterType="hashMap" fetchSize="10000">
<!--query-->
</select>

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด fetchSize ์„ค์ •์„ 10000 ์œผ๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. (default ๊ฐ’์€ 10์ด์—ˆ๋‹ค.)

 

์•„๋ž˜๋Š” ๊ฐ fetchSize๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ์ด๋‹ค.

  • fetch - 10
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ฑด์ˆ˜ : 154325๊ฑด
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ์†Œ์š”์‹œ๊ฐ„ : 326099millis
  • fetch - 200
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ฑด์ˆ˜ : 153908๊ฑด
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ์†Œ์š”์‹œ๊ฐ„ : 80020millis
  • fetch - 10000
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ฑด์ˆ˜ : 154008๊ฑด
    • ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ์†Œ์š”์‹œ๊ฐ„ : 49050millis

fetch size ๋ฅผ ๋†’์ผ์ˆ˜๋ก ๋“œ๋ผ๋งˆํ‹ฑํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋˜๊ณ  ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ•˜์ง€๋งŒ fetch size ๋ฅผ ๋„ˆ๋ฌด ๋†’์ด๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ€๋‹ด์ด ๋˜๊ณ  ์–ด์ฐจํ”ผ flush๊ฐ€ ์ด๋ฃจ์–ด ์งˆ๋•Œ๋งˆ๋‹ค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ ์ •ํ•œ ์ˆ˜์น˜๋ฅผ ์ฐพ๋Š”๊ฒƒ์ด ์ข‹์„๋“ฏ ํ•˜๋‹ค.

 

๋‹ค์Œ์€ ๋‘๋ฒˆ์งธ ๋ฌธ์ œ์ธ ์‚ฌ์šฉ์ž ํ™”๋ฉด ๊ฐœ์„ ์ธ๋ฐ ์•ฝ๊ฐ„์˜ UI์ ์ธ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€๋ฏธํ•œ๋‹ค๋ฉด ์‘๋‹ต๋ฐ›์„ popup ์ด๋‚˜ iframe ์„ ์ œ๊ณตํ•˜์—ฌ ํ•ด๋‹น element ๋กœ return ๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.