JFreeChart는 Java로 작성된 오픈 소스 차트 라이브러리로, 다양한 유형의 차트를 생성하고 커스터마이징할 수 있도록 지원한다.
이 라이브러리는 Swing 컴포넌트로 차트를 표시할 수 있으며, 이미지 또는 SVG 파일로 출력할 수도 있다.
Swing은 Java에서 GUI (그래픽 사용자 인터페이스)를 개발하기 위한 툴킷이자 라이브러리.
Java에서 UI를 구축하고 사용자와 상호 작용하는 데 사용되며, AWT (Abstract Window Toolkit)를 기반으로 하며, AWT보다 풍부한 기능을 제공한다.
회사에서 나는 동적으로 사용할 일이 없어서 (웹에서의 동적 차트는 프론트가 JS로 깔끔한 차트 라이브러리를 사용한다)
이메일에 첨부할 정적 차트 이미지로 JFreeChart을 사용한다.
https://www.jfree.org/jfreechart/samples.html
JFreeChart: Samples
Note: All the samples on this page are created using programs that are available for download (the complete source code) when you purchase the JFreeChart Developer Guide. The tooltip text for each image is the name of the demo application source file.
www.jfree.org
JFreeChart의 주요 기능은 아래와 같다.
1. 다양한 차트 유형: 선 그래프, 막대 그래프, 원형 차트, 산점도, 범주형 차트 등 다양한 차트 유형을 지원.
2. 데이터 시리즈: JFreeChart는 다수의 데이터 시리즈를 관리하고 표시.
3. 스타일 및 레이아웃 커스터마이징: 차트의 스타일, 레이아웃, 색상 등을 사용자 정의 가능.
4. 범례 및 라벨: 범례를 통해 데이터 시리즈를 설명하고, 라벨을 추가하여 차트를 보다 명확하게 만들 수 있다.
5. 이벤트 처리: 사용자가 차트를 상호 작용할 수 있는 이벤트 처리를 지원.
6. 다양한 출력 형식: Swing 컴포넌트로 차트를 표시할 수 있으며, 이미지 파일로 출력하거나, SVG 형식으로 내보낼 수도 있다.
내가 XChart를 사용하지 않고 JFreeChart를 사용하는 이유는 모양, 색상을 자유롭게 커스텀할 수 있기 때문이다.
내가 사내 프로젝트에서 사용하는 기술은 각각의 데이터들을 정제, 가공하여 해당 Member에게 주기적으로 해당 데이터의 차트를 메일링하는 것이다.
기술 스택은 Spring Batch, Spring Mail, Scheduler를 사용한다. 다다음 포스팅에서는 Batch와 Scheduling에 대해 서술할 예정이다.
JFreeChart 사용하기
첫 번째 단계로 해야 할 것은 JFreeChart를 Gradle 프로젝트에 추가하고, 차트를 생성하는 것이다.
두번째 단계로는 JFreeChart가 제공하는 객체에서 차트가 생성(bitmap)되면, 이를 이미지 파일(png/img)로 저장하는 것이다. (전에 보냈던 이미지 파일도 갖고있어야 함.)
세번째는 이를 Base64로 변환하여 Html에 담는 것이다.
첫 번째 단계
아래는 차트를 생성하는 코드이다.
@Service
public class GraphGenerator_JFreeChart {
public void generateGraph(String email) throws IOException {
// 예제 데이터 생성
CategoryDataset dataset = createDataset();
// 차트 생성
JFreeChart chart = ChartFactory.createBarChart(
"Sample Chart",
"Category",
"Value",
dataset
);
}
//Dataset 설정
private static CategoryDataset createDataset() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1.0, "Series1", "Category1");
dataset.addValue(4.0, "Series1", "Category2");
dataset.addValue(31.0, "Series1", "Category3");
dataset.addValue(15.0, "Series1", "Category4");
return dataset;
}
두 번째 단계
JFreeChart 객체를 사용하여 차트를 생성하고 이미지 파일로 저장하기 JFreeChart를 사용하여 차트를 생성하고 이미지 파일로 저장하는 부분은 코드로 구현되어야 한다. 예를 들어, ChartUtilities 클래스를 사용하여 이미지 파일로 저장할 수 있다. 이 단계의 관련 코드는 아래와 같다.
ChartUtils.saveChartAsPNG(new File("프로젝트/내부에서/이미지/파일/저장할/경로/"+파일명+".png"),chart,800,600);
세 번째 단계
Base64로 변환을 하려면 아래와 같이 변환해주는 메소드를 생성해주는 것이 좋다. 나는 이메일로 보낼 메시지 DTO(받는 사람이 파일명)에서 png파일을 Base64로 변환하는 메소드를 만들었다.
@Builder
public record EmailMessage(String to, String subject, String message) {
public String convertImgToBase64() throws IOException {
// 이메일 형식에서 특수문자 제거
String fileName = this.to().replaceAll("[-@.]", "");
// 해당 파일을 찾아 byte 배열로 저장
byte[] fileContent = FileUtils.readFileToByteArray(new File("/Users/jujonghun/Desktop/MailingSampleProject/src/main/resources/generated/"+fileName+".png"));
// Base64로 변환 후 return
return Base64.getEncoder().encodeToString(fileContent);
}
}
그 후에 아래처럼 HTML 스트링으로 저장을 하면 된다. 아래는 예시.
String html = "<html><body><img src='data:image/png;base64," + emailMessage.converyImgToBase64() + "'></body></html>";
위 HTML을 이메일로 보내면 아래와 같이 잘 보내진다. 이메일 보내는 방법은 알아서.
다음 포스팅은 위 그래프를 꾸며보도록 하겠다.
'DEV > JAVA' 카테고리의 다른 글
Java8부터 도입된 Stream(2) - Stream 중간처리 메소드 (0) | 2023.08.11 |
---|---|
Java8부터 도입된 Stream(1) - Stream의 개념 (0) | 2023.08.11 |
인터페이스 정리 코드(자바) (0) | 2022.11.18 |
추상 클래스와 인터페이스의 차이 (0) | 2022.11.18 |