Spring Boot에서 CSV 출력 기능 만들기

Kotlin Spring Boot DEVELOPMENT IT

테이블의 데이터를 CSV로 출력할 일이 생겨서 이리저리 검색하다 알게된 내용을 간단히 정리한다.

이 정리는 Kotlin + Gradle 기반으로 진행한다.

Dependency

implementation("org.apache.commons:commons-csv:1.9.0")

CSV Generator Class

package com.itchefblog.blog.utilities.csv

import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVPrinter
import java.io.IOException
import java.io.PrintWriter

class CSVGenerator {
    companion object {
        fun dataToCSV(writer: PrintWriter, dataList: List<TestData>) {
            var csvPrinter: CSVPrinter? = null
            try {
                csvPrinter = CSVPrinter(writer, CSVFormat.EXCEL.withHeader("시퀀스", "제목", "내용", "작성자", "작성일시", "수정일시"))
                for(data in dataList) {
                    val item = listOf(
                        data.no,
                        data.title,
                        data.content,
                        data.userId,
                        data.registerDatetime,
                        data.updateDatetime,
                    )
                    csvPrinter.printRecord(item)
                    csvPrinter.flush()
                }
            }catch(e: Exception){
                e.printStackTrace()
            }finally {
                try {
                    csvPrinter!!.close()
                }catch(e: IOException){
                    println("Flushing or Closing Error")
                    e.printStackTrace()
                }
            }
        }
    }
}

위와 같이 CSV Generator의 dataToCSV 메소드에서 전달받은 dataList의 내용을 루프를 돌면서 item에 매핑하여 csvPrinter.printRecord에 넘겨준다.

Controller

@GetMapping("/csv")
    fun downloadTestDataAsCSV(
        response: HttpServletResponse,
    ) {
            val dataList = testDataService.findAll()
            val fileName = "${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"))}_TEST_DATA.csv"
            response.contentType = "text/csv"
            response.setHeader("Content-Disposition", "attachment; filename=$fileName")
            CSVGenerator.dataToCSV(response.writer, dataList)
    }

컨트롤러에서는 위와같이 /csv로 들어온 request에 따라 testDataService의 데이터를 모두 읽어와서 dataList에 저장하고, 이녀석을 CSVGenerator.dataToCSV에 response.writer과 함께 넘겨준다.
CSVGenerator에서 csv처리한 내용들을 HttpServletResponse가 브라우저로 리턴해준다.
파일명은 위의 fileName으로 저장이 된다.

CSVGenerator를 생성하지 않았는데도 메소드를 바로 호출 가능한 이유는…?
companion object 로 선언되었기에..

———————————————-

여기에 인증 등의 기능을 추가하면 권한이 있는 사용자만 다운로드가 가능하다.
(실제 적용한 코드에는 인증기능이 있지만 이 포스팅은 CSV 기능만을 위한거라 제거했다.)

이 기능을 도입한 목적은 ajax로 header값을 같이 넘겨서 인증한 후 다운로드 처릴 하는것이었기에 단순히 get 방식으로 url redirect만 해서는 사용할 수 없었다..

그래서 다음 포스팅에서는 jQuery ajax를 이용해서 header와 함께 csv 다운로드 요청을 하고, 리턴받은 response 데이터를 이용해 실제로 저장하는 예제를 작성해볼 예정이다.

1 thought on “Spring Boot에서 CSV 출력 기능 만들기”

Comments are closed.