D+36::서브쿼리/쇼핑몰 게시판_이미지파일첨부하기

Am.Vinch·2022년 8월 16일
0

20220816_Tue

DB _ 서브쿼리(sub-quary)

파일명: 서브쿼리.sql

복습
--조인(JOIN)
--영업부에서 근무하는 사원들의 사번,이름,부서번호, 부서명을
-- 사번 기준 내림차순 정렬해서 조회.

SELECT EMPNO, ENAME, EMP.DEPTNO, DNAME 
--EMP.DEPTNO: 'DEPTNO' 중복되기때문에 앞에 '테이블명.' 사용해줘야한다!
FROM EMP, DEPT
-- 두 개의 테이블이 동시에 지닌 컬럼의 값이 같아야한다!
WHERE EMP.DEPTNO = DEPT.DEPTNO  
ORDER BY EMPNO DESC;

서브쿼리(쿼리 안에 쿼리가 있는 쿼리문)
-- 영업부에서 근무하는 사원들의 모든 정보를 조회

SELECT * FROM EMP;
SELECT * FROM DEPT;
--EMP에는 '부서명'컬럼이 없어서 '영업부'조회 불가능하다.
--하지만 EMP,DEPT는 부서번호(DEPTNO)라는 같은 컬러명을 가지고있다
SELECT * 
FROM EMP
WHERE DEPTNO = 30;--EMP조회 후,DEPT에서 조회해서 영업부 번호가 '30'을 알기때문에
SELECT DEPTNO
FROM DEPT
WHERE DNAME = '영업부';

위에 두 조회쿼리를 한꺼번에 조회하기 (서브쿼리)

SELECT * 
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO
                FROM DEPT
                WHERE DNAME = '영업부');

실습

1) 이문세 사원의 소속 부서명을 조회
-> 조인

SELECT DNAME 
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND ENAME = '이문세';--경리부

-> 서브쿼리

SELECT DNAME
FROM DEPT
--WHERE DEPTNO = ('이문세'사원이 근무하는 부서번호);
  WHERE DEPTNO = (SELECT DEPTNO
                FROM EMP
                WHERE ENAME = '이문세');

2) 평균급여보다 급여를 더 많이 받는 사원의 사번,이름,급여를 조회(서브쿼리)
-> 서브쿼리

FROM EMP
--WHERE = SAL > (평균급여);
WHERE SAL > (SELECT AVG(SAL)
        FROM EMP);

DB연동 java 게시판 만들기

  • 첨부파일 사진 넣기
    프로젝트명: shop_teacher(import)

1. DB 상품이미지 테이블 별도로 만든다.

DB 파일명: SHOP.sql

상품 이미지 테이블

CREATE TABLE ITEM_IMAGE(
    IMG_CODE VARCHAR2(50) PRIMARY KEY --IMG_001
    , ORIGIN_NAME VARCHAR2(100) NOT NULL -- 첨부한 파일명
    , ATTACHED_NAME VARCHAR2(100) NOT NULL --첨부된 파일명
    , IS_MAIN VARCHAR2(10) NOT NULL  -- N/Y: 첨부파일 여러가지 넣어도 하나만 'Y'이다(메인이미지)
    , ITEM_CODE VARCHAR2(50) NOT NULL REFERENCES SHOP_ITEM(ITEM_CODE) ON DELETE CASCADE  
    --외래키 + NULL 불가능 +상품(상위) 삭제할때 이미지(항위) 삭제시 모두 삭제
);

2. 이미지 첨부파일 기능 jsp구현
java 파일명: reg_item_form.jsp

  • 로그인 후 상품등록시 이미지 여러개 첨부하기
    iput 태그에 type은 'file', form태그에 enctype="multipart/form-data" 추가한다
<%@ 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">
.regItem-container{
   width: 40%;
   margin: 0 auto;
}
.my-input{
	width: 98%;
} 
.joinFormDiv{
	background-color: #f7f7f7;
	border-radius: 14px;
	padding: 20px;
}
.joinFormDiv > div{
	margin-bottom: 16px;
}
.joinFormDiv > div > div:nth-child(1) {
	font-style: italic;
}
.tellDiv select{
	width: 30%;
	height: 41px;
	border-radius: 10px;
	border: 1px solid black;
	font-size: 24px;
	text-align: center;
}
.btnDiv{
	margin-top: 20px;
	text-align: center;
}
textarea{
	resize: none;
	border-radius: 10px;
	width: 96.5%;
	padding: 6px;
	border: 1px solid black;
}
select{
	width: 99%;
	height: 42px;
	border-radius: 10px;
	text-align: center;
	border: 1px solid black;
	font-size: 20px;
}
</style>
</head>
<body>
<form action="insertItem.ad" method="post" enctype="multipart/form-data">
	<div class="regItem-container">
		<div class="joinFormDiv">
			<div>
				<div>CATEGORY.</div>
				<div>
					<select name="cateCode">
						<c:forEach var="category" items="${categoryList }">
							<option value="${category.cateCode }">${category.cateName }</option>
						</c:forEach>
					</select>					
				</div>
			</div>
			<div>
				<div>ITEM NAME.</div>
				<div>
					<input class="my-input" type="text" name="itemName" required>
				</div>
			</div>
			<div>
				<div>ITEM PRICE.</div>
				<div>
					<input class="my-input" type="text" name="itemPrice" required>
				</div>
			</div>
			<div>
				<div>ITEM COMMENT.</div>
				<div>
					<textarea rows="5" name="itemComment"></textarea>
				</div>
			</div>
			<div>
        <!-- 문자가 아닌 이미지 데이터는 어떻게 가져갈까?
			form태그 이용시 문자데이터로만 가져간다. 
			그래서 이미지자체 데이터를 가져가기 위해서
			form태그에 enctype="multipart/form-data" 속성을 넣어줘야한다. -->
        <div>Main File.</div>
				<div>
					<input type="file" name="mainFile">
				</div>
			</div>
			<div>
				<div>Sub File.</div>
				<div>
					<input type="file" name="subFile">
				</div>
			</div>
		</div>
		<div class="btnDiv">
			<input class="btn" type="submit" value="등 록">
		</div>
	</div>
</form>
</body>
</html>


실습내용
상품등록기능

  • 1.db 상품 insert (두 개의 테이블 모두 )
    1) shop_item에 insert
    2) item_iamge 에 insert
  • 2.이미지 파일 업로드
  • 위 1,2 를 하기 위해서는 공통적으로
    ① jsp에 input iput 태그에 type은 'file'로 지정
    ② jsp에 form태그에 enctype="multipart/form-data" 추가
  • DB작용 방법
  • 일반적으로 데이터를 받는 방식으로는 더 이상 데이터를 받을 수가 없다.
  • 왜? form태그에 enctype="multipart/form-data" 사용했기 때문에
  • 일단, lib파일 아래 cos.jar 가 있기 때문에 첨부파일 기능하다
  • multipartRequest 라는 객체를 사용해야 jsp에서 전달되는 데이터를 받을 수 있다.
  • 이 때 데이터를 전달받기 위해 사용하는 메소드는 똑같다. (request -> multi 대체만!)

두 테이블에 공통으로 존재하는 item_code값을 같은 값이 들어가야한다.

  • shop_item 테이블에 insert
  • item_image 테이블에 insert
    -> 여기서 문제!
  • item_code 컬럼은 값을 받아가는게 아니라 insert 될때 (맵퍼 쿼리문에서) 자동으로 1 씩 증가되도록 설계했다.

->두 가지 해결방법이 있다.
1번 방식 - 중간에 hop_item 테이블에 insert & 방금들어간 item_code 를 조회 & item_image 테이블에 insert

2번 방식 - 가장 먼저 다음 item_code로 들어갈 값을 조회한다. 그리고 두 테이블에 같은 데이터값을 넣어준다.

2. admincontroller.java에서 상품등록 if문 변경하기

//상품 등록
		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()//자바에서 파일 중복될 경우,기본파일명재정의정책대로 
									);
			//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);
			
			itemService.insertItem(itemDTO);
			
			page = "regItemForm.ad";
			isRediect = true;
		}
  • 파일 지정경로 위치 파악하기
    ( 프로젝트 폴더 오른쪽 클릭 - proporties - 경로 옆 아이콘 클릭 - 프로젝트 계속 들어가서 마지막 images 클릭 - 경로 위치 그대로 복사하기 - java String uploadPath ="" 경로빈값에 붙여넣기)







  • 프로젝트 run - 상품등록 실제 이미지 첨부 완료 후, 결과확인
  • refresh
  • 맨 위 window - preferences - 두번째 workpace - refresh 체크


    1. MAPPER파일에 쿼리문 작성하기.
      <insert id="insertImage">
      	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>

    1. ADMIN컨트롤러 작성
      상품등록 if문에서 마저 작성해야한다
      //SHOP_ITEM 상품정보 테이블에 데이터를 INSERT
itemService.insertItem(itemDTO);
			
			//item_iamage 상품이미지 테이블에 데이터를 INSERT 
			//첨부한 파일명, 첨부된 파일명, isMain, itemCode 데이터 받기.
			Enumeration<String> e = multi.getFileNames();
            //첨부된 파일이름들을 가져와서 데이터 받아사용한다.
            //받아사용하려면 리턴타입사용해야한다.모르면 마우스올려서 알아본다.
			
			while(e.hasMoreElements()) {
				String a = e.nextElement();//뭔지모르니 a로 지정 
				System.out.println( 111 + a );//모르면 출력해서 알아본다.
			}
			
			page = "regItemForm.ad";
			isRediect = true;
		}
        ----------------------------------------------------------------------------------------------
        //그다음 우리가 할 것은?
			
			//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT 
			itemService.insertItem(itemDTO);
			
			//② item_iamage 상품이미지 테이블에 데이터를 INSERT 
			//첨부한 파일명, 첨부된 파일명, isMain, itemCode 데이터 받기.
			//첨부파일이 있는 input 태그의 name 속성값들을 가져온다.
			Enumeration<String> inputNames = multi.getFileNames();//첨부된 파일이름들을 가져와서 데이터 받아사용한다.받아사용하려면 리턴타입사용해야한다.모르면 마우스올려서 알아본다.
			
			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);//실제 첨부된 원본네임을 가져온다.
				//실제로 등록된 파일명
				String attachedName = multi.getFilesystemName(inputName);//서버에 등록된네임을 가져온다.
				
				//출력문으로 확인하기.
//				System.out.println("첨부한 파일: " +  originName);
//				System.out.println("첨부된 파일: " +  attachedName);
				
				//상품의 대표 1개 이미지로 할 것이 main이미지이면  y 아니면 n 으로한다!!!
				//(삼항연산자.ver)
				String isMain = inputName.equals("mainImg")? "Y" : "N"; 
				//(if.ver)
//				if (inputName.equals("mainImg")) {
//					isMain ="Y";
//					
//				}
//				else {
//					isMain ="N";
//				}
			}

✔주의사항✔
두 테이블에 공통으로 존재하는 item_code값을 같은 값이 들어가야한다.
-shop_item 테이블에 insert
-item_image 테이블에 insert

  • 여기서 문제!
    item_code 컬럼은 값을 받아가는게 아니라 insert 될때 (맵퍼 쿼리문에서) 자동으로 1 씩 증가되도록 설계했다.
    ->두 가지 해결방법이 있다.
    1번 방식 - 중간에 조회
    : shop_item 테이블에 insert & 방금 들어간 item_code 를 조회 & item_image 테이블에 insert
    2번 방식 - 가장 먼저 조회
    : 다음 item_code로 들어갈 값을 먼저 조회 - 두 테이블에 같은 데이터값을 넣어준다.

  • 우리는 1번 방식을 적용한다.
    : 먼저 만들어놓은 itemCode가 1씩 자동 증가하는 select 쿼리문을 이용한 후, shop_item 테이블에 데이터를 insert할 수 있도록 한다.

  • itemDTO 생성
public class ImgDTO {
	private String imgCode;
	private String originName;
	private String attachedName;
	private String isMain;
	private String itemCode;
	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
<!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"/>
	</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_CODE
			, ITEM_NAME
			, ITEM_PRICE
		FROM SHOP_ITEM
		ORDER BY ITEM_CODE DESC
	</select>
	
	<!-- item_image 테이블 상품등록하기위해서  -->
	<insert id="insertImage">
		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>
	
	<!-- 다음에 들어갈 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>

</mapper>
  • itemService

import java.util.List;

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

public interface ItemService {
	//카테고리 목록 조회
	List<CategoryDTO> selectCategoryList();
	
	//상품 등록
	void insertItem(ItemDTO itemDTO);
	
	//상품 목록 조회
	List<ItemDTO> selectItemList();
	
	//다음에 들어갈 아이템코드 조회
	String  selectNextItemCode();
	
	//이미지 정보 등록
	void insertImage(ImgDTO imgDTO);
}
  • itemServiceImpl
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();
	}
}
  • AdminController.java
[상품 등록]
		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()//자바에서 파일 중복될 경우,기본파일명재정의정책대로 
									);
			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);

			//insert되는 ITEM_CODE 를 조회
			String nextItemCode = itemService.selectNextItemCode();
			itemDTO.setItemCode(nextItemCode);// 이제부터는 itemDTO에 위에 정의한 nextItemCode 값이 빈값에 채워지도록 만들어준다.
			//이전에 미리 맵퍼로 다시 가서 select 서브쿼리문이 아닌  #{itemCode} 값으로 value값을 변경해줘야한다!!
			
			//그다음 우리가 할 것은?
			//① SHOP_ITEM 상품정보 테이블에 데이터를 INSERT 
			itemService.insertItem(itemDTO);
			
			//② item_iamage 상품이미지 테이블에 데이터를 INSERT 
			//첨부한 파일명, 첨부된 파일명, isMain, itemCode 데이터 받기.
			//첨부파일이 있는 input 태그의 name 속성값들을 가져온다.
			Enumeration<String> inputNames = multi.getFileNames();//첨부된 파일이름들을 가져와서 데이터 받아사용한다.받아사용하려면 리턴타입사용해야한다.모르면 마우스올려서 알아본다.
			
			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);//실제 첨부된 원본네임을 가져온다.
				//실제로 등록된 파일명
				String attachedName = multi.getFilesystemName(inputName);//서버에 등록된네임을 가져온다.
				

				ImgDTO imgDTO = new ImgDTO();
				imgDTO.setOriginName(originName);
				imgDTO.setAttachedname(attachedName);
				imgDTO.setIsMain(isMain);
				imgDTO.setItemCode(nextItemCode);
				
				//상품 이미지 등록(반복문안에 !!)
				itemService.insertImage(imgDTO);//맵퍼에서 쿼리실행 안에 있는 빈값들 채워주기.위에서!
			}
			page = "regItemForm.ad";
			isRediect = true;
		}

확인사항 3가지

  • shop_item 테이블에 정상적으로 insert?
  • item_image 테이블에 정상적으로 insert?
  • 파일 업로드 성공?

<순서>
프로젝트 RUN 실행 후 -> 관리자('111'/'111')로 로그인 -> 상품 이미지 첨부파일 넣어서 등록하기 -> DB로 테이블 조회하여 데이터 잘들어갔는지 확인 -> 콘솔로도 확인하기

  • DB로 테이블 조회하여 확인

  • 프로젝트 images 파일 refresh 하여 확인
  • 콘솔 확인

프로젝트 실행 후 상품목록페이지 이동
command = /itemList.it
DEBUG [2022-08-16 14:20:20,352] - Opening JDBC Connection
DEBUG [2022-08-16 14:20:20,764] - Created connection 235108843.
DEBUG [2022-08-16 14:20:20,764] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@e0379eb]
DEBUG [2022-08-16 14:20:20,767] - ==> Preparing: SELECT ITEM_CODE , ITEM_NAME , ITEM_PRICE FROM SHOP_ITEM ORDER BY ITEM_CODE DESC
DEBUG [2022-08-16 14:20:20,904] - ==> Parameters:
DEBUG [2022-08-16 14:20:21,035] - <== Total: 13

관리자 아이디/비번으로 로그인 페이지 이동
command = /loginForm.me
command = /login.me
DEBUG [2022-08-16 14:20:25,848] - Opening JDBC Connection
DEBUG [2022-08-16 14:20:25,882] - Created connection 350828653.
DEBUG [2022-08-16 14:20:25,882] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@14e9386d]
DEBUG [2022-08-16 14:20:25,882] - ==> Preparing: SELECT MEM_ID , MEM_NAME , IS_ADMIN FROM SHOP_MEMBER WHERE MEM_ID = ? AND MEM_PW = ?
DEBUG [2022-08-16 14:20:25,891] - ==> Parameters: 111(String), 111(String)
DEBUG [2022-08-16 14:20:25,897] - <== Total: 1

관리자로 로그인되어 바로 상품등록 양식 페이지 이동
command = /regItemForm.ad
DEBUG [2022-08-16 14:20:26,919] - Opening JDBC Connection
DEBUG [2022-08-16 14:20:26,950] - Created connection 75042048.
DEBUG [2022-08-16 14:20:26,950] - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@4790d00]
DEBUG [2022-08-16 14:20:26,950] - ==> Preparing: SELECT CATE_CODE , CATE_NAME FROM ITEM_CATEGORY
DEBUG [2022-08-16 14:20:26,951] - ==> Parameters:
DEBUG [2022-08-16 14:20:26,954] - <== Total: 4

실제 상품등록 페이지 이동
command = /insertItem.ad
DEBUG [2022-08-16 14:21:02,270] - ==> Preparing: SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, 0) FROM SHOP_ITEM
DEBUG [2022-08-16 14:21:02,271] - ==> Parameters:
DEBUG [2022-08-16 14:21:02,274] - <== Total: 1
DEBUG [2022-08-16 14:21:02,274] - ==> Preparing: INSERT INTO SHOP_ITEM ( ITEM_CODE , ITEM_NAME , ITEM_PRICE , ITEM_COMMENT , CATE_CODE ) VALUES ( ? , ? , ? , ? , ? )
DEBUG [2022-08-16 14:21:02,277] - ==> Parameters: ITEM_014(String), 이미지첨부 체크하기(String), 78000(Integer), 이미지첨부 체크(String), CATE_003(String)
DEBUG [2022-08-16 14:21:02,289] - <== Updates: 1
DEBUG [2022-08-16 14:21:02,289] - Committing JDBC Connection

[oracle.jdbc.driver.T4CConnection@4790d00]
DEBUG [2022-08-16 14:21:02,292] - ==> Preparing: INSERT INTO ITEMIMAGE ( IMG_CODE , ORIGIN_NAME , ATTACHED_NAME , IS_MAIN , ITEM_CODE ) VALUES ( (SELECT 'IMG'||LPAD(NVL(MAX(TONUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE) , ? , ? , ? , ? )
DEBUG [2022-08-16 14:21:02,292] - ==> Parameters: 마인
메인.jpg(String), 마인_메인.jpg(String), Y(String), ITEM_014(String)
DEBUG [2022-08-16 14:21:02,322] - <== Updates: 1
DEBUG [2022-08-16 14:21:02,323] - Committing JDBC Connection

[oracle.jdbc.driver.T4CConnection@4790d00]
DEBUG [2022-08-16 14:21:02,323] - ==> Preparing: INSERT INTO ITEMIMAGE ( IMG_CODE , ORIGIN_NAME , ATTACHED_NAME , IS_MAIN , ITEM_CODE ) VALUES ( (SELECT 'IMG'||LPAD(NVL(MAX(TONUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1, 3, 0) FROM ITEM_IMAGE) , ? , ? , ? , ? )
DEBUG [2022-08-16 14:21:02,323] - ==> Parameters: 마인
상세1.jpg(String), 마인_상세1.jpg(String), N(String), ITEM_014(String)
DEBUG [2022-08-16 14:21:02,324] - <== Updates: 1
DEBUG [2022-08-16 14:21:02,324] - Committing JDBC Connection

[oracle.jdbc.driver.T4CConnection@4790d00]
command = /regItemForm.ad
DEBUG [2022-08-16 14:21:02,326] - ==> Preparing: SELECT CATE_CODE , CATE_NAME FROM ITEM_CATEGORY
DEBUG [2022-08-16 14:21:02,327] - ==> Parameters:
DEBUG [2022-08-16 14:21:02,328] - <== Total: 4


<실습내용>
아직까지도 문제점 발생

  • 상품등록시 첨부파일을 하나도 넣지 않을 때 오류발생
    - 상품등록시 3가지 발생
    • 상품정보 등록/상품 이미지 정보 등록/ 파일 첨부
    • 상품등록시 이 세가지 모두 발생 그래서 오류발생시 어디서 문제가 일어나는가?
    • 콘솔을 확인하면 식별가능하다

  • 트랜잭션 처리
    • 위에 문제처럼 세가지 중 한 곳에서라도 오류가 나면 그냥 상품등록 자체에서 완전히 오류가 나도록 해야하는 것이 좋다!
    • 상품정보 등록 > 상품이미지정보 등록 *2 : 이 과정이 완전히 모두 이루어졌을 때 상품등록해야 트랜잭션 처리 가능하다.

  • insert쿼리가 반복되면 좋지 않은 코드다!!

  • 상품등록시 첨부파일 하나도 넣지 않을 때
    파일명: AdminController.java
if(originName != null) {
					//실제로 등록된 파일명
					String attachedName = multi.getFilesystemName(inputName);//서버에 등록된네임을 가져온다.
					String isMain = inputName.equals("mainImg")? "Y" : "N"; 
					ImgDTO imgDTO = new ImgDTO();
					imgDTO.setOriginName(originName);
					imgDTO.setAttachedname(attachedName);
					imgDTO.setIsMain(isMain);
					imgDTO.setItemCode(nextItemCode);
					
					//상품 이미지 등록(반복문안에 !!)
					itemService.insertImage(imgDTO);
                    //맵퍼에서 쿼리실행 안에 있는 빈값들 채워주기.위에서 만들어준다.!
				}
			}

(내일 이어서 )


실습내용

    1. 상세조회 완성
      - 상품이미지 (메인이미지),상품명, 가격, 상품설명
    1. 상품목록페이지에서도 상품의 이미지를 제대로 출력
profile
Dev.Vinch

0개의 댓글