Cute Happy Ghost
본문 바로가기
JAVA/JasperStudio

[jasperstudio] #5 jrxml jasper로 컴파일, jasper파일 자바경로, java연동소스, jdbc 커넥션 보내서 리포트 표출

by JENN_tech7 2023. 11. 1.
728x90
SMALL

- jrxml파일 컴파일

이제 궁극의 자바 연동을 시켜보자

 

 

 

 

 

 

 

타이틀을 넣고싶으면 우측 elements패널에서 static text을 선택해서 title로 끌어와준다

 

 

 

 

 

 

타이틀을 쓰고 우측에 빨간색으로 표시한 버튼을 클릭

jrxml를 jasper파일로 컴파일하는 버튼이다

java에서 jrxml을 컴파일할 수 있지만 소스한줄쓰는 것보다

버튼 클릭 한 번이 간단하게 때문에 컴파일해준 파일을 넣어주겠다

 

 

 

 

 

 

 

 

 

- jasper파일 경로

jasper studio

컴파일하면 이렇게 Jasper Studio의 project controler에

똑같은 제목의 jasper파일이 생긴다

 

 

 

 

 

 

eclipse

그럼 그 파일을 이클립스로 끌어와준다

경로는 java resources하단에 넣어준다

 

 

 

 

 

 

  • jasper를 위처럼 java/src/resources에 넣었다면 getClass()를 통해 경로를 가져오면 된다
    하지만 WEB-INF하단에 넣어놔도 아래 코드에 있는 getServletContext()를 사용하면 경로를 가져올 수 있다
InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/files/jaseper/TestReport.jasper");

두 경로 중 어디에 넣느냐는 프로젝트나 파일의 성격에 따라 선택하면 된다

src/resources는는 보통 Java프로젝트에서 리소스 파일(Jasper, properties, 설정 파일 등)을 지정하는 표준경로이고,

빌드되는 동안 클래스패스에 포함되어 war or jar 파일 안으로 복사된다

WEB-INF/files 에 사용자가 다운로드할 수 있는 PDF, Jasper, 템플릿 등의 기타 자원 등이 저장 될 수 있고, 보안상의 이유로 외부에서 접근할 수 없으며 서블릿을 통해서만 제공되어야 할 때 이 경로를 사용한다

보통 Jasper파일과 같은 정적 리소스나 템플릿은 일반적으로 src/resources에 둬서 애플리케이션 코드와 함께 패키징하고 클래스로더를 통해서 접근하니까 나는 전자로 설정을 해놨다

 

 

 

 

 

 

- java 소스코드

    @GetMapping("/download/doReport")
    public void doReport(HttpServletRequest request, HttpServletResponse response) {
        String jdbcUrl = "jdbc:postgresql://{ip}:{port}/{dbname}";
        String username = "{username}";
        String password = "{password}";
        
        // 리소스 관리를 위한 try-with-resources 구문
        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
             //해당 경로에 있는 jasper파일을 가져와준다
             InputStream reportStream = this.getClass().getResourceAsStream("/jasper/TestReport.jasper")) {
            
            //해당경로에 jasper 없을 시 에러처리
            if (reportStream == null) {
                throw new FileNotFoundException("Jasper file not found in /jasper/TestReport.jasper");
            }
                     
            //리포트 파일 로드
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportStream);

            //파라미터 필요한 경우
            Map<String, Object> parameters = new HashMap<>();
            
            //jasperReport 채우기
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
            
            //응답 헤더 설정
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
            
            // PDF로 응답 스트림에 출력
            JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

코드에 대한 내용은 주석으로 간단히 달아놓았다

예시나 구체적인 내용은 아래에 자세히 적어보겠다

 

 

 

 

 

 

 

 

 

- datasource 혹은 connection

jasper 리포트를 채우는 과정에서 어떻게 데이터를 연동을 할 것이냐인데 
빈 데이터 소스를 보낼 수도 있고, 가지고 있는 데이터들을 보낼 수도 있다

 

  • 빈 데이터 소스(아래)
JRDataSource dataSource = new JREmptyDataSource();
  • 두개의 레코드에 데이터를 넣어 보내는 데이터 소스(아래)
		//아래 형태와 같은 그릇을 만들어준다
        List<Map<String, Object>> dataList = new ArrayList<>();

        //테스트로 첫번째행 만들기
        Map<String, Object> row1 = new HashMap<>();
        row1.put("column1", "Value 1A");
        row1.put("column2", "Value 1B");
        row1.put("column3", "Value 1C");
        
        //datalist에 추가
        dataList.add(row1);

        //두번째 행 만들기
        Map<String, Object> row2 = new HashMap<>();
        row2.put("column1", "Value 2A");
        row2.put("column2", "Value 2B");
        row2.put("column3", "Value 2C");

        //datalist에 추가
        dataList.add(row2);

        //JRDataSource만들어주기
        JRDataSource dataSource = new JRMapCollectionDataSource(dataList);

 

 

  • 나는 바로 db연동을 해서 쿼리로 데이터를 가져올 것이기 때문에 connection만 연결을 해주면됐다
    연결하려면 아래와 같이 커넥션과 설정을 해주고 그 커넥션을 보내서 리포트를 채워주면 된다
    리소스 관리를 위해 아래 코드에서 try-with-resources구문으로 바꿔줬다
String jdbcUrl = "jdbc:postgresql://hostname:port/dbname";
    String username = "username";
    String password = "password";

    // PostgreSQL JDBC 커넥션 생성
    Connection conn = DriverManager.getConnection(jdbcUrl, username, password);

	.....

    // 커넥션 보내서 리포트 채우기
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);

자세한 내용은 아래글 참고..

https://wogus789789.tistory.com/430

 

자원관리 시 conn.close()와 try-with-resources 구문의 차이점

conn.close()와 try-with-resources 구문은 자원 관리에 사용된다 하지만 작동 방식에 차이가 있다고한다 conn.close() conn.close()는 명시적으로 데이터베이스 연결과 같은 자원을 해제하는 데 사용된다 이건

wogus789789.tistory.com

 

 

 

 

 

- 파라미터

  • DB를 연결하면 거의 무조건 파라미터를 사용해야할텐데 아래와 같이 사용해서 parameter을 보내주면된다
    실제로는 서버나 클라이언트 단에서 받은 데이터로 대체할 수 있겠다
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "제목");
parameters.put("Writer", "나야나");

 

 

 

 

 

 

- 파라미터

그럼 이렇게 리포트가 표출된다

제목이 저렇게 ? 되는 이유는 jasper studio에서 한글을 기본적으로 지원안하기 때문

다 한글설정 방법 설명하려고 저렇게 설계한겁니다..ㅎㅎ

한글 설정은 다음 게시글에서 설명해보겠다

728x90
LIST

댓글