Kim VamPa

[Spring][쇼핑몰 프로젝트][36] 장바구니 기능(Mapper메서드) - 2 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][36] 장바구니 기능(Mapper메서드) - 2

Kim VamPa 2021. 11. 16. 16:13
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

 

목표

장바구니 기능 구현

  '장바구니' 구현에 사용할 Mapper 메서드 생성을 목표로 합니다. 장바구니 테이블 ROW 추가, 장바구니 테이블 ROW 삭제, 장바구니 테이블 수량 COLUMN 수정, 장바구니 테이블 한 개의 ROW 가져오기, 장바구니 테이블 여러 개 ROW 가져오기 총 5개의 Mapper 메서드를 생성할 것입니다. 이번 포스팅에선 언급한 5개의 Mapper 메서드를 생성하고, 장바구니 구현을 하면서 추가적인 Mapper 메서드가 필요하다면 그때그때 추가해주도록 하겠습니다.

 

 

 

 

순서

1. CartDTO

2. CartMapper.java

2. 장바구니 테이블

 

 

1. CartDTO

 본격적인 Mapper 메서드를 생성하기 앞서서, Mapper 메서드에 필요로한 장바구니 데이터를 전달하거나 반환받을 수 있도록 해줄 DTO 클래스를 하나 추가해주겠습니다.

 

 com.vam.model 패키지에 CartDTO.java 클래스를 추가해줍니다.

 

그림 1-1

 

 생성한 CartDTO 클래스에 장바구니와 관련된 변수들을 선언해주었습니다.

 

    private int cartId;
    
    private String memberId;
    
    private int bookId;
    
    private int bookCount;
    
    //book
    
    private String bookName;
    
    private int bookPrice;
    
    private double bookDiscount;
    
    // 추가
    private int salePrice;
    
    private int totalPrice;

 

그림 1-2

 

 

- 처음 4개(cartId, memberId, bookId, booCount)는 vam_cart 테이블의 속성입니다.

 

- 그 다음 3개의 변수(bookName, bookPrice, bookDiscount)는 vam_book의 속성인데 vam_cart 테이블과 조인을 하여 이 3개의 변수의 값을 장바구니 페이지에 뿌려주기 위해 추가해주었습니다.

 

- 그 다음 2개의 변수(salePrice, totalPrice)는 할인을 적용한 상품 한 개의 '판매 가격'과 판매 가격에 수량까지 곱한 '총 가격'을 의미합니다. 앞의 bookCount(수량), bookPrice(상품 가격), bookDiscount(할인율) 3개의 변수가 있다면 구 할 수 있는 변수입니다. DB 테이블에는 없는 속성이지만 DTO클래스에서 bookCount, bookPrice, bookDiscount 값이 초기화되었을 때 이 값들도 초기화할 수 있도록 하여서 뷰에 같이 뿌려주거나 서버에서 장바구니 관련 작업에 활용할 수 있도록 해줄 것입니다. 

 

 선언한 변수들에 getter/setter/toString 메서드를 추가해줍니다. 단, salePrice와 totalPrice의 Setter 메서드를 생성해주지 않았습니다.

 

	public int getCartId() {
		return cartId;
	}

	public void setCartId(int cartId) {
		this.cartId = cartId;
	}

	public String getMemberId() {
		return memberId;
	}

	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}

	public int getBookId() {
		return bookId;
	}

	public void setBookId(int bookId) {
		this.bookId = bookId;
	}

	public int getBookCount() {
		return bookCount;
	}

	public void setBookCount(int bookCount) {
		this.bookCount = bookCount;
	}

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

	public int getBookPrice() {
		return bookPrice;
	}

	public void setBookPrice(int bookPrice) {
		this.bookPrice = bookPrice;
	}

	public double getBookDiscount() {
		return bookDiscount;
	}

	public void setBookDiscount(double bookDiscount) {
		this.bookDiscount = bookDiscount;
	}

	public int getSalePrice() {
		return salePrice;
	}

	public int getTotalPrice() {
		return totalPrice;
	}

	@Override
	public String toString() {
		return "CartDTO [cartId=" + cartId + ", memberId=" + memberId + ", bookId=" + bookId + ", bookCount="
				+ bookCount + ", bookName=" + bookName + ", bookPrice=" + bookPrice + ", bookDiscount=" + bookDiscount
				+ ", salePrice=" + salePrice + ", totalPrice=" + totalPrice + "]";
	}

 

그림 1-3

 

 

 salePrice와 totalPrice의 변수 값을 초기화 해주는 메서드를 생성해줍니다. 이 두 변수의 값을 변경을 원할 경우 오직 이 메서드를 통해서만 가능하도록 하기 위해, salePrice와 totalPrice의 Setter 메서드 추가해주지 않았습니다.

 

	public void initSaleTotal() {
		this.salePrice = (int) (this.bookPrice * (1-this.bookDiscount));
		this.totalPrice = this.salePrice*this.bookCount;
	}

 

그림 1-4

 

 

 

2. CartMapper.java

  카트와 관련된 장바구니 Mapper를 따로 관리 할 수 있도록 com.vam.mapper 패키지에 CartMapper.java 인터페이스를 추가해주었습니다.

 

그림 2-1

 

 

 생성한 CartMapper.java 인터페이스에 5개의 메서드 선언부를 추가해줍니다.

 

- throw Exception 예외 던지기를 추가하는 게 맞지만 기능 구현에 초점을 맞추기 위해 생략하여 진행하겠습니다.

 

	/* 카트 추가 */
	public int addCart(CartDTO cart);
	
	/* 카트 삭제 */
	public int deleteCart(int cartId);
	
	/* 카트 수량 수정 */
	public int modifyCount(CartDTO cart);
	
	/* 카트 목록 */
	public List<CartDTO> getCart(String memberId);	
	
	/* 카트 확인 */
	public CartDTO checkCart(CartDTO cart);

 

그림 2-2

 

 

- addCart는 vam_cart 테이블의 row를 추가하는 메서드입니다. memberId, bookId, bookCount 값이 필요로 한데 한번에 이 값들을 가져올 수 있도록 CartDTO를 파라미터 변수로 선언하였습니다. 반환 타입은 int로 설정을 하였습니다. 반환타입을 int로 할 경우 row 추가 성공 시 1, 실패시 0을 반환하는데 이러한 점을 필요할때 활용하기 위해 int로 지정하였습니다.

 

- deleteCart는 vam_cart 테이블의 지정한 row를 삭제하는 메서드 입니다. 어떠한 row를 삭제할지 지정하기 위해 cartId에 대한 값이 필요로 합니다. 따라서 파라미터 변수는 int 타입의 cartId를 지정해주었습니다. 앞과 동일하게 성공 여부를 알기 위하여 반환 타입을 int로 지정해주었습니다.

 

- modifyCount는 vam_cart 테이블의 지정한 row의 수량을 변경하는 메서드입니다. 어떠한 row인지 지정을 위한 cartId와 몇 개의 수량으로 변경할지에 대한 값 bookCount가 필요로 하여 두 값을 한 번에 가져오기 위해 CartDTO타입의 파라미터 변수를 선언하였습니다.  앞과 동일하게 성공 여부를 알기 위하여 반환 타입을 int로 지정해주었습니다.

 

- getCart는 vam_cart에서 지정한 회원의 모든 row의 값들을 가져오기 위한 메서드입니다. 어떤 회원인지에 대한 정보가 필요로 하기 때문에 String 타입의 memberId를 파라미터 변수로 선언하였습니다. 반환 타입은 한 개 이상의 장바구니 데이터를 반환받아야 하기 때문에 List<CartDTO>로 지정을 하였습니다.

 

- checkCart는 회원정보와 상품 정보를 넘겨서 해당하는 row가 있는지 확인하기 위해 작성한 메서드입니다. 회원정보(memberId), 상품 정보(bookId)를 한 번에 넘기기 위해 CartDTO 타입의 파라미터 변수를 선언하였습니다. 조건에 맞는 row의 컬럼값을 가져오도록 반환 타입을 CartDTO로 지정하였습니다.

 

 

3. CartMapper.xml

 src/main/resources 디렉토리 경로에서 com/vam/mapper 디렉토리 경로에 CartMapper.xml 을 생성해주고 생성한 파일에 MyBatis를 사용하기 위한 기본 세팅을 해줍니다.

 

 

그림 3-1

 

<?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.vam.mapper.CartMapper">

	
	
  </mapper>

 

그림 3-2

 

 

 목차 2에서 말한 용도에 맞게 각 메서드가 실행할 쿼리를 작성해줍니다.

 

	<!-- 카트 추가 -->
	<insert id="addCart">
	
		insert into vam_cart(memberId, bookId, bookCount)
		values(#{memberId}, #{bookId}, #{bookCount}) 
	
	</insert>
	
	
	<!-- 카트 삭제 -->
	<delete id="deleteCart">
	
		delete from vam_cart where cartId = #{cartId}
	
	</delete>
	
	<!-- 카트 수량 수정 -->
	<update id="modifyCount">
	
		update vam_cart set bookCount=#{bookCount} where cartId = #{cartId}
	
	</update>
	
	
	<!-- 카트 목록 -->
	<select id="getCart" resultType="com.vam.model.CartDTO">
	
		select a.cartId, a.memberId, a.bookId, a.bookCount, b.bookName, b.bookPrice, b.bookDiscount
		from vam_cart a left outer join vam_book b on a.bookId = b.bookId
		where memberId = #{memberId}	
	
	</select>
	
	<!-- 카트 확인 -->
	<select id="checkCart" resultType="com.vam.model.CartDTO">
	
		select * from vam_cart 
		where memberId = #{memberId} and bookId = #{bookId}
	
	</select>

 

그림 3-3

 

 

 

 

4. CartMapperTest.java

 작성한 Mapper 메서드가 정상적으로 동작하는지 확인하기 위해 Junit 테스트를 할 것입니다. src/test/java 디렉토리에 있는 com.vam.mapper 패키지에 CartMapperTests.java 클래스를 생성하고 Junit 테스틀 위한 기본적인 세팅을 해줍니다.

 

그림 4-1

 

 

 

 아래의 코드들을 작성해서 각 Mapper 메서드가 정상적으로 동작하는지 테스트하였습니다.

 

	@Test
	public void addCart() {
		String memberId = "admin";
		int bookId = 61;
		int count = 2;
		
		CartDTO cart = new CartDTO();
		cart.setMemberId(memberId);
		cart.setBookId(bookId);
		cart.setBookCount(count);
		
		int result = 0;
		result = mapper.addCart(cart);
		
		System.out.println("결과 : " + result);
		
	}	

	
	/* 카트 삭제 */

	@Test
	public void deleteCartTest() {
		int cartId = 1;
		
		mapper.deleteCart(cartId);

	
	/* 카트 수량 수정 */

	@Test
	public void modifyCartTest() {
		int cartId = 3;
		int count = 5;
		
		CartDTO cart = new CartDTO();
		cart.setCartId(cartId);
		cart.setBookCount(count);
		
		mapper.modifyCount(cart);
		
	}

	
	/* 카트 목록 */ 

	@Test
	public void getCartTest() {
		String memberId = "admin";
		
		
		List<CartDTO> list = mapper.getCart(memberId);
		for(CartDTO cart : list) {
			System.out.println(cart);
			cart.initSaleTotal();
			System.out.println("init cart : " + cart);
		}
		
		
	
	}
	*/		
	/* 카트 확인 */

	@Test
	public void checkCartTest() {
		
		String memberId = "admin";
		int bookId = 71;
		
		CartDTO cart = new CartDTO();
		cart.setMemberId(memberId);
		cart.setBookId(bookId);
		
		CartDTO resutlCart = mapper.checkCart(cart);
		System.out.println("결과 : " + resutlCart);
		
	}

 

- addCart의 경우 db에 존재하는 memberId와 bookId 값을 입력해야 합니다. 그리고 동일한 memberId로 서로 다른 bookId 3개의 데이터를 등록해줍니다. (deleteCart, getCart를 테스트하기 위함입니다.

 

- getCart는 인자로 전달한 memberId가 가진 모든 장바구니 정보를 반환하기 때문에, 정상적으로 등록되는지 확인하기 위해서 최소 2개 의상의 데이터를 넣어서 테스트합니다.

 

 

 

 

 

REFERENCE

  •  

 

 

DATE

  • 2020.11.16

 

728x90
반응형
Comments