Jackson 라이브러리를 사용하면 자바 객체에 담긴 내용을 Json 뿐만 아니라 CSV(Comma-Separated Values)로도 전환 할 수 있습니다. CSV는 엑셀로 파일을 바로 열어보려는 요구에서 주로 사용 되는데 자바 객체에 담긴 내용을 CSV로 전환하고 파일로 저장하는 방법을 알아 보고자 합니다.
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 형식은 데이터베이스 테이블처럼 열(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팀 | 류대석
편집. 프리세일즈·마케팅팀 | 박병민
문자열 처리 함수 strstr, strcasecmp Tip (0) | 2020.12.08 |
---|---|
암호화 패딩(Padding) & Base64 Encoding (0) | 2020.12.07 |
새로운 웹 기능 WebAssembly (0) | 2020.11.05 |
금융회사에서의 데이터변경 처리 절차(전자금융감독규정) (0) | 2020.11.02 |
보안담당자를 위한 데이터베이스 보안 강화 방법 (0) | 2020.10.30 |
댓글 영역