반응형
내 프로젝트에서는 사용자별로 사이드바에 찜 수, 장바구니 수들을 카운트 쿼리로 반환된 데이터 수를 view에 뿌려주는데,이 사이드바는 여러 페이지에서 노출되어 페이지 이동마다 카운트 쿼리를 자주 호출하고 있었다.그렇기 때문에 매번 카운트 쿼리를 호출하지 않고 해당 데이터를 캐시 처리하여 카운트 수가 변경되지 않을 경우에 Redis 캐시에서 해당 데이터 수를 반환하도록 하여 DB의 부담을 줄이도록 하였다. 레디스에 대해 알고 싶다면 아래 포스팅에서 설명한다. [Redis] 레디스란? 특징, 활용예시, 비교 정리레디스란? Redis는 Remote Disctionary Server의 약자로 키(Key) : 값(Value) 해시 맵과 같은 구조를 가진 NoSQL 데이터베이스이다. MySQL, Oracle같은 일..
결제 취소 기능에 대해 포스팅하기 앞서 iamport를 사용하기 위한 준비과정 및 결제 기능 구현하는 방법에 대해서는 아래 포스팅에 설명되어 있다. [Spring] 아임포트(import)로 결제 기능 구현하기 (클라이언트 + 서버 코드 포함) import 란? 아임포트는 쇼핑몰 서버를 대신해서 쇼핑몰에서 사용자가 상품을 구매하려 할 때 실제 결제 요청 받는 역할을 하고 이 요청을 받아서 PG(결제 대행 업체)에 요청을 해준다. 그리고 결제 hstory0208.tistory.com 결제 취소 기능 구현 상품을 결제했으면 당연히 취소도 가능해야한다. 그렇기 때문에 결제 취소 로직을 추가하였다. 아래에서 설명하는 iamport에 결제 취소 요청을 보내는 코드를 구현하면 결제 완료된 상품에 대한 상품에 대한 결..
import 란? 아임포트는 쇼핑몰 서버를 대신해서 쇼핑몰에서 사용자가 상품을 구매하려 할 때 실제 결제 요청 받는 역할을 하고 이 요청을 받아서 PG(결제 대행 업체)에 요청을 해준다. 그리고 결제 정보 결과에 대해서 응답을 받을 수 있다. 그렇기 때문에 웹 서버의 부담을 줄일 수 있고, PG사 별로 결제를 요청하는 코드를 작성해야하는 번거로움도 사라지게 된다. iamport는 가이드를 아주 친절하게 제공해주고 무엇보다 한국어로 되어 있어서 보기 편할 것이다. iamport 가이드 iamport 개발자 가이드 ( Notion ) : https://guide.portone.io/test_integration PG 사별 코드표 : https://portone.gitbook.io/docs/tip/pg-2 결..
로그인 사용자에 대한 기능들을 구현하다보면 로그인 사용자의 Session 정보를 활용할 일이 정말 많다. 그렇다 보니 Session 정보를 가져오는 코드마다 아래의 코드가 반복될 것이다. SessionUser user = (SessionUser) httpSession.getAttribute("loginUser"); 이 같은 코드가 반복되는 것을 방지하고자 Spring의 argument resolver를 활용하여 메서드 파라미터의 SessionUser 앞에 @Login 어노테이션을 붙여 세션값을 바로 받아 올 수 있도록 구현할수 있다. 또한 사용자별 세션 정보를 갖고 있으므로, 사용자별로 서로 다른 페이지 내용을 볼 수 있다. ( ex: 마이페이지 ) SessionUser 클래스 세션에 저장할 사용자의 정..
그림과 같이 클릭했던 상품들을 "최근 본 상품"이라는 목록에 보여주는 기능을 추가하게 되었다.이 기능을 구현하기 위해서는 Cookie와 Session을 사용해 구현할 수 있는데, 여기서 고민에 빠졌다.고민하게 된 이유는 다음과 같다. Cookie와 Session방식을 통해 "최근 본 상품"기능을 구현했을 때의 장단점먼저 Cookie는 기본적으로 문자열 형태로 데이터를 저장하며, 복잡한 데이터 타입인 리스트(List)와 같은 자료구조를 그대로 Cookie에 저장하는 것은 지원되지 않는다.그렇기 때문에 복잡한 데이터 타입을 저장하려면 추가적인 로직이 필요하다. (필자는 objectMapper로 JSON 데이터로 변환하여 저장하였다.)게다가 최근 본 상품에는 이미지URL로 해당 상품의 이미지를 보여준다.여기서..
아래와 같은 사이드바에 장바구니에 담긴 상품 개수, 찜 개수, 최근 본 상품이 표시되도록 하는 기능을 구현하게 되었다.그런데 개수 같은 경우에는 count 쿼리로 구해 model에 담아 view넘기는데이 사이드바가 메인, 장바구니, 결제, 상품상세 페이지 등에 적용이되어서 해당 컨트롤러들마다 사이드바에 필요한 데이터를 응답하는 로직이 중복되어 @Aspect로 AOP를 적용하게 되었다.AOP 적용아래는 사이드바에 공통으로 적용할 코드들을 담은 Aspect를 적용한 클래스이다.@Aspect@Component@Slf4j@RequiredArgsConstructorpublic class SidebarAspect { private final LikeService likeService; private f..