본문 바로가기

안녕하세요!

프로그래밍 언어/JSP

JSP_22-11_24

[ 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로부타 '로그인 여부', '장바구니 성공 여부', '등록 데이터 여부'에 따른 값 반환받음

    - 반환 받은 값에 따라 사용자가 자신의 요청에 대한 결과 볼 수 있도록 경고창 출력

728x90
반응형

'프로그래밍 언어 > 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

loading