본문 바로가기

프로그래밍/JAVA & SPRING

[LifeSoft] spring 9강 로그인/로그아웃 처리, 장바구니 기능 만들기

반응형

장바구니를 구현하기 전에 로그인 사용자가 장바구니를 사용할 수 있도록 한다.

 

라. 회원로그인 실습 예제

1) views/include/menu.jsp

로그인 관련 링크를 만든다. 세션을 이용한다.

 <c:choose>
  <c:when test="${sessionScope.userid == null }">
   <a href="${path}/member/login.do">로그인</a> |
  </c:when>
  <c:otherwise>
   ${sessionScope.name}님이 로그인중입니다.
   <a href="${path}/member/logout.do">로그아웃</a>
  </c:otherwise>
 </c:choose> 

 

1) member 테이블을 이용한다.

2) model.shop.MemberDTO.java

3) model.shop.MemberDAO.java

4) model.shop.MemberDAOImpl.java

5) mappers/member/memberMapper.xml

6) model.shop.MemberService.java

7) model.shop.MemberServiceImpl.java

8) controller.shop.MemberController.java

 

 

마. 장바구니 실습예제

1)장바구니 테이블

2) model.shop.CartDTO.java

3) model.shop.CartDAO.java

4) model.shop.CartDAOImpl.java

5) mappers/shop/cartMapper.xml

6) model.shop.CartService.java

7) model.shop.CartServiceImpl.java

8) controller.shop.CartController.java

 

장바구니 수정시

ajax를 이용해서 값을 chage할때 chage이번트를 걸어서

서버에 값 백그라운드에서 수정하는 방법이 있는데

여기서는 한꺼번에 반복처리를 해서 수정하도록 한다.

수정 후 리스트로 돌아온다.

 

수정버튼을 누르면 action="${path}/shop/cart/update.do"

form 안의 amount가 배열로 처리가 된다.

name="amount" => 받는 쪽에서 배열로 받는다. int[] amount

name="cart_id" =>  받는 쪽에서 배열로 받는다. int[] cart_id

 

 

 

drop table cart cascade constraints;

create table cart (
cart_id number not null primary key, -- 장바구니 코드(일련번호)
userid varchar2(50) not null, -- 아이디
product_id number not null, -- 상품코드
amount number default 0 -- 수량
);


select * from member;
select * from product;

-- gksmf이 1번 상품을 3개 장바구니에 담음
insert into cart (cart_id, userid, product_id, amount)
values (1,'gksmf',1,3);

select * from cart;

member테이블에 없는 사용자 이름으로 입력
insert into cart values (2,'difname',2,10);

select name, product_name, price, amount, price*amount money
from member m, product p, cart c
where m.userid=c.userid and p.product_id = c.product_id;
결과값:
name | product_name | price | amount | money
하늘이  |      레몬            |  1500 |   3    |  4500

rollback;

-- foreign key 설정
alter table cart add constraint cart_userid_fk
foreign key(userid) references member(userid);
-- 제약조건 삭제
alter table cart drop constraint car_productid_fk
-- 제약조건 추가
alter table cart add constraint car_productid_fk
foreign key(product_id) references product(product_id);

제약조건 설정후 아래 코드는 오류가 생김
insert into cart values (2,'difname',2,10);
-- 존재하지 않는 상품코드
-- 무결성 제약조건(SPRING.CART_PRODUCTID_FK)이 위배되었습니다

장바구니 담기 기능을 구현중인데
지금까지는 장바구니 테이블을 만들었으니
상품정보를 담을 객체가 필요하다.
CartDTO 클래스를 만든다.

CartDAO 인터페이스와
CartDAOImpl 구현클래스를 작성하고
CartDAOImpl에서 mybatis를 호출한다.
  sqlSession.insert("cart.insert", dto);
resources/mappers/shop/에 cartMapper.xml을 만들고
  insert문을 작성한다.
   <insert id="insertCart">
  insert into cart (cart_id, userid, product_id, amount)
  values (seq_cart.nextval, #{userid}, #{product_id}, #{amount})
 </insert>

시퀀스를 적용했는데 아래는 시퀀스를 만드는 쿼리문
먼저 장바구니 데이터를 모두 비워준다 (롤백해도 된다.)  
create sequence seq_cart
start with 1
increment by 1;
==> Sequence SEQ_CART이(가) 생성되었습니다.

장바구니 입력이 완료되면 장바구니 리스트로 이동한다.
@RequestMapping("insert.do")
public String insert(@ModelAttribute CartDTO dto, HttpSession session) {
 .....  
 return "redirect:/shop/cart/list.do"; // 장바구니 목록으로 이동
}
 
@RequestMapping("list.do")
public ModelAndView list(ModelAndView mav, HttpSession session) { 
 cartService.listCart(userid)
 cartService.sumMoney(userid);
 ...
}

cartMapper.xml의 listCart를 본다.
아래의 쿼리문을 직접 던져본다.
select
    cart_id, p.product_id, c.userid, name,
 product_name, amount,
 price, (price*amount) money
from member m, cart c, product p
where m.userid = c.userid and c.product_id = p.product_id
  and c.userid = 'gksmf'
order by cart_id

세개의 테이블을 조인하는데
양쪽에 있는 경우는 p나 c와 같은 alias를 붙여주고
한 곳만 있는 경우는 컬럼명만 적어준다.

money컬럼은 세개의 테이블에 존재하는 않는다.
(price*amount)를 money라는 alias로 만든다.