20220816_Tue
파일명: 서브쿼리.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);
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값을 같은 값이 들어가야한다.
->두 가지 해결방법이 있다.
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 ="" 경로빈값에 붙여넣기)
<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>
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할 수 있도록 한다.
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;
}
}
<!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>
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);
}
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();
}
}
[상품 등록]
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로 테이블 조회하여 데이터 잘들어갔는지 확인 -> 콘솔로도 확인하기
프로젝트 실행 후 상품목록페이지 이동
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쿼리가 반복되면 좋지 않은 코드다!!
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);
//맵퍼에서 쿼리실행 안에 있는 빈값들 채워주기.위에서 만들어준다.!
}
}
(내일 이어서 )
실습내용
- 상세조회 완성
- 상품이미지 (메인이미지),상품명, 가격, 상품설명
- 상품목록페이지에서도 상품의 이미지를 제대로 출력