[ paging 작업 ]
○
<!-- 전체 게시글 수 구하기(Paging 처리) -->
<select id="boardListTotalCount" parameterType="com.edu.common.util.Criteria" resultType="Integer">
<![CDATA[
SELECT *
FROM T_BOARD
WHERE 1 = 1
]]>
</select>
<!-- 페이지 번호에 해당하는 게시글 목록 가져오기 (paging) -->
<select id="boardListPaging" parameterType="hashmap" resultType="com.edu.board.dto.BoardDTO">
<![CDATA[
select *
from (
select *
, row_number() over(order by seq desc) as rNum
from t_board;
) brd
where rNum between 1+(#{perPageNum}*(#{page}-1)) and #{perPageNum} + (#{perPageNum}*(#{page}-1))
order by seq desc;
]]>
</select>
[ cart 테이블 수정 ]
○ 상품 아이디 외래키 지정
alter table cart
add (
product_id int,
foreign key (product_id) references product(product_id)
);
○ 중복 데이터 제약 조건 설정
alter table cart add unique (id, product_id);
[ CartDTO.java ]
○ 장바구니 관련 변수 선언
- p_count, p_discount 추가 / @Data 어노테이션 추가
- salePrice, totalPrice 추가 / setter 메서드 제거 및 초기화 메서드 생성
private int cart_id;
private String id;
private int product_id;
private String p_name;
private int p_price;
private int p_count;
private int p_discount;
private int salePrice;
private int totalPrice;
public void initSaleTotal() {
this.salePrice = (int) (this.p_price * (1-this.p_discount));
this.totalPrice = this.salePrice*this.p_count;
}
[ CartDAO.java ]
○ int : 파라미터 반환 타입을 int로 설정함으로써 row 추가 성공 시 1, 실패 시 0 반환
/* 카트 추가 */
public int addCart(CartDTO cart);
/* 카트 삭제 */
public int deleteCart(int cart_id);
/* 카트 수량 수정 */
public int modifyCount(CartDTO cart);
/* 카트 목록 */
public List<CartDTO> getCart(String id);
/* 카트 확인 */
public CartDTO checkCart(CartDTO cart);
[ CartMapper.xml ]
<?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="com.edu.cart">
<!-- 카트 추가 -->
<insert id="addCart">
insert into cart(id, product_id, p_count)
values(#{id}, #{product_id}, #{p_count})
</insert>
<!-- 카트 삭제 -->
<delete id="deleteCart">
delete from cart where cart_id = #{cart_id}
</delete>
<!-- 카트 수량 수정 -->
<update id="modifyCount">
update cart set p_count=#{p_count} where cart_id = #{cart_id}
</update>
<!-- 카트 목록 -->
<select id="getCart" resultType="com.edu.dto.CartDTO">
select a.cart_id, a.id, a.product_id, a.p_count, b.p_name, b.p_price, b.p_discount
from cart a left outer join product b on a.product_id = b.product_id
where id = #{id}
</select>
<!-- 카트 확인 -->
<select id="checkCart" resultType="com.edu.dto.CartDTO">
select * from cart
where id = #{id} and product_id = #{product_id}
</select>
</mapper>
[ 장바구니 서버 구현 ]
○ 순서
- 화면 이동 없는 비동기 방식의 뷰
- htttp 바디에 바로 데이터를 삽입해 반환
- 뷰로부터 '장바구니 추가' 요청 받음
- 등록할 데이터(id, product_id, p_count) 전달 받음
- 전달 받은 id와 product_id와 동일한 데이터 가지는 cart 행(row) 있는지 확인
- 존재하지 않을 시 DB에 새로운 행(row) 추가
- 뷰는 숫자 반환토록 함
1) 0 : 등록 실패
2) 1 : 등록 성공
3) 2: 등록된 데이터 존재
4) 5 : 로그인 필요
[ CartDAO.java ]
○ addCart에 throws Exception 추가
/* 카트 추가 */
public int addCart(CartDTO cart) throws Exception;
/* 카트 삭제 */
public int deleteCart(int cart_id);
/* 카트 수량 수정 */
public int modifyCount(CartDTO cart);
/* 카트 목록 */
public List<CartDTO> getCart(String id);
/* 카트 확인 */
public CartDTO checkCart(CartDTO cart);
[ CartService.java ]
○ '장바구니 DB 등록'에 대한 요청 수행
- 데이터 존재 여부 체크
- 성공 여부에 따른 int 값 반환 목표
/* 장바구니 추가 */
public int addCart(CartDTO cart);
[ CartServiceImpl.java ]
○ cartDAO 객체의 메서드 의존성 주입
○ cartService 인터페이스에서 선언한 메서드 오버라이딩
○ checkCart() DAO 메서드 활용해 등록코자 하는 데이터 이미 DB에 있는지 확인 => 2 반환
○ try-catch : 감싸주는 코드 추가하고 예외 발생한 경우 DB 등록 실패 => 0 반환
@Service
puvlic class CartServletImpl implements CartService {
@Inject
private CartDAO cartDAO;
@Override
public int addCart(CartDTO cart) {
// 장바구니 데이터 체크
CartDTO checkCart = cartDAO.checkCart(cart);
if(checkCart != null) {
return 2;
}
// 장바구니 등록 & 에러 시 0반환
try {
return cartDAO.addCart(cart);
} catch (Exception e) {
return 0;
}
}
}
[ CartController.java ]
○ 등록한 데이터 전달방기 위해 CartDTO 타입의 파라미터 변수 선언
○ 로그인 여부 확인 위해 session 객체 필요하기 때문에 HttpservletRequest 타입 파라미터 변수 선언
○ 로그인 여부 먼저 체크, 비로그인 시 5반환
@Controller
public class CartController {
@Inject
private CartService cartService;
@PostMapping("/cart/add") // 장바구니 추가 요청 처리하는 URL 매핑 메서드
@ResponseBody // 화면이 아닌 데이터를 바로 반환
public String addCartPost(CartDTO cart, HttpServletRequest request) {
HttpSession session = request.getSession();
MemberVO mvo = (MemberVO)session.getAttribute("member");
if(mvo == null) {
return "5";
}
// 카트 등록
int result = cartService.addCart(cart);
return result + "";
}
}
[ 장바구니 뷰 구현 ]
○ 순서
- 'goodsDetail.jsp' 페이지에서 'id', 'product_id', 'p_count' 데이터 값 세팅
- "/cart/add" URL로 '장바구니 추가' 요청 및 세팅 값 서버로 전송
- 서버가 반환해주는 값에 따라 경고창 띄우기
- 사용자가 자신이 원하는 수량 세팅 할 수 있도록 "+", "-" 버튼 동작
- 'id', 'product_id', 'p_count' 값을 javascript 객체로 세팅해 Ajax 호출할 때 같이 전송토록 함
- Ajax로부타 '로그인 여부', '장바구니 성공 여부', '등록 데이터 여부'에 따른 값 반환받음
- 반환 받은 값에 따라 사용자가 자신의 요청에 대한 결과 볼 수 있도록 경고창 출력
'프로그래밍 언어 > JSP' 카테고리의 다른 글
JSP_22-11-28_[상품 이미지 업로드] (0) | 2022.11.28 |
---|---|
JSP_22-11-22_상품 등록[2] (0) | 2022.11.24 |
JSP_22-11-21_관리자 페이지/상품 등록[1] (0) | 2022.11.21 |
JSP_22-11-18 (0) | 2022.11.18 |