상세 컨텐츠

본문 제목

Java Object to CSV

IT 보안/이슈·동향

by 신시웨이 공식 블로그 2020. 11. 26. 16:02

본문

Jackson 라이브러리를 사용하면 자바 객체에 담긴 내용을 Json 뿐만 아니라 CSV(Comma-Separated Values)로도 전환 할 수 있습니다. CSV는 엑셀로 파일을 바로 열어보려는 요구에서 주로 사용 되는데 자바 객체에 담긴 내용을 CSV로 전환하고 파일로 저장하는 방법을 알아 보고자 합니다.

 

pom.xml

jackson-databind, jackson-dataformat-csv를 추가한다.

그러나 jackson-databind에는 jackson-core,  jackson-annotation 의존성이 있어, jackson-databind 만 있어도 된다.

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-csv</artifactId>
</dependency>

 

자바 객체에서 CSV 파일 생성

CSV 형식은 데이터베이스 테이블처럼 열(Column)과 행(Row)으로 표현된다. 자바 객체를 리스트로(java.util.List)로 전달하면, 데이터를 담고 있는 변수로 컬럼을 구성하고 리스트로 들어오는 데이터를 행 단위로 써 내려가는 식이다.

 

Java Object(VO)

변수 위에 @JsonProperty("제목")으로 CSV Header에 해당하는 컬럼명을 별도 지정할 수 있다. @JsonPropertyOrder로 컬럼의 순서도 바꿀 수 있다. @Getter @Setter도 달아준다.

@Getter @Setter
@JsonPropertyOrder({"아이디","이름","제목"})
public class ResponseVo {
@JsonProperty("이름")
private String name;
@JsonProperty("제목")
private String title;
@JsonProperty("아이디")
private String userId;
...
```

 

CsvMapper, CsvSchema

JSON에서 ObjectMapper를 사용한 것 처럼, CSV CsvMapper를 사용한다. CsvSchema로 원하는 형식을 잡아준다.

CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = csvMapper
.schemaFor(ResponseDto.class)
.withHeader()
.withColumnSeparator(',').withLineSeparator("\n")
.enable(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS);
```
//사용한 스키마 설정은 다음과 같다.

//CSV 파일로 생성할 자바 객체의 클래스 정보
`.schemaFor(ResponseVo.class)` 
//CSV 헤더 사용 여부
`.withHeader()` 
//컬럼 간 구분자와 개행의 정의
`.withColumnSeparator(',').withLineSeparator("\n");` 
//필드 값을 더블 쿼테이션("")으로 묶기, 엑셀에서 파일을 열 때 개행이 있는 문장을 하나의 셀에 담아준다. 
`.enable(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS)` 

 

파일 생성

파일을 준비하고 ObjectWriter로 리스트 데이터로 파일을 작성한다.

ObjectWriter writer = csvMapper.writer(csvSchema);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
			new FileOutputStream(new File("/data/output.csv")), "MS949");
writer.writeValues(outputStreamWriter).writeAll(responseVoList);

CsvMapper에서 바로 파일로 내려쓰는 방법도 있지만, OutputStreamWriter에서 인코딩(MS949)을 설정하여야 UTF-8로 저장해 둔 한글을 엑셀에서 정상적으로 볼 수 있다.

`.writeAll(responseVoList)` 스키마에 넘겼던 객체의 리스트 인스턴스를 넘겨주면 끝이지만, 파일이 아닌 문자열로 받고 싶다면, JSON처럼 writeValueAsString을 쓸 수도 있다

`csvMapper.writer(csvSchema).writeValueAsString(responseDtoList);`

 

적용

// CsvFileOut
public void csvFileOut(Class<?> clazz, File csvFile, List<?> dataList) {
try {
	CsvMapper csvMapper = new CsvMapper();
	CsvSchema csvSchema = csvMapper.enable(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS)
	.schemaFor(clazz).withHeader().withColumnSeparator(',').withLineSeparator("\n");
	ObjectWriter writer = csvMapper.writer(csvSchema);
	OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(csvFile), "MS949");
	writer.writeValues(outputStreamWriter).writeAll(dataList);
} catch (Exception e) {
  // 아직 남은 예외 처리
}
// 호출
List<Response> responseDtoList = /* 리스트 생성 */
File csvFile = new File(“filename.csv”);
csvFileOut(ResponseDto.class, csvFile, responseDtoList);
```

글. SIGN팀 | 류대석

편집. 프리세일즈·마케팅팀 | 박병민

관련글 더보기