Spring를 사용한 Chart 그리기 (JFree Chart)
Back-End/Spring 2019. 6. 21. 12:18- 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, 900, 550); //차트를 받아와서 가로, 세로 길이를 설정해준다. 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(500, 500))); //차트의 내용을 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, //세로로 차트를 만든다는 의미 true, true, false); //파이 차트 //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 |
'Back-End > Spring' 카테고리의 다른 글
AOP와 트랜잭션 처리 실습 (데이터베이스로 테스트) (0) | 2019.06.24 |
---|---|
AOP 복습(Spring Framework STS4 동영상 강의) (0) | 2019.06.22 |
Spring를 사용한 Chart 그리기 (Google Chart) (1) | 2019.06.20 |
스프링을 사용해서 pdf 생성 (2) | 2019.06.19 |
상품관리 (관리자용 상품등록/수정/삭제) (1) | 2019.06.18 |