오늘은 장바구니 기능 구현에 대한 네번째 포스팅을 해보겠습니다 ╰(*°▽°*)╯4
구현 순서
1. Interceptor 예외설정
2. CartMapper.java 수정
3. CartService 메서드
4. CartServiceTests.java
5. CartController
1. Interceptor 예외설정
Interceptor 예외설정을 위해 servlet-context.xml 파일에 코드 한줄을 추가해 줍니다.
<exclude-mapping> 태그는 인터셉터에서 설정한 url 경로 중 예외 url을 설정해 주는 태그입니다.
기존의 인터셉트 코드는 "/cart/**" 경로를 타는 모든 요청은 Controller 객체를 거치게 되어있습니다.
하지만 예외로 "/cart/add" 경로는 인터셉터 객체를 거치지 않는다는 의미 입니다.
<exclude-mapping path="/cart/add"/>
2. CartMapper.java 수정
addCart 메서드에 throws Exception을 추가해 줍니다.
기존 메서드는 실패시 0을 반환해 주지 않고 예외가 실행이 되면서 멈춥니다.
실패시 0을 반환해 줄 수 있도록 하기 위해 throws Exception을 추가해 메서드를 호출한 주체에게 메서드에서 발생한 예외를 던져주는 역할을 해줄 수 있도록 합니다.
//카트 추가
public int addCart(CartDTO cart) throws Exception;
3. CartService 메서드
Service 메서드에서는 장바구니에 있는 데이터를 데이터베이스에 등록을 해주고, 데이터의 존재 여부와 성공 여부에 따른 정수(int 값)을 반환 해주도록 구현합니다.
com.angel.service 패키지에 CartService.java 인터페이스를 생성해 줍니다.
장바구니 추가 메서드를 작성해 줍니다.
public interface CartService {
//장바구니 추가
public int addCart(CartDTO cart);
}
com.angel.service 패키지에 CartServiceImpl.java 클래스를 만들어 줍니다.
@Service 어노테이션을 선언해 클래스가 스프링 컨테이너에서 빈으로 관리될 수 있도록 해줍니다.
implements CartService를 추가하여 CartService를 상속받는 키워드도 추가해 줍니다.
@Autowired어노테이션을 추가하여 CartMapper 객체의 메서드를 사용하기 위해 의존성 주입을 해줍니다.
CartService 인터페이스에서 선언한 메서드를 오버라이딩 합니다.
@Override
public int addCart(CartDTO cart) {
}
addCart 메서드 안에 장바구니 데이터 체크 관련 코드를 추가해 줍니다.
checkCart 메서드를 사용하여 Cart에 데이터가 있는지 체크해 줍니다.
장바구니에 데이터가 있을 경우 2를 반환해 줍니다.
addCart 메서드가 throws Exception을 통해 예외를 던지도록 했기 때문에 addCart 메서드를 사용하기 위해 try-catch 문으로 감싸 주어야 합니다.
장바구니 등록 및 에러가 발생시 0이 반환 되도록 return 값을 줍니다.
@Override
public int addCart(CartDTO cart) {
// 장바구니 데이터 체크
CartDTO checkCart = cartMapper.checkCart(cart);
// 장바구니에 데이터가 있을 경우 2 반환
if (checkCart != null) {
return 2;
}
// 장바구니 등록 및 에러시 0 반환
try {
return cartMapper.addCart(cart);
} catch (Exception e) {
return 0;
}
}
4. CartServiceTests.java
src/test/java 경로에 com.angel.service 패키지를 생성한 후, CartServiceTests.java 클래스를 만들어 줍니다.
Junit 테스트를 위해 기본적인 어노테이션을 추가해 줍니다.
CartService 객체를 의존성 주입 해줍니다.
@Log4j
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class CartServiceTests {
@Autowired
private CartService service;
}
테스트 코드를 입력해 줍니다.
테스트는 총 3번 진행 해주어야 합니다.
첫번째, 데이터베이스에 등록된 값을 넣어서 테스트를 한 후 결과 값 2가 반환
두번째, 데이터베이스에 등록되지 않은 값을 넣고 테스트를 한 후 결과 값 1 반환 및 DB 등록
세번째, SQL 에러를 발생시킬 값을 넣어서 테스트를 한 후 결과 값 0 반환
//등록 테스트
@Test
public void addCart() {
String memberId = "유미";
Long product_num = 100L;
int amount = 5;
CartDTO dto = new CartDTO();
dto.setMemberId(memberId);
dto.setProduct_num(product_num);
dto.setAmount(amount);
int result = service.addCart(dto);
log.info("결과 : " + result);
}
첫번째 테스트 결과 ↓↓↓
두번째 테스트 결과 ↓↓↓
데이터 베이스 등록 ↓↓↓
세번째 테스트 결과(memberId에 존재하지 않는 값 입력 시) ↓↓↓
5. CartController
com.angel.controller 패키지에 CartController.java 클래스를 만들어 줍니다.
상단에 @Controller 어노테이션을 추가해줍니다.
의존성 주입을 위해 @Autowired도 추가해 줍니다.
@Controller
public class CartController {
@Autowired
private CartService cartService;
}
Post 방식인 url 매핑 메서드를 작성해 줍니다.
@ResponseBody를 사용할 것이기 때문에 String으로 반환타입을 주었습니다. (화면을 반환하는 것이 아니라 데이터를 반환)
데이터를 전달 받기 위해 CartDTO 타입을 파라미터 변수로 선언해 줍니다.
로그인 여부를 확인하기 위한 session 객체가 필요하기 때문에 HttpServletRequest 타입의 파라미터 변수도 추가해 줍니다.
@PostMapping("/cart/add")
@ResponseBody
public String addCartPOST(CartDTO cart, HttpServletRequest request) {
}
로그인 여부를 체크하고 로그인 되지 않았을 경우, 5를 반환할 수 있도록 작성해 줍니다.
@PostMapping("/cart/add")
@ResponseBody
public String addCartPOST(CartDTO cart, HttpServletRequest request) {
//로그인 체크
HttpSession session = request.getSession();
MemberVO vo = (MemberVO)session.getAttribute("member");
if(vo == null) {
return "5";
}
}
장바구니를 추가해주는 코드를 작성해 줍니다.
addCart 메서드를 호출하고 반환받은 값을 반환 하도록 코드를 추가해 줍니다.
addCart의 반환타입이 int형이여서 String으로 변환하기 위해 빈 문자열을 추가해 return 값을 주었습니다.
@PostMapping("/cart/add")
@ResponseBody
public String addCartPOST(CartDTO cart, HttpServletRequest request) {
//로그인 체크
HttpSession session = request.getSession();
MemberVO vo = (MemberVO)session.getAttribute("member");
if(vo == null) {
return "5";
}
//카트 등록
int result = cartService.addCart(cart);
return result + "";
}
이상입니당 (∩^o^)⊃━☆
참고 : Kim VamPa (tistory.com) 👍
'코딩 > Spring 쇼핑몰 프로젝트' 카테고리의 다른 글
Spring [쇼핑몰프로젝트] - 장바구니 구현 - 오류 기록[29] (0) | 2023.05.19 |
---|---|
Spring [쇼핑몰프로젝트] - 장바구니 구현[28] (0) | 2023.05.18 |
Spring [쇼핑몰프로젝트] - 장바구니 구현[26] (0) | 2023.05.17 |
Spring [쇼핑몰프로젝트] - 장바구니 구현[25] (0) | 2023.05.16 |
Spring [쇼핑몰프로젝트] - 장바구니 구현[24] (0) | 2023.05.15 |