D+37::UNION/DUAL/뷰(view)/이미지첨부파일기능구현/

Am.Vinch·2022년 8월 17일
0

20220817_wed

실습내용

  • 다음에 들어갈 item_code를 먼저 조회한다
  • 조회한 itemCode를 갖는 상품 정보를 DB에 등록한다
  • 상품을 등록할 때 첨부한 이미지파일 정보를 이미지의 갯수만틈 DB에 등록한다.
    -위 모든 것을 실행하면,
    -이미지 첨부파일 때문에(main,sub) 최소 2대에서 최대 4개까지의 쿼리가 실행된다.
    -그래서 트랜잭션 처리가 필요하다!!!
    -단, 상품등록은 딱 한 번만 해야 한다!

DB 파일명: 연습용.sql

SELECT * FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT * FROM EMP WHERE EMPNO > 1005;

SELECT ENAME FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT EMPNO FROM EMP WHERE EMPNO > 1005;
--(오류) 조회할때 컬럼이 다르면 UNION 조회가 안된다!


SELECT ENAME FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT JOB FROM EMP WHERE EMPNO > 1005;
--컬럼은 달라도 자료형만 일치하면 UNION 조회가능하다!


SELECT EMPNO,ENAMEM,SAL FROM EMP WHERE EMPNO < 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT EMPNO,JOB FROM EMP WHERE EMPNO > 1005;
--(오류): 조회하려는 컬럼의 갯수가 동일해야한다.

--UNION ALL 과 그냥 UNION 의 차이
--UNION만 중복된 데이터 제거한다!!!
SELECT * FROM EMP WHERE EMPNO <= 1005
UNION ALL -- 조회된 데이터를 동시에 여러개 조회 가능하게 한다.
SELECT * FROM EMP WHERE EMPNO >= 1005;

--INSERT의 다른 문법(INSERT + SELECT)
SELECT 10 + 10 FROM DUAL;//20
SELECT 1, ' 제목', '내용' , SYSDATE FROM DUAL;
// 1	 제목	내용	22/08/17

--예시
CREATE TABLE CAR(
    CAR_NUMBER NUMBER PRIMARY KEY
    , MODEL_NAME VARCHAR2(100)
    , MODEL_COLOR VARCHAR2(100)
);

INSERT INTO CAR (CAR_NUMBER, MODEL_NAME, MODEL_COLOR)
SELECT 1,'아반떼','검정' FROM DUAL;

SELECT * FROM CAR;

INSERT INTO CAR (CAR_NUMBER, MODEL_NAME, MODEL_COLOR)
SELECT 2,'아반떼','검정' FROM DUAL-- 원래는 VALUES() 가 들어가야하지만 SELECT 문을 바로 사용해줬다.
UNION ALL-- 한번에 2행이 삽입된다.
SELECT 3,'소나타','흰색' FROM DUAL;

SELECT * FROM CAR;

--이미지파일 여러개 넣기
INSERT INTO ITEM_IMAGE( IMG_CODE, ORIGIN_NAME, ATTACHED_NAME, IS_MAIN, ITEM_CODE )
SELECT 'IMG_005','a.jpg','a_1.jpg','Y','ITEM_001' FROM DUAL
UNION ALL
SELECT 'IMG_006','b.jpg','b_1.jpg','N','ITEM_001' FROM DUAL;

SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1+1, 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1+2, 3, 0) FROM ITEM_IMAGE;

DELETE ITEM_IMAGE;
DELETE SHOP_ITEM;

--상품목록조회(조인사용)
SELECT ITEM.ITEM_CODE
    , ITEM_NAME
    , ITEM_PRICE
    , ATTACHED_NAME 
FROM SHOP_ITEM ITEM ,ITEM_IMAGE IMG
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND IS_MAIN = 'Y'
ORDER BY ITEM.ITEM_CODE DESC;

디비- 자바 연동

이미지 첨부파일 구현하기

실습내용
(예시)

  • emp사원테이블에서 체크한 사원만 삭제(1,3,5)
WHERE EMPNO = 1
OR EMPNO = 3
OR EMPNO = 5;
  • 다른 방법 IN() 연산자 사용
DELETE EMP
WHERE EMPNO IN(1,3,5);
  • itemDTO
package dto;

public class ItemDTO {
	private String itemCode;
	private String itemName;
	private int itemPrice;
	private String itemComment;
	private int itemStock;
	private String cateCode;
	private String attachedName;//호출하려면 작성해줘야한다.GETTER,SETTER필요함
	
	
	public String getItemCode() {
		return itemCode;
	}
	public void setItemCode(String itemCode) {
		this.itemCode = itemCode;
	}
	public String getItemName() {
		return itemName;
	}
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	public int getItemPrice() {
		return itemPrice;
	}
	public void setItemPrice(int itemPrice) {
		this.itemPrice = itemPrice;
	}
	public String getItemComment() {
		return itemComment;
	}
	public void setItemComment(String itemComment) {
		this.itemComment = itemComment;
	}
	public int getItemStock() {
		return itemStock;
	}
	public void setItemStock(int itemStock) {
		this.itemStock = itemStock;
	}
	public String getCateCode() {
		return cateCode;
	}
	public void setCateCode(String cateCode) {
		this.cateCode = cateCode;
	}
	public String getAttachedName() {
		return attachedName;
	}
	public void setAttachedName(String attachedName) {
		this.attachedName = attachedName;
	}
	
	
}
  • imgDTO

    private List<ImgDTO> imgList; -> 추가작성하기

  package dto;

import java.util.List;

public class ImgDTO {
	private String imgCode;
	private String originName;
	private String attachedName;
	private String isMain;
	private String itemCode;
	private List<ImgDTO> imgList;
	
	public String getAttachedName() {
		return attachedName;
	}
	public void setAttachedName(String attachedName) {
		this.attachedName = attachedName;
	}
	public List<ImgDTO> getImgList() {
		return imgList;
	}
	public void setImgList(List<ImgDTO> imgList) {
		this.imgList = imgList;
	}
	public String getImgCode() {
		return imgCode;
	}
	public void setImgCode(String imgCode) {
		this.imgCode = imgCode;
	}
	public String getOriginName() {
		return originName;
	}
	public void setOriginName(String originName) {
		this.originName = originName;
	}
	public String getAttachedname() {
		return attachedName;
	}
	public void setAttachedname(String attachedname) {
		this.attachedName = attachedname;
	}
	public String getIsMain() {
		return isMain;
	}
	public void setIsMain(String isMain) {
		this.isMain = isMain;
	}
	public String getItemCode() {
		return itemCode;
	}
	public void setItemCode(String itemCode) {
		this.itemCode = itemCode;
	}

}
  • item-mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 해당 파일에 모든 쿼리문을 작성 -->
<mapper namespace="itemMapper">
	<resultMap type="dto.CategoryDTO" id="category">
		<id column="CATE_CODE" 		property="cateCode"/>
		<result column="CATE_NAME" 	property="cateName"/>
	</resultMap>

	<resultMap type="dto.ItemDTO" id="item">
		<id column="ITEM_CODE" 			property="itemCode"/>
		<result column="ITEM_NAME" 		property="itemName"/>
		<result column="ITEM_PRICE" 	property="itemPrice"/>
		<result column="ITEM_COMMENT" 	property="itemComment"/>
		<result column="ITEM_STOCK" 	property="itemStock"/>
		<result column="CATE_CODE" 		property="cateCode"/>
		<result column="ATTACHED_NAME" 	property="attachedName"/>
	</resultMap>
	
	<select id="selectCategoryList" resultMap="category">
		SELECT CATE_CODE
			, CATE_NAME
		FROM ITEM_CATEGORY
	</select>
	
	<insert id="insertItem">
		INSERT INTO SHOP_ITEM (
			ITEM_CODE
			, ITEM_NAME
			, ITEM_PRICE
			, ITEM_COMMENT
			, CATE_CODE
		) VALUES (
			 #{itemCode}
			, #{itemName}
			, #{itemPrice}
			, #{itemComment}
			, #{cateCode}
		)
	</insert>
	<!-- 상품목록조회 -->
	<select id="selectItemList" resultMap="item">
		SELECT ITEM.ITEM_CODE
			, ITEM_NAME
			, ITEM_PRICE
			, ATTACHED_NAME 
		FROM SHOP_ITEM ITEM,ITEM_IMAGE IMG 
		WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
		AND IS_MAIN = 'Y'
		ORDER BY ITEM.ITEM_CODE DESC
	</select>
	
	<!-- item_image 테이블 상품등록하기위해서  -->
	<!-- 이미지를 여러개 첨부파일해야하기때문에 반복문이 필요하다!!! -->
	<!-- 
		이 쿼리를 만들기 위해 반복을 사용시 어떻게 해야하는가?	
		DELETE EMP
		WHERE EMPNO IN(1,3,5);
		
		DELETE EMP
		WHERE EMPNO IN 135 - item까지 속성사용할 시! 이렇게 나오기때문에 틀린문법이다. 
		open,close 는 처음과 끝 반복하기 전에 최초로 한 번만 사용된다.
		separator 반목할 때 마다 한번씩
		index 는  i라는 임의변수로 1씩 증가하는 음이 아닌 정수를 의미한다.0부터 시작 1,2,3,.... 
		
		<foreach collection="empnoList" item="empno" open="(" close=")" separator="," index="i">
			#{empno} +#{i}
		</foreach>		-->
		<!-- 조회할 데이터들은 모두 imgDTO 에 담겨있다 
		imgCode 는 직접 받아오는 것이 아니라 1씩 자동증가 하는 서브쿼리문으로 들어간다-->
		
		
<!-- 		원래 insert 기본 쿼리문
			INSERT INTO ITEM_IMAGE (
			IMG_CODE
			, ORIGIN_NAME
			, ATTACHED_NAME
			, IS_MAIN
			, ITEM_CODE
		) VALUES (
			(SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE)
			, #{originName}
			, #{attachedName}
			, #{isMain}
			, #{itemCode}
		)  -->
	<insert id="insertImage">
		INSERT INTO ITEM_IMAGE( 
			IMG_CODE
			, ORIGIN_NAME
			, ATTACHED_NAME
			, IS_MAIN
			, ITEM_CODE 
		)
		<foreach collection="imgList" item="img" separator="UNION ALL" index="i">
			SELECT (SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1 + #{i}, 3, 0) FROM ITEM_IMAGE)
				, #{img.originName}
				, #{img.attachedName}
				, #{img.isMain}
				, #{img.itemCode} 
			FROM DUAL
		</foreach>
	</insert>
	
	<!-- 다음에 들어갈 item_code 조회
	select 한 데이터는 우리가 실제로 자바로 가져와야한다.
	우리가 작성한 쿼리를 데이터베이스에서 실행을 해야하는데 
	실행을 하면, 다음에 들어갈 아이템코드 하나만 들어간다!!!
	그러면 자바로 따지면 문자 데이터 한 개와 같다!! 
	그래서 string으로 담아오면된느데 이럴 때는 resultMap 이 아니라 resultType으로 가져오면된다!!! -->
	<select id="selectNextItemCode" resultType="String">
		SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, 0) 
		FROM SHOP_ITEM
	</select>


	<!-- 상품 상세 정보 조회 -->
	<select id="selectDetailItem" resultMap="item">
		SELECT ITEM.ITEM_CODE
		    , ITEM_NAME
		    , ITEM_COMMENT
		    , ITEM_PRICE
		    , ATTACHED_NAME 
		FROM SHOP_ITEM ITEM,ITEM_IMAGE IMG 
		WHERE ITEM.ITEM_CODE = #{itemCode}
		AND ITEM.ITEM_CODE = IMG.ITEM_CODE
		AND IS_MAIN = 'Y'
	</select>  
</mapper>
  • itemService.java
package service;

import java.util.List;

import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;

public interface ItemService {
	//카테고리 목록 조회
	List<CategoryDTO> selectCategoryList();
	
	//상품 등록 + 상품이미지 등록
	void insertItem(ItemDTO itemDTO,ImgDTO imgDTO);
	
	//상품 목록 조회
	List<ItemDTO> selectItemList();
	
	//다음에 들어갈 아이템코드 조회
	String  selectNextItemCode();
	
	//이미지 정보 등록
	void insertImage(ImgDTO imgDTO);
	
	//상세조회
	ItemDTO selectDetailItem(String itemCode);
}  
  • itemServiceImpl.java
package service;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;
import sqlmap.SqlSessionManager;

public class ItemServiceImpl implements ItemService{
	//쿼리 실행하는 객체
	SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
	SqlSession sqlSession = sqlSessionFactory.openSession();
	
	@Override
	public List<CategoryDTO> selectCategoryList() {
		List<CategoryDTO> list = sqlSession.selectList("itemMapper.selectCategoryList");
		sqlSession.commit();
		return list;
	}

	@Override
	public void insertItem(ItemDTO itemDTO) {
		sqlSession.insert("itemMapper.insertItem", itemDTO);
		sqlSession.commit();
	}

	@Override
	public List<ItemDTO> selectItemList() {
		List<ItemDTO> list = sqlSession.selectList("itemMapper.selectItemList");
		sqlSession.commit();
		return list;
	}

	@Override
	public String selectNextItemCode() {
		String nextItemCode = sqlSession.selectOne("itemMapper.selectNextItemCode");
		sqlSession.commit();
		return nextItemCode;
	}

	@Override
	public void insertImage(ImgDTO imgDTO) {
		sqlSession.insert("itemMapper.insertImage",imgDTO);
		sqlSession.commit();

	}

	@Override
	public ItemDTO selectDetailItem(String itemCode) {
		ItemDTO result = sqlSession.selectOne("itemMapper.selectDetailItem", itemCode);
		sqlSession.commit();
		return result;
	}
}
  • adminController
package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import dto.CategoryDTO;
import dto.ImgDTO;
import dto.ItemDTO;
import dto.MemberDTO;
import service.ItemService;
import service.ItemServiceImpl;
import service.MemberService;
import service.MemberServiceImpl;

@WebServlet("*.ad")
public class AdminController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ItemService itemService = new ItemServiceImpl();
	
    public AdminController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//한글 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
	
		String requestURI = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = requestURI.substring(contextPath.length());
		System.out.println("command = " + command);
		
		String page = "jsp/template/admin_template.jsp";
		boolean isRediect = false;
		String contentPage = "";
		
		//상품 등록 페이지로 이동
		if(command.equals("/regItemForm.ad")) {
			//카테고리 목록 조회
			List<CategoryDTO> categoryList = itemService.selectCategoryList();
			request.setAttribute("categoryList", categoryList);
			contentPage = "admin/reg_item_form.jsp";
		}
		//상품 등록
		else if(command.equals("/insertItem.ad")) {
//			기존 방식대로 데이터를 못받아온다.
//			왜?
//			form태그에 enctype="multipart/form-data" 추가했기 때문에!!!
//			String cateCode = request.getParameter("cateCode");
//			String itemName = request.getParameter("itemName");
//			int itemPrice = Integer.parseInt(request.getParameter("itemPrice"));
//			String itemComment = request.getParameter("itemComment");
			
			//파일 업로드 및 전달된 데이터를 받기 위해 Multipart 객체 생성
			String uploadPath = "D:\\wockspaceHTML\\Shop_Teacher\\src\\main\\webapp\\images";//임의로 지정가능(이미지파일로)
			int uploadSize = 10 * 1024 * 1024; //10메가바이트
			
			//[객체생성 생성자 호출]
			//실제 파일 업로드 및 전달된 데이터를 받는 객체
			//첨부파일 있을 때는 무조건 반드시 작성해야한다!!!!
			MultipartRequest multi = new MultipartRequest(
										request//데이터 요청
										,uploadPath//파일저장경로
										,uploadSize//업로드시 사이즈 위 작성한 대로
										,"UTF-8"//인코딩
										, new DefaultFileRenamePolicy()//자바에서 파일 중복될 경우,기본파일명재정의정책대로 
									);

			//모든 이미지 정보를 저장하여 쿼리 실행 시 빈값을 채워줄 객체
			List<ImgDTO> imgList = new ArrayList<>();
			
			//request -> (위에서 정의한)multi 로 변경
			String cateCode = multi.getParameter("cateCode");
			String itemName = multi.getParameter("itemName");
			int itemPrice = Integer.parseInt(multi.getParameter("itemPrice"));
			String itemComment = multi.getParameter("itemComment");
			
			ItemDTO itemDTO = new ItemDTO();
			itemDTO.setCateCode(cateCode);
			itemDTO.setItemName(itemName);
			itemDTO.setItemPrice(itemPrice);
			itemDTO.setItemComment(itemComment);
			
			//두 테이블에 공통적으로 들어갈 item_code를 같은 값으로 들어가야하게 만들어야 한다!!!!
			//이미 자동으로 1씩 증가하게 만드는 조회 쿼리문을 매퍼에서 지난번 만들었기 때문에 주의해야한다.
			//두가지 방식 중 중간에 조회쿼리를 만들어 사용하는 것을 이용할 것이다.
			
			//insert되는 ITEM_CODE 를 조회
			String nextItemCode = itemService.selectNextItemCode();
			itemDTO.setItemCode(nextItemCode);// 이제부터는 itemDTO에 위에 정의한 nextItemCode 값이 빈값에 채워지도록 만들어준다.
			//이전에 미리 맵퍼로 다시 가서 select 서브쿼리문이 아닌  #{itemCode} 값으로 value값을 변경해줘야한다!!
			
			//그다음 우리가 할 것은?
			//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT 
//			itemService.insertItem(itemDTO);
			
			//② item_image 상품이미지 테이블에 데이터를 INSERT 
			//첨부한 파일명, 첨부된 파일명, isMain, itemCode 데이터 받기.
			//첨부파일이 있는 input 태그의 name 속성값들을 가져온다.
			Enumeration<String> inputNames = multi.getFileNames();//첨부된 파일이름들을 가져와서 데이터 받아사용한다.받아사용하려면 리턴타입사용해야한다.모르면 마우스올려서 알아본다.
			
			//첨부파일이 갯수만큼 반복되는 while문!!! 
			while(inputNames.hasMoreElements()) {
				//실제로 첨부파일이 있는 input 태그
				String inputName = inputNames.nextElement();//하나식 빼서 알아보자.
				//모르면 출력문으로 알아본다.
				//뭔지모르니 a로 지정 후,  run 해보니 실제 첨부된 파일의 input 태그의 name 속성값(a)이 출력이 된다.  
//				System.out.println( 111 + a );
//				111subFile
//				111mainFile
				
				
				//원본 파일명
				String originName = multi.getOriginalFileName(inputName);//실제 첨부된 원본네임을 가져온다.
				
				//실제 파일을 첨부했을 때만...
				if(originName != null) {
					//실제로 등록된 파일명
					String attachedName = multi.getFilesystemName(inputName);//서버에 등록된네임을 가져온다.
					
					//출력문으로 확인하기.
//					System.out.println("첨부한 파일: " +  originName);
//					System.out.println("첨부된 파일: " +  attachedName);
					
					//상품의 대표 1개 이미지로 할 것이 main이미지이면  y 아니면 n 으로한다/삼항연산자
					String isMain = inputName.equals("mainImg")? "Y" : "N"; 

					ImgDTO imgDTO = new ImgDTO();
					imgDTO.setOriginName(originName);
					imgDTO.setAttachedname(attachedName);
					imgDTO.setIsMain(isMain);
					imgDTO.setItemCode(nextItemCode);
					
					imgList.add(imgDTO);//imgList에 위에서 받은 dto값들 모두 넣어준다.
				}
			}
			
			ImgDTO img = new ImgDTO();
			img.setImgList(imgList);
			
			//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT 
			itemService.insertItem(itemDTO,img);//알아서 상품이미지등록 + 상품정보 모두 등록해주는 메소드 이용
			
			//상품 이미지 등록(반복문안에 있어야한다)
//			itemService.insertImage(img); //맵퍼에서 쿼리실행 안에 있는 빈값들 채워주기.위에서!
			
			page = "regItemForm.ad";
			isRediect = true;
		}
		
		
		
		request.setAttribute("contentPage", contentPage);
		
		if(isRediect) {
			response.sendRedirect(page);
		}
		else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(page);
			dispatcher.forward(request, response);
		}
	}

}
  • itemController
package controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.ibatis.session.SqlSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import dto.ItemDTO;
import dto.MemberDTO;
import service.ItemService;
import service.ItemServiceImpl;
import service.MemberService;
import service.MemberServiceImpl;

@WebServlet("*.it")
public class ItemController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ItemService itemService = new ItemServiceImpl();
	
    public ItemController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//한글 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
	
		String requestURI = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = requestURI.substring(contextPath.length());
		System.out.println("command = " + command);
		
		String page = "jsp/template/template.jsp";
		boolean isRediect = false;
		String contentPage = "";
		
		//상품 목록 페이지
		if(command.equals("/itemList.it")) {
			contentPage = "item/item_list.jsp";
			
			//List<ItemDTO> list = itemService.selectItemList();
			///request.setAttribute("itemList", list);
			
			request.setAttribute("itemList", itemService.selectItemList());
		}
		//상품상세보기
		else if(command.equals("/itemDetail.it")) {
//			String uploadPath = "D:\\wockspaceHTML\\Shop_Teacher\\src\\main\\webapp\\images";//임의로 지정가능(이미지파일로)
//			int uploadSize = 10 * 1024 * 1024; //10메가바이트
//			MultipartRequest multi = new MultipartRequest(
//					request//데이터 요청
//					,uploadPath//파일저장경로
//					,uploadSize//업로드시 사이즈 위 작성한 대로
//					,"UTF-8"//인코딩
//					, new DefaultFileRenamePolicy()//자바에서 파일 중복될 경우,기본파일명재정의정책대로 
//				);
			String itemCode = request.getParameter("itemCode");
			ItemDTO itemDTO = itemService.selectDetailItem(itemCode);
			request.setAttribute("item", itemDTO);
			
			contentPage = "item/item_detail.jsp";
		}

		
		request.setAttribute("contentPage", contentPage);
	
		if(isRediect) {
			response.sendRedirect(page);
		}
		else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(page);
			dispatcher.forward(request, response);
		}
	}

}
  • item_list.jsp
<%@ 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">
<title>Insert title here</title>
<style type="text/css">
.itemList-container{
	width: 100%;
	display: flex;
	justify-content: flex-start;
	flex-wrap: wrap;
}
.itemDiv{
	flex-basis: 20%;
	text-align: center;
	margin-bottom: 30px;
	height: 310px;
	font-size: 20px;
}
.itemDiv img:hover {
	/* 투명도 */
	opacity: 0.7;
}
</style>
</head>
<body>
<div class="itemList-container">
	<c:forEach var="item" items="${itemList}">
		<div class="itemDiv">
			<div>
				<a href='itemDetail.it?itemCode=${item.itemCode}'>
					<img width="200px" height="260px" src="images/${item.attachedName}">
				</a>
			</div>
			<div>${item.itemName}</div>
			<div>${item.itemPrice}</div>
		</div>
	</c:forEach>
</div>
</body>
</html>
  

-item_detail.jsp

  <%@ 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>
<style type="text/css">
.detailContainer{
	width: 100%;
	display: inline-block;
	background-color: #EAE3D2;
	text-align: center;
	margin: 0 auto;
	
}
.imageDiv{
	display: inline-block;
	border: 1px solid black;
	width: 500px;
	height: 300px;
}

.itemDetailDiv{
	display: inline-block;
	text-align: left;
}
.container,.commentDiv,.addDiv{
	background-color: white;
	width: 100%
}

.commentDiv{
	margin-top:30px;
	margin-bottom:30px;
	border-bottom: 1px solid black; 
	border-top: 1px solid black; 
	padding: 15px;
	text-align: center;

}
</style>
</head>
<body>
<form action="itemDetail.it" method="post">
	<input type="hidden" value="${item.itemCode}">
<div class="detailContainer">
	<div class="imageDiv">
		<img width="200px" height="260px" src="images/${item.attachedName }">
	</div>
	<div class="itemDetailDiv">
		<div>${item.itemName}</div>
		<div>가격</div>
		<div>${item.itemPrice}</div>
		<div>수량 : </div>
		<div><input type="number" name="itemStock"></div>
		<div>총 가격</div>
		<div>${item.itemPrice*item.itemStock}</div>
		<div>
			<div class="btnDiv">
				<input type="button" value="구매하기" onclick="">
				<input type="button" value="장바구니" onclick="">
			</div>
		</div>
	</div>
</div>
	<div class="commentDiv">상품설명</div>
	<div class="addDiv"><img src=""></div>
</form>
</body>
</html>

뷰(view)

  • 의미) 두 테이블이 마치 하나로 이루어진 것같은 가상테이블
  • 문제점) select 할 때 빈번한 조인과 서브쿼리의 사용은 프로그램 개발에서 엄청난 피로감을 느낌.
  • 해결) 빈번한 조인,서브쿼리를 한 번만 사용해서 다음부터는 조인 및 서브쿼리를 사용하지 않아도
    마치 사용한 것처럼 쿼리의 결과를 조회할 수 있는 기능
  • 먼저 시스템 계정에 권한을 부여해야 뷰 사용가능하다!!!
    GRANT CREATE VIEW TO MYDB;
  • 사원의 사번, 이름, 급여, 부서번호, 부서명,부서지역 조회
- 기본 조인 쿼리문
SELECT EMPNO,ENAME,SAL,EMP.DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

- 뷰사용 쿼리문  
CREATE VIEW MY_EMP AS
SELECT EMPNO,ENAME,SAL,EMP.DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO =DEPT.DEPTNO;
 
- EMP 테이블 모두 조회  
select * from MY_EMP;  
  • 결과: 조인한 결과와 같은 결과가 나온다.

profile
Dev.Vinch

0개의 댓글