Spring를 사용한 Chart 그리기 (JFree Chart)

Back-End/Spring 2019. 6. 21. 12:18
728x90
반응형

- JFreeChart 만들기 -




참고 사이트 : http://www.jfree.org/jfreechart/




  

  JFreeChart의 특징


  다양한 형태의 차트 지원


  Swing, JSP, Servlet 에서 많이 사용되고 있음


  pdf 또는 png, jpg 등의 다양한 이미지 파일 형식으로 export 가능


  오픈 소스 라이브러리




pom.xml에 라이브러리를 추가

1
2
3
4
5
6
.<!-- https://mvnrepository.com/artifact/org.jfree/jfreechart -->
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.0</version>
</dependency>
cs





두가지 형식으로 만들기


JFreeChart (png) : 미리 차트를 만들어서 png파일 (이미지파일) 로 출력시킴 (뷰 => 컨트롤러 => 서비스,서비스구현 => 컨트롤러(바로출력))


JFreeChart (pdf) : 미리 차트를 만들어서 pdf 파일로 만들어주고, 그 파일을 출력함 (뷰 => 컨트롤러 =>서비스,서비스구현 => 컨트롤러 => 뷰)

(pdf 만드는 법은 itextpdf를 사용하는 방법을 써서 만듦)






컨트롤러, 서비스 , 서비스구현 클래스 만들어서 사용



admin_menu.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.<!-- 메뉴 링크를 추가하고 PDF리스트로 갈수있는 링크도 추가 -->
<a href="${path}/pdf/list.do">PDF</a>
<a href="${path}/chart/chart1.do">구글차트(json)</a>
<a href="${path}/chart/chart2.do">구글차트(db)</a>
<a href="${path}/jchart/chart2.do">JFreeChart(png)</a>
<a href="${path}/jchart/chart2.do">JFreeChart(pdf)</a>
<a href="${path}/email/write.do">이메일 발송</a>
<a href="${path}/shop/product/list.do">상품목록</a>
<a href="${path}/shop/product/write.do">상품등록</a>
cs



JFreeChartController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.package com.example.spring02.controller.chart;
 
import java.io.FileOutputStream;
 
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
 
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.spring02.service.chart.JFreeChartService;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;
 
@Controller
public class JFreeChartController {
    
    @Inject
    JFreeChartService chartService;
    //서비스를 호출해야하기 때문에 서비스에 의존성 주입
    
    
    @RequestMapping("chart1.do")//view에서 맵핑되는 메소드
    public void createChart1(HttpServletResponse response){
        //화면에 바로 출력을 해야하기 때문에 HttpServletResponse를 사용
    try {
        JFreeChart chart = chartService.createChart(); 
        //서비스에서 생성한 차트를 받아와 변수에 저장, 차트를 얻어온다음에 바로 이미지파일로 보냄
        ChartUtils.writeChartAsPNG(response.getOutputStream(), chart, 900550);
        //차트를 받아와서 가로, 세로 길이를 설정해준다. view 필요없이 화면에 곧바로 출력이 된다.
        
    } catch (Exception e) {
        e.printStackTrace();
    }    
  }
    
    @RequestMapping("chart2.do"//view에서 맵핑되는 메소드, pdf를 만들때 사용되는 메소드
    public ModelAndView createChart2(HttpServletResponse response) {
        String message = "";
        try {
            JFreeChart chart = chartService.createChart(); //서비스로부터 차트를 가져옴
            Document document = new Document(); //웹 페이지에 접근할수 있는 객체를 생성
            
            PdfWriter.getInstance(document, new FileOutputStream("d:/test.pdf")); //pdf파일 저장될 경로
            
            //pdf 파일로 변환하기 위한 과정
            document.open(); //pdf파일을 연다
            Image png = Image.getInstance(
                    ChartUtils.encodeAsPNG(chart.createBufferedImage(500500)));
            //차트의 내용을 500 x 500 이미지로 만들기
            document.add(png); //만든 이미지를 pdf 파일에 저장
            document.close(); //저장을 했으니 파일을 닫기
            message = "pdf 파일이 생성되었습니다.";
            
        } catch (Exception e) {
            e.printStackTrace();
            message = "pdf 파일 생성 실패...";
        }
        return new ModelAndView("chart/jchart02","message",message);
        //보낼 페이지와 보낼 값을 지정해서 리턴한다.
        //jchart02 페이지에 값을 보내서 메시지를 출력한다. (pdf파일이 생성이 되었는지, 안되었는지..)    
    }
}
cs



JFreeChartService.java

1
2
3
4
5
6
7
8
9
package com.example.spring02.service.chart;
 
import org.jfree.chart.JFreeChart;
 
public interface JFreeChartService {
    public JFreeChart createChart();
    //JFreeChart를 만드는 추상메소드
}
 
cs



JFreeChartServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
.package com.example.spring02.service.chart;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.springframework.stereotype.Service;
 
import com.example.spring02.model.shop.dao.CartDAO;
import com.example.spring02.model.shop.dto.CartDTO;
import com.itextpdf.text.Font;
import com.sun.prism.paint.Color;
 
@Service
public class JFreeChartServiceImpl implements JFreeChartService {
 
    @Inject
    CartDAO cartDao;
    //DAO를 호출하기 위해 의존성을 주입시킨다.
    
    
    @Override
    public JFreeChart createChart() {
        List<CartDTO> list = cartDao.cartMoney(); //Dao에 저장된 장바구니에 담은 금액을 리스트에 저장
        
        
        //파이 차트가 아닌경우
        //파이 차트일때와는 클래스가 틀리다.
         DefaultCategoryDataset dataset = new DefaultCategoryDataset();
         for (CartDTO dto : list) {
             dataset.setValue(dto.getMoney(), "과일", dto.getProduct_name());
             //dataset.setValue(value, rowKey, columnKey); 형식으로 들어간다.
             //금액, 과일, 상품이름이 들어간다.  (총 3개의 값이 들어감)
         }
         
         
//파이 차트인 경우
//DefaultPieDataset dataset = new DefaultPieDataset();
//for (CartDTO dto : list) {
//dataset.setValue(dto.getProduct_name(), dto.getMoney());
         //파이차트에는 x,y축이 없기 때문에 값이 2개만 들어간다.
         //그러니까 rowKey값이 안들어간다.
//}
         
        //dataset.setValue(value, rowKey, columnKey); 형식은 이렇게 되지만, 값이 2개만 들어감
         
         JFreeChart chart = null//차트 객체 선언
         String title = "장바구니 통계"//장바구니 타이틀의 제목
         try {
             
//    선그래프
//     chart = ChartFactory.createLineChart(
//     title, "상품명" , "금액" , dataset,
//     PlotOrientation.VERTICAL, true, true,
//     false);
             
//    라인 (선) 그래프에서는 이런 값들이 들어간다.
//    title, categoryAxisLabel, valueAxisLabel, dataset
                 
             
//막대 그래프
    chart = ChartFactory.createBarChart( //세로형식의 막대그래프를 만듦
            title, 
            "상품명"
            "금액"
            dataset,
            PlotOrientation.VERTICAL, //세로로 차트를 만든다는 의미
            truetruefalse);
             
    
//파이 차트
    //chart = ChartFactory.createPieChart(
            //title,  //chart title
            //dataset,    //data 
            //true,         //include legend
            //true,
            //false);
    
    //제목, 타이틀의 폰트와 글씨크기를 설정
            chart.getTitle().setFont(
            new Font("돋움",Font.BOLD, 15));
    
    //범례, 범례의 폰트와 글씨크기를 설정
            chart.getLegend().setItemFont(
            new Font("돋움",Font.PLAIN, 10));
            
            Font font = new Font("돋움", Font.PLAIN,12);
            Color color = new Color(0,0,0);
            StandardChartTheme chartTheme =
    (StandardChartTheme) StandardChartTheme.createJFreeTheme(); //테마 설정
            
            
            chartTheme.setExtraLargeFont(font); //폰트 크기에 따라 테마를 다르게 설정 
            chartTheme.setLargeFont(font);
            chartTheme.setRegularFont(font);
            chartTheme.setSmallFont(font);
            
            
            chartTheme.setAxisLabelPaint(color); //축, 범례등의 색상을 변경
            chartTheme.setLegendItemPaint(color);
            chartTheme.setItemLabelPaint(color);
            chartTheme.apply(chart);
        
        } catch (Exception e) {
            
            e.printStackTrace();
            
        }
         
         return chart;
    }
 
}
 
cs




jchart02.jsp (컨트롤러에서 넘어온 메시지가 출력되는 View페이지, jcart01타입은 그 컨트롤러에서 바로 출력되기때문에 View가 필요없다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file = "../include/header.jsp" %>
</head>
<body>
<%@ include file = "../include/admin_menu.jsp" %>
 
<h2>${message}</h2<!-- JFreeChartController에서  리턴된 메시지가 출력된다-->
                    <!-- pdf가 만들어 졌는지, 안만들어졌는지.. -->
 
</body>
</html>
cs


728x90
반응형
: