반응형

이전 프로젝트

 

pom.xml->web.xml->각종 설정

 

**하이버네이트 설정

1.    하이버네티으를 사용하는 Dao클래스 생성

=>기본 패키지.dao.HibernateDao

package com.pk.db.dao;

 

import java.util.List;

 

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

 

import com.pk.db.domain.Item;

 

//Bean(스프링이 생성하는 인스턴스)을 자동생성해주고

//데이터 관련된 클래스라는 알려주기 위한 어노테이션

@Repository

public class HibernateDao {

           //하이버네이트를 사용할 수 잇는 인스턴스를 주입

           @Autowired

           private SessionFactory sessionFactory;

          

           //전체 데이터 가져오는 메소드

           public List<Item> allItem(){

                       return sessionFactory.getCurrentSession().createCriteria(Item.class).list();

           }

          

           //데이터를 1개를 가져오는 메소드

           public Item getItem(int itemid) {

                       return sessionFactory.getCurrentSession().get(Item.class, itemid);

           }

}

 

2.    ItemServiceImpl클래스를 수정

=>hibernatedao를 주입받고 itemdao자리를 hibernateDao로 수정

package com.pk.db.service;

 

import java.util.List;

 

import javax.servlet.http.HttpServletRequest;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

 

import com.pk.db.dao.HibernateDao;

import com.pk.db.dao.ItemDao;

import com.pk.db.domain.Item;

 

//bean을 자동생성해주는 어노테이션

@Service

public class ItemServiceImpl implements ItemService {

 

      //ItemDao타입의 bean이 있으면 자동으로 주입시켜주는 어노테이션

      @Autowired

      private ItemDao itemDao;

     

      //hibernate 전송하는 bean을 사용 주입

      //동일한 자료형의 bean이 있으면 자동 주입

      @Autowired

      private HibernateDao hibernateDao;

     

      @Override

      public List<Item> allItem(HttpServletRequest request) {

                 //Dao의 메소드에 파라미터가 없는 경우는 Dao 메소드를 출력해서 리턴

                 //return itemDao.allItem();

                 return hibernateDao.allItem();

      }

 

      @Override

      public Item getItem(HttpServletRequest request) {

                 //파라미터 읽어오기

                 String itemid = request.getParameter("itemid");

                 //파라미터를 정수로 변환해서 Dao 메소드를 호출

                 //return itemDao.getItem( Integer.parseInt(itemid));

                return hibernateDao.getItem( Integer.parseInt(itemid));

      }

 

      @Override

      public Item getItem(HttpServletRequest request, int itemid) {

                 //return itemDao.getItem(itemid);

                 return hibernateDao.getItem(itemid);

      }

 

}

 

 

 

 

트랜잭션 오류가 난다.

그래서 serviceimpl@Transactional 추가하기

 

=>처리하는 메소드 위에 트랜잭션 적용을 위한 @Transactional추가

package com.pk.db.service;

 

import java.util.List;

 

import javax.servlet.http.HttpServletRequest;

import javax.transaction.Transactional;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

 

import com.pk.db.dao.HibernateDao;

import com.pk.db.dao.ItemDao;

import com.pk.db.domain.Item;

 

//bean을 자동생성해주는 어노테이션

@Service

public class ItemServiceImpl implements ItemService {

 

      //ItemDao타입의 bean이 있으면 자동으로 주입시켜주는 어노테이션

      @Autowired

      private ItemDao itemDao;

     

      //hibernate 전송하는 bean을 사용 주입

      //동일한 자료형의 bean이 있으면 자동 주입

      @Autowired

      private HibernateDao hibernateDao;

     

      @Override

      @Transactional

      public List<Item> allItem(HttpServletRequest request) {

                 //Dao의 메소드에 파라미터가 없는 경우는 Dao 메소드를 출력해서 리턴

                 //return itemDao.allItem();

                 return hibernateDao.allItem();

      }

 

      @Override

      @Transactional

      public Item getItem(HttpServletRequest request) {

                 //파라미터 읽어오기

                 String itemid = request.getParameter("itemid");

                 //파라미터를 정수로 변환해서 Dao 메소드를 호출

                 //return itemDao.getItem( Integer.parseInt(itemid));

                return hibernateDao.getItem( Integer.parseInt(itemid));

      }

 

      @Override

      @Transactional

      public Item getItem(HttpServletRequest request, int itemid) {

                 //return itemDao.getItem(itemid);

                 return hibernateDao.getItem(itemid);

      }

 

}

 

3.    실행했는데 트랜잭션 적용이 안되면 root-context.xml파일이 있는 트랜잭션 관련 설정을 servlet-context.xml로 이동하고 수정

=>servlet-context.xml에 파일에 tx네임스페이스를 추가

                       <!-- 하이버네이트는 트랜잭션 사용이 필수이기 때문에 추가 -->

           <tx:annotation-driven />

           <beans:bean id="transactionManager"

           class="org.springframework.orm.hibernate5.HibernateTransactionManager">

                       <beans:property name="sessionFactory" ref="sessionFactory" />

      </beans:bean>

 

 

sessionFactoctory가 고리가 생긴다.

 

 

controller 하는 것은 라우팅이다.

알고리즘만 바꾸고 싶으면 service에서 바꾸면 된다.

디비를 바꾸고 싶으면 dao만 수정하면 된다.

 

재사용 할 생각이 있으면  함수

class->배포할 생각

함수는 배포가 안된다. class는 배포가 된다.

여러 사람이 같이 쓸수 있다는 것

함수는 나 혼자 여러번 사용할 려고 한다.

 

파이썬  ->함수

           ->클래스

 

 

iBatis 버전 엎 해서 mybatis로 작성한다.

javaspring -> 이것은 이상한 것이다.

java를 못하면 spring을 잘 할 수 없다.

상중하로 사용하면 안된다.

 

 

스프링 컨트롤러는 뷰에 의존적이지 않습니다.

 

contentType="text/html; charset=UTF-8" =>html하면 html

 

엑셀 파일 뷰를 만들기 위해서는 apache poi 라이브러리를 이용합니다.

엑셀 파일로 출력 결과를 만들고자 하는 경우에는 AbstractXlsView 클래스로부터

상속받은 View 클래스를 이용하면 됩니다.

 AbstractExcelView 클래스는 poi.jar 파일에 포함되어 있습니다.

이 파일을 이용하면 엑셀 파일을 읽을 수 있고 엑셀 파일로 내보낼 수 있습니다.

 AbstractExcelView 클래스로 부터 상속받는 클래스를 만들고 메소드를 재정의 해야

합니다.

protected void buildExcelDocument(Map<String, Object> model, Workbook

workbook, HttpServletRequest request,

HttpServletResponse response) throws Exception

Model은 넘어온 데이터입니다.

Workbook을 이용해서 엑셀파일을 생성됩니다.

Workbook 안에는 Sheet 가 있고 시트 안에는 Row가 있고 row 안에 다시 Cell

있솟니다.

 

poi.jar 파일을 사용하기 위한 dependency pom.xml 파일에 추가

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

<version>3.16</version>

</dependency>

 

요청이 다운로드 받는 파일이름

 

 

**html 이외의 출력

=>html 이외의 출력을 하고자 하는 경우에는 spring설정 파일에 beanNameViewResolver를 추가해야 합니다.

이 때 기존의 InternalResourceViewResolver의 우선순위를 조정해야 합니다.

=><bean id="Controller에서 리턴한 뷰 이름" class="View 클래스 경로"/>

Controller에서 id에 해당하는 View이름을 리턴하면 class에 설정된 View클래스를 이용해서 내용을 출력하게 됩니다.

 

**Excel출력

=>appache poi라이브러리를 이용

=>AbstractXlsView 클래스를 상속받는 클래스를 만들어서 출력

=>Excel은 파일을 WorkBook이라고 하고 하나의 화면을 Sheet그리고 하나의 행을 Row하나의 칸을 Cell이라고 합니다.

실제 데이터 출력은 Cell에 합니다.

 

 

 Excel출력 실습

1.    html이외의 vIew를 출력할 수 있도록 설정

servlet-context.xml

1)    기존의 ViewReolver를 수정

      <!-- Controller에서 리턴하는 뷰 이름을 가지고 실제 출력할 뷰를 선택하도록 해주는 설정 -->

      <beans:bean

      class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                 <beans:property name="prefix" value="/WEB-INF/views/" />

                 <beans:property name="suffix" value=".jsp" />

                 <!-- 우선순위를 수정 -->

                 <beans:property name="order" value="1"></beans:property>

      </beans:bean>

2)    새로운 ViewResoulver를 추가

<!-- html이외의 출력을 위한 ViewResolver설정 -->

      <beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

                 <beans:property name="order" value="0"></beans:property>

      </beans:bean>

 

2.    Excel 사용을 위한 의존성 라이브러리 설정을 pom.xmldependency에 추가

pom.xml

 

                       <!-- excel출력 라이브러리 -->

                       <dependency>

                                  <groupId>org.apache.poi</groupId>

                                  <artifactId>poi</artifactId>

                                  <version>3.16</version>

            </dependency>

                 

 

3.    home.jsp파일에 엑셀 요청을 생성

<a href="./item.xls">엑셀로 내려받기</a>

 

 

 

4.    HomeContrller클래스에 item.xls처리를 위한 메소드를 추가

     

           @RequestMapping(value="/item.xls",method = RequestMethod.GET)

           public String excel(HttpServletRequest request, Model model) {

                       //서비스 메소드 호출

                       List<Item> list = itemService.allItem(request);                   

//데이터 저장

                       model.addAttribute("list", list);

                       //뷰이름을 리턴

                       return "excel";

      }

5.    Excel출력 뷰를 생성

=>com.pk.db.view.ExcelView

=>AbstractXlsView로 부터 상속

package com.pk.db.view;

 

import java.util.List;

import java.util.Map;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.springframework.web.servlet.view.document.AbstractXlsView;

 

import com.pk.db.domain.Item;

 

public class ExcelView extends AbstractXlsView {

          

           //엑셀 데이터 출력을 위한 View

           @Override

           //첫번때 매개변수는 COntroller Model에 저장한 데이터를 가진 Map

           //두번째 매개변수는 실제 출력할 파일

           //세번째 매개변수는 request response객체

           protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,

                                  HttpServletResponse response) throws Exception {

                       //데이터 찾아오기 -Controller에서 저장한 이름으로 찾아옵니다.

                       //항상 형변환 작업을 해야 한다.

                       List<Item> list = (List<Item>) model.get("lists");

                      

                       //시트 만들기

                       Sheet sheet = workbook.createSheet();

                       workbook.setSheetName(0, "item");

                       //각 열의 너비 설정

                       sheet.setColumnWidth(0, 5120);

                      

                       //첫번째 행에 제목 출력

                       Row firstRow = sheet.createRow(0);

                       Cell cell = firstRow.createCell(0);

                       cell.setCellValue("아이디");

                       cell = firstRow.createCell(1);

                       cell.setCellValue("이름");

                       cell = firstRow.createCell(2);

                       cell.setCellValue("가격");

                       cell = firstRow.createCell(3);

                       cell.setCellValue("효과");

                      

                       //데이터 출력

                       int idx = 1;

                       for(Item item:list) {

                                  Row row = sheet.createRow(idx);

                                  cell = row.createCell(0);

                                  cell.setCellValue(item.getItemid());

                                 

                                  cell = row.createCell(1);

                                  cell.setCellValue(item.getItemname());

                                  cell = row.createCell(2);

                                  cell.setCellValue(item.getPrice());

                                  cell = row.createCell(3);

                                  cell.setCellValue(item.getDescription());

                                  idx += 1;

                       }

           }

 

}

 

 

 

6.    HomeController에서 요청후에 리턴한 뷰 이름과 엑셀 뷰 클래스를 연결하는 코드를 servlet-context.xml파일에 작성

      <!-- Controller가 리턴한 뷰이름과 뷰 클래스 매핑 -->

      <beans:bean id="excel" class="com.pk.db.view.ExcelView"></beans:bean>

     

 

 

**csvExcel파일 읽기

=>csvsupercsv라이브러리를 이용

=>excelpoi-ooxml이라는 라이브러리를 이용

 

**pdf출력 -엑셀 처름 테이블에 데이터를 출력

=>itext api를 주로 이용

=>의존성 설정을 해야 합니다.

<dependency>

           <groupId>com.lowagie</groupId>

           <artifactId>itext</artifactId>

           <version>2.1.7</version>

</dependency>

=>pdf는 기본적으로 한글 출력이 안됩니다.

한글 출력이 가능한 폰트를 설정해야 합니다.

 

windowsfont -> C:\Windows\Fonts

font 가 한글을 지원해야 한다.

 

1.pdf출력을 위한 의존성 라이브러리 설정

=>pom.xml파일의 dependencies태그에 추가

<dependency>

           <groupId>com.lowagie</groupId>

           <artifactId>itext</artifactId>

           <version>2.1.7</version>

</dependency>

 

2.home.jsp파일에 pdf출력 링크를 추가

<a href="./item.pdf">pdf로 내려받기</a>

 

3.HomeController클래스에 item.pdf요청을 처리해주는 메소드를 생성

           @RequestMapping(value="/item.pdf",method = RequestMethod.GET)

           public String pdf(HttpServletRequest request, Model model) {

                       //서비스 메소드 호출

                       List<Item> list = itemService.allItem(request);

                       //데이터 저장

                       model.addAttribute("list", list);

                       //뷰이름을 리턴

                       return "pdf";

           }

 

4.pdf 출력을 위한 view를 생성

=>AbstractPdfView로 부터 상속

package com.pk.db.view;

 

import java.util.List;

import java.util.Map;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.view.document.AbstractPdfView;

 

import com.lowagie.text.Cell;

import com.lowagie.text.Document;

import com.lowagie.text.Font;

import com.lowagie.text.Paragraph;

import com.lowagie.text.Table;

import com.lowagie.text.pdf.BaseFont;

import com.lowagie.text.pdf.PdfWriter;

import com.pk.db.domain.Item;

 

public class PdfView extends AbstractPdfView {

          

           //pdf출력을 위한 메소드

           //model controller가 넘겨준 데이터

           //document는 출력한 문서 파일

           //writer는 직접 그려서 출력하고자 할 때 사용하는 객체

           //request response는 이전과 동일

           @Override

           protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,

                                  HttpServletRequest request, HttpServletResponse response) throws Exception {

                       //데이터 찾아오기

                       List<Item> list = (List<Item>) model.get("list");

                       //한글 츨력을 하고자 하는 경우에는 한글을 ㅇ지원하는 폰트를 설정

                       BaseFont dfKorean = BaseFont.createFont("c:\\windows\\fonts\\malgun.ttf",BaseFont.IDENTITY_H,BaseFont.EMBEDDED);

                       Font font = new Font(dfKorean);

                      

                       //테이블을 생성 - 첫번째 매겹ㄴ수는 열의 갯 , 두번째 행의 개수

                       Table table = new Table(4, list.size()+1);

                       table.setPadding(10);//여백

                      

                       //제목 만들기

                       Cell cell = new Cell(new Paragraph("코드",font));

                       cell.setHeader(true); //제목 일 경우

                       table.addCell(cell);

                       cell = new Cell(new Paragraph("이름",font));

                       cell.setHeader(true); //제목 일 경우

                       table.addCell(cell);

                       cell = new Cell(new Paragraph("가격",font));

                       cell.setHeader(true); //제목 일 경우

                       table.addCell(cell);

                       cell = new Cell(new Paragraph("설명",font));

                       cell.setHeader(true); //제목 일 경우

                       table.addCell(cell);

                       table.endHeaders();

                      

                       //데이터 출력하기

                       for(Item item:list) {

                                  Cell imsi = new Cell(new Paragraph(item.getItemid()+"",font));

                                  table.addCell(imsi);

                                  imsi = new Cell(new Paragraph(item.getItemname(),font));

                                  table.addCell(imsi);

                                 

                                  imsi = new Cell(new Paragraph(item.getPrice()+"",font));

                                  table.addCell(imsi);

                                  imsi = new Cell(new Paragraph(item.getDescription(),font));

                                  table.addCell(imsi);

                       }

                      

                       //테이블을 문서에 추가

                       document.add(table);

                      

           }

 

}

 

 

5.servlet-context.xml파일에 controller가 리턴한 뷰 이름과 출력할 뷰 클래스를 연결

           <beans:bean id="pdf" class="com.pk.db.view.PdfView"></beans:bean>

 

 

** json출력

=>json: 자바 스크립트 객체 표현법으로 데이터를 표현하느느 방식(스마트 폰의 push메시지,  센서의 데이터 등을 json표현법으로 주고 받고 mongo db와 같은 NoSQL에서도 데이터를 json방식으로 표현 - 자바스크립트나 파이썬은 json현식의 데이터를 쉽게 읽을 수 있습니다.)

=>json은 이전의 html,excel,pdf와 다르게 데이터를 전달하는 것입니다.

=>json출력을 위해서는 jackson-databind라이브러리가 필요

                       <!-- json출력을 위한 라이브러리 -->

                       <dependency>

                                  <groupId>com.fasterxml.jackson.core</groupId>

                                  <artifactId>jackson-databind</artifactId>

                                  <version>2.9.4</version>

                       </dependency>

 

=>출력하는 방법은 여러 가지

1.출력하는 뷰를 MappingJacksonJsonView로 출력하면 데이터를 json으로 출력해줍니다.

 

1)home.jsp파일에 json출력 요청을 생성

           <a href="item1.json">json으로 내려받기</a><br/>

 

2).HomeControoler클래스에 item1.json요청을 처리하는 메소드를 작성

           @RequestMapping(value="/item1.json",method = RequestMethod.GET)

           public String item1json(HttpServletRequest request, Model model) {

                       //서비스 메소드 호출

                       List<Item> list = itemService.allItem(request);

                       //데이터 저장

                       model.addAttribute("list", list);

                       //뷰이름을 리턴

                       return "item1json";

           }

 

3)servlet-context.xml파일에 item1jsonjson View와 연결

           <beans:bean id="item1json" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></beans:bean>

 

 

2.Restful(Representational State Transfer) API

=>접속하는 기기에 상관없이 동일한 데이터를 요구하는 요청은 하나의  URL로 만들어지는ㄴ 개념

=>url을 요청하면 View대신에 Data를 주자는 개념

출력은 Data를 받은 클라이언트에서 자신에게 맞게 파싱해서 사용

 

 

3.RestController

=>요청을 처리하는 크랠스인데 이 클래스는 문자열을 리턴하면 csv 형식의 문자열로 출력하고 기본 자료형을 제외한 자료형으로 리턴하면 json형시긍로 출력

=>sprng 4.0 이상에서만 사용 가능

=>클래스 위에 @RestController만 추가하면 됩니다.

=>Jackson-Dating라이브러리는 추가되어 있어야 합니다.

 

4.RestController를 이용해서 문자열과 json출력

1)home.jsp파일에 문자열과 json을 요청하는 링크를 추가

           <a href="item.csv">csv로 내려받기</a><br/>

           <a href="item2.json">json으로 내려받기</a><br/>

 

2)프로젝트에 RestController로 사용할 클래스를 추가하고 작성

=>com.pk.db.JSONController

           //기본형 이나String또는 Data클래스를 제외한 형태로 리턴하면 json으로 응답

           //데이터만 return해주면 된다.

           @RequestMapping(value="/item2.json" , method = RequestMethod.GET)

           public List<Item> json(HttpServletRequest request) {

                       List<Item> list = itemService.allItem(request);

                       //실제 csv형식의 파일을 만들려면 문자열을 편집

                       return list;

           }

 

 

**ajax(Asynchronous Javascript XML)

=>자바스크립트를 이용해서 비동기적으로 데이터를 받아오는 기술

=>전체 화면을 갱신하지 않고 데이터를 받아서 일부분만 갱신하는 용도로 많이 사용

아이디 중복 체크, 댓글을 작성하고 전체화면 갱신없이 댓글이 업데이트

 

실습 - ajaxitem2.json이 리턴한 데이터를 받아서 화면에 출력

1.home.jsp파일에 ajax요청을 할 링크 추가

<a href="#" id="ajax">ajaxjson 데이터 사용하기</a><br/>

 

2.home.jsp에서 데이터를 출력할 영역을 생성

<div align="center" id="disp"></div>

 

3.home.jsp파일에 idajax인 링크를 클릭하면 동작하는 스크립트 코드를 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<link rel="stylesheet" href="./css/item.css">

<title>Insert title here</title>

</head>

<body>

${list }

           <h2 align='center'>상품목록</h2>

           <table border="1" align="center">

                       <tr class ="header">

                                  <th width='80'>상품ID</th>

                                  <th width='160'>상품이름</th>

                                  <th width='80'>가격</th>

                       </tr>

                       <c:forEach items="${list}" var ="item">

                                  <tr class="record">

                                              <td align='center'>${item.itemid }</td>

                                              <td >&nbsp;&nbsp;

                                                         <%-- <a href="detail?itemid=${item.itemid }">${item.itemname }</a> --%>

                                                         <a href="detail/${item.itemid}">${item.itemname}</a>

                                              </td>

                                              <td align="right">${item.price }&nbsp;&nbsp;</td>

                                  </tr>

                       </c:forEach>

           </table>

          

           <a href="item.xls">엑셀로 내려받기</a><br/>

           <a href="item.pdf">pdf로 내려받기</a><br/>

           <a href="item1.json">json으로 내려받기</a><br/>

           <a href="item.csv">csv로 내려받기</a><br/>

           <a href="item2.json">json으로 내려받기</a><br/>

           <a href="#" id="ajax">ajaxjson 데이터 사용하기</a><br/>

           <div align="center" id="disp"></div>

           <!-- javascript:html 내에서 동적으로 변화를 주기 위한 언어 -->

           <script type="text/javascript">

                   document.getElementById("ajax").addEventListener("click",function(){

                                  //alert("클릭");

                                  //ajax객체 만들기

                                  request = new XMLHttpRequest();

                                  //요청 생성

                                  request.open('GET','item2.json');

                                  //요청 전송

                                  request.send('');

                                  //요청에 대한 처리를 위한 콜백 메소드 등록

                                  request.onreadystatechange = function(){

                                              //정상 응답

                                              if(request.readyState == 4 && request.status >= 200  && request.status < 300){

                                                         //데이터 확인

                                                         //alert(request.responseText);

                                                         //responseText, responseXML

                                                         //받아온 데이터를 json 파싱을 해서 배열로 만들기

                                                         list = JSON.parse(request.responseText);

                                                         //배열을 순회

                                                         msg =  '';

                                                         msg += "<table border='1'>";

                                                         msg += "<tr class='header'>";

                                                         msg += "<th width ='80'>코드</th>";

                                                         msg += "<th width ='160'>상품영</th>";

                                                         msg += "<th width ='80'>가격</th>";

                                                         msg += "</tr>";

                                                         for(i in list){

                                                                     //alert(list[i]);

                                                                     msg += "<tr class='record'>";

                                                                     msg += "<td align='center'>"+list[i].itemid+"</td>";

                                                                     msg += "<td align='left'>"+list[i].itemname+"</td>";

                                                                     msg += "<td align='right'>"+list[i].price+"</td>";

                                                                     msg += "</tr>";

                                                         }

                                                         msg += "</table>";

                                                         document.getElementById('disp').innerHTML =msg;

                                              }

                                  }

                       });

                      

           </script>

</body>

</html>

 

**xml 출력

=>xml(extensible markup language) : 데이터를 태그를 이용해서 표현하는 방식

xml은 브라우저가 해석하지 않고 개발자 또는 dto 설정에서 해석하는 마크업 언어

=>예전에 실시간 데이터 전송에 많이 사용했고 아직도 프로젝트 설정 파일로 사용됩니다.

twitter등이 얘전에는 xml서비스를 제공했지만 최근에는 json으로 많이 변경되고 있습니다.

=>서버 개발자가 아니라면 xml 은 생성보다는 파싱이 중요합니다.

=>spring-oxm, jaxb-api, jaxb-impl, jaxb-core라이브러리가 필요

=>출력은 MarchallingView를 사용

=>RPC(Remote Procedure call- 원격 프로시저 호출) 를 닷넷 계열에서는 Mashalling이 라고 합니다.

웹 서버나 클라우드 사용하는 것이 RPC입니다.

http://ip주소:9000/db를 브라우저에 입력하면  ip주소 컴퓨터에 있는 어떤 메소드가 호출되서 작업을 한 후 결과를 브라우저에 전송합니다.

이러한 기술을 rpc라고 하는데 spring이 중간 통신 작업을 다 해주기 때문에 rpc를 어떻게 만들어야 하는지 몰라두 구현이 가능

 

=>ItemList xml로 출력

1. xml관련 의존성을 pom.xml 파일의 dependencies 태그에 추가

                       <!-- xml출력을 위한 라이브러리 -->

                       <dependency>

                                  <groupId>org.springframework</groupId>

                                  <artifactId>spring-oxm</artifactId>

                                  <version>${org.springframework-version}</version>

                       </dependency>

                       <dependency>

                                  <groupId>javax.xml.bind</groupId>

                                  <artifactId>jaxb-api</artifactId>

                                  <version>2.1</version>

                       </dependency>

                       <dependency>

                                  <groupId>com.sun.xml.bind</groupId>

                                  <artifactId>jaxb-impl</artifactId>

                                  <version>2.2.11</version>

                       </dependency>

                       <dependency>

                                  <groupId>com.sun.xml.bind</groupId>

                                  <artifactId>jaxb-core</artifactId>

                                  <version>2.2.11</version>

                       </dependency>

 

 

2. home.jsp파일에 xml요청을 생성

           <a href ="item.xml">xml로 내려받기</a></br>

 

3.Item클래스를 xml으로 출력할 수 있도록 어노테이션을 추가

 

@Data

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name ="",propOrder= {"itemid","itemname","price" ,"descripttion","pictureurl"})

public class Item {

           private int itemid;

           private String itemname;

           private int price;

           private String description;

           private String pictureurl;

}

 

4.xmldto만을 출력할 수 없어서 dto listproperty로 갖는 클래스가 필요합니다.

ItemListproperty로 갖는 크랠스를 생성

=>com.pk.db.domain.ItemReport

//xml로 출력하는 것을 알려줄 것이다.

@XmlAccessorType(XmlAccessType.FIELD)

//루트 태그 설정

@XmlRootElement(name="itemlist")

public class ItemReport {

           //객체 1개만다 출력되는 태그 설정

           @XmlElement(name="item")

           private List<Item> list;

 

           public List<Item> getList() {

                       return list;

           }

 

           public void setList(List<Item> list) {

                       this.list = list;

           }

}

 

5.HomeController 클래스에 item.xml요청을 처리하는 메소드를 생성

           @RequestMapping(value="/item.xml",method = RequestMethod.GET)

           public String xml(HttpServletRequest request, Model model) {

                       //서비스 메소드 호출

                       List<Item> list = itemService.allItem(request);

                       //xml 출력 데이터 생성

                       ItemReport itemReport = new ItemReport();

                       itemReport.setList(list);

                      

                       //데이터 저장

                       model.addAttribute("list", itemReport);

                       //뷰이름을 리턴

                       return "xmlreport";

           }

 

 

6.servlet-context.xml 파일에 xml출력을 위한 생성을 추가

           <beans:bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" id="marshaller">

                       <beans:property name="classesToBeBound">

                                  <beans:list>

                                             <beans:value>com.pk.db.domain.ItemReport</beans:value>

                                  </beans:list>

                       </beans:property>

           </beans:bean>

           <!-- xml뷰 설정

           id COntroller가 티런한 View 이름이고

           modelKey에 설정하는 것은 model에 저장한 데이터 이름입니다.-->

           <beans:bean id="xmlreport" class="org.springframework.web.servlet.view.xml.MarshallingView">

                       <beans:property name="marshaller" ref="marshaller"></beans:property>

                       <beans:property name="modelKey" value="list"></beans:property>

           </beans:bean>

 

**file upload

=>파일을 업로드 위한 form은 반드시 methodpost 이어야 하고 enctypemultipart/form-data로 설정해야 합니다.

=>springmultipart기능을 지원하기 때문에 별다른 설정없이도 multipart form의 데이터를 받을 수 있습니다.

 

=>spring에서는 fileserver에 저장할 떄 commons-fileupload의 의존성이 필요하고 CommonsMultipartResolver Bean이 필요합니다.

 

=>Spring에서는 3가지 방법으로 File Upload를 처리 할 수  있습니다.

HttpServeltRequest 대신에 MultipartHttpServletRequest를 이용해서 getFiles메소드를 처리

 

파라미터의 자료영을 multipartFile로 해서 처리하는 방법이 있습니다.

(@RequestParam, COmmand객체 이용도 가능)

 

=>MultipartFile에서 업로드하는 방법

getBytes()메소드로 파일의 내용을 바이트 배열로 리턴받아서 직접 전송하는 방법

 

transferTo(File dest)메소드에게 File객체를 대입해서 업로드 하는 방법

 

=>파일을 업로드 할 때 주의할 점은 동일한 파일명은 ?

uuid클래스를 이용해서 중복되지 않은 이름을 만들던가 업로드하는 유저의 id를 붙여서 동일한 파일명을 만들지 않도록 하는 방법이 있습니다.

 

이미지는 user마다 디렉토리를 따로따로 만든다.

 

=>삽입의 처리 과정

삽입링크 클릭 -> 삽입할 수 있는 페이지로 포워딩 ->입력을 하고 전송을 누르면 유효성 검사를 해서 유효성 검사를 통과하면 서버에게 전송 ->서버는 처리를 하고 결과 페이지로 리다이렉트를 합니다.

포워딩을 하면 새로고침하면 에러가 나든가 아니면 똑같은 것 2개 있는 가 한다.

 

=>서버가 처리를 하고 포워딩을 하게 되면 에러가 발생하던지 동일한 데이터가 중복해서 삽입되게 됩니다.

 

=>새로고침을 했을 때 이전에 수행한 작업이 다시 발생해도 되면 포워딩을 해도 되고 다시 발생하면 안되는 경우는 반드시 리다이렉트를 해야 합니다.

삽입.삭제, 갱신 ->리다이렉트 검색 -> 포워딩

로그인 리다이렉트

 

 

1.    데이터 삽입을 위한 링크를 home.jsp에 추가

      <a href="insert">데이터 삽입</a><br/>

 

2.    HomeController에서 insert요청을 처리하는 메소드를 추가

      @RequestMapping(value="/insert",method = RequestMethod.GET)

      public String insert(HttpServletRequest request, Model model) {

 

                 //뷰이름을 리턴

                 return "insert";//단순한 이름 만 포워딩 하는 것이다.

      }

 

3.    views디렉토리에 insert.jsp파일을 마들고 데이터 삽입 폼을 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>데이터 삽입</title>

</head>

<body>

      <div align="center">

                 <h3>데이터 삽입</h3>

                 <form method="post" enctype="mulipart/form-data" id ="myform">

                             <table border="1">

                                        <tr>

                                         <td rowspan="5" align="center">

                                                   <p></p>

                                                   <img id="img" width="100" height = "100" border ="1" />

                                                   <br/>

                                                   <input type="file" id="pictureurl" name="pictureurl" accept=".jps,.jpeg,.gif,.png" /><br/>

                                         </td>

                                        </tr>

                                        <tr>

                                                   <td align="right">코드</td>

                                                   <td><input type="text" name="itemid" id="itemid" required="required"/><div id="iddiv"></div></td>

                                        </tr>

                                        <tr>

                                                   <td align="right">이름</td>

                                                   <td><input type="text" name="itemname" id="itemname" required="required"/></td>

                                        </tr>

                                        <tr>

                                                   <td align="right">가격</td>

                                                   <td><input type="text" name="price" id="price" required="required"/></td>

                                        </tr>

                                        <tr>

                                                   <td align="right">효과</td>

                                                   <td><input type="text" name="description" id="description" required="required"/></td>

                                        </tr>

                                        <tr>

                                                   <td colspan="3" align="center">       

                                                               <input type="submit" value="전송">

                                                               <input type="button" value="메인" id="mainbtn">

                                                   </td>

                                        </tr>

                             </table>

                 </form>

      </div>

</body>

</html>

 

4.    insert.jsp파일에 이미지 미리보기 기능 구현

=>javascript에서 파일을 불러오는 동작은 비동기적(순서대록 동작하지 않는다. -콜백)으로 처리됩니다.

       <script>

                       //이미지 미리보기

                       var pictureurl = document.getElementById("pictureurl");

                       var img = document.getElementById("img");

                      

                       //이미지 선택이 변경되면

                       pictureurl.addEventListener("change",function(){

                                  //업로드한 이미지 파일의 내용을  img에 출력

                                  //파일 객체 생성

                                  var reader = new FileReader();

                                  // 선택한 파일이 있다면

                                  if(pictureurl.files && pictureurl.files[0]){

                                              //파일 읽기

                                             reader.readAsDataURL(pictureurl.files[0]);

                                             //출력

                                              ///img.src = reader.target.result;

                                              //비동기를 할 때는 파일의 내용을 전부 읽으면 출력

                                             reader.addEventListener("load",function(e){

                                                         img.src  = e.target.result;

                                              })

                                  }

                       });

      </script>

 

 

5.    itemid중복 검사

1)    itemid를 받아서 중복 여부를 판별해서 리턴할 서버의 요청 처리 메소드를 생성

=>itemid를 파라미터로 받아서 서버에 가서 데이터가 존재하는지 확인하면 된다.

Service클래스의

=>jsoncontroller클래스에 itemid중복 검사를 위한 메소드를 생성

 

       //itemid를 파라미터로 받아서 중복체크를 해서 리턴하는 메솓,

           @RequestMapping(value="/itemidcheck",method =RequestMethod.GET)

           public Map<String, Object> itemIdCheck(HttpServletRequest request,@RequestParam("itemid") int itemid){

                       //서비스 메소드 호출

                       Item item = itemService.getItem(request, itemid);

                       //리턴할 Map을 생성

                       Map<String , Object> map = new HashMap<String, Object>();

                       if(item == null) {

                                  map.put("result", "true");

                       }else {

                                  map.put("result","false");

                       }

                       return map;

}

 

 

 

 

상세보기는 중복검사 할 때도 사용이 된다. 로그인할때도 사용이 된다.

 

 

2)insert.jsp에서 중복 체크 하는 코드 작성

 

 

**.Validatation(유효성 검사)

=>데이터를 삽입하거나 삭제 또는 갱신 및 조회를 할 때 올바를 데이터인지 호가인하는 작업

웹 애플리케이션에서는 클라이언트 (웹 브라우저 - 자바스크립트)와 서버의 service클래스 그리고 데이터베이스에서  할 수 있습니다.

할 수 있는 모든 곳에서 하는 것이 좋습니다.

클라이언트 측에서만 하는 경우에는 데이터를 전송할 때 헤더를 변경해서 자바스크립트에서는 올바른 데이터였지만 서버에 도달 할 때는 다른 데이터 일 수 있습니다.

ipuserAgent값을 변경해서 전송하는 경우가 많습니다.

서버에서 header값들을 읽어서 확인해야 합니다.

데이터에비으세어 제약조건을 이용해서 다시 한 번 검사를 하는 것이 안전합니다.

 

보안 이 필요한 유효성 검사는 클라이언트에서 하면 안됩니다.

 

 

 

 

반응형

'Study > spring' 카테고리의 다른 글

spring-7  (0) 2020.10.26
spring-6  (0) 2020.10.26
spring-4  (0) 2020.10.23
spring-3  (0) 2020.10.23
spring-2  (0) 2020.10.22

+ Recent posts