반응형
아래와 같이 모든페이지에는 Layout으로 적용한 Header 부분이 공통적으로 들어간다. 그렇기 때문에 모든 페이지에서 해당 알림 데이터 리스트들이 필요하다. 하지만 현재 해당 헤더가 적용된 view를 반환하는 컨트롤러 코드들은 로그인과 회원가입 페이지들을 제외하면 총 9개가 있다. 이 많은 컨트롤러마다 일일히 패키지를 열어서 알림 테이블에서 회원별 알림 내역을 조회한 데이터들을 model에 담아 일일이 View에 뿌려줘야할까? 공통으로 사용되는 부분을 단순 반복 작업을 통해 추가하는건 너무 개발자스럽지 않다. 이 공통으로 사용되는 로직을 스프링 AOP를 적용해 해당 Contoller들의 Model에 알림 데이터들을 추가 해보자. AOP 적용 우선 먼저 build.gradle에 해당 의존성을 추가해주어..
판매자가 회원의 리뷰에 답글을 달면 위와같이 알림 메세지를 보내는 기능이 필요했다.현재는 답글을 달 경우 "어드민 서버"에서 Kakfa로 메세지를 보내고, "회원 서버"에서는 해당 topic을 구독하는 회원들에게 전달 받은 메세지를 SSE로 프론트에 뿌려주도록 구현했다.DB에 저장하는 것 만으로 알림은 충분히 구현이 가능하다.다만 위 처럼 서버에 요청을 보내지 않으면 알림을 표시할 수 없다. (실시간으로 알림을 보내줄순 없다.) 실시간 알림을 구현하는 경우 대표적으로 SSE, Websoket, Polling 3가지가 있다. 이번 포스팅에서는 자주 사용되는 SSE와 Websoket에 대한 차이점에 대해 이야기하고, SSE를 사용해 해당 실시간 알림을 구현한 이유에 대해 설명하고자 한다.SSE vs Web..
우리의 서비스는 자체 회원가입을 통해 가입한 유저 로그인, 소셜 계정을 통해 가입된 유저 로그인 2가지 로그인 방식을 지원한다. 처음에는 일반 로그인만 구현해놓고 소셜 로그인은 후반에 적용하게 되었다. 그래서 일반 로그인은 자체 로그인 로직으로, 소셜 로그인은 스프링 시큐리티로 로그인을 구현이 되었다. 그런데 여기서 문제가 발생하게 되었다. 소셜 로그인은 사용자의 권한을 잘 읽어오지만 일반 로그인을 한 회원은 사용자의 권한을 읽어오지 못해 권한 설정을 한 페이지에 접근할수가 없는 문제가 발생하는 것이다. 문제 발생이유 기존에는 소셜 로그인은 시큐리티로 처리했지만, 일반 로그인 같은 경우는 아래처럼 요청을 받아 유효성검사를 하고 결과를 반환해주는 식이였다. 하지만 이런식으로 일반 로그인을 처리할 경우에는 ..
우리 서비스는 쇼핑몰을 통한 회원 가입 및 로그인, 그리고 소셜 계정을 통한 회원 가입 및 로그인을 지원한다. (카카오, 네이버, 구글)이 글을 포스팅하는 이유는 소셜 로그인을 뒤 늦게 적용하게 되었는데 소셜 로그인을 적용하고 난뒤에기존 쇼핑몰 회원과 소셜 계정을 통해 가입한 회원을 관리하는데 문제가 발생하게 되어서 그 문제점을 해결한 방법에 대해 포스팅하고자 한다.문제 발생 상황⛔ 문제점1. 소셜 로그인 구글 이메일이 a@, 나머지 이메일은 b@일 때 쇼핑몰을 통해 회원가입한 유저의 이메일이 b@ 일 경우 이메일 중복 문제가 발생해 이메일이 같은 경우 b@이메일 유저의 세션을 사용하는 문제.2. 소셜 로그인은 보안상 비밀번호를 받아올 수 없기 때문에 소셜 로그인한 회원은 비밀번호 찾기가 불가. 이러한 ..
내 프로젝트에서는 사용자별로 사이드바에 찜 수, 장바구니 수들을 카운트 쿼리로 반환된 데이터 수를 view에 뿌려주는데,이 사이드바는 여러 페이지에서 노출되어 페이지 이동마다 카운트 쿼리를 자주 호출하고 있었다.그렇기 때문에 매번 카운트 쿼리를 호출하지 않고 해당 데이터를 캐시 처리하여 카운트 수가 변경되지 않을 경우에 Redis 캐시에서 해당 데이터 수를 반환하도록 하여 DB의 부담을 줄이도록 하였다. 레디스에 대해 알고 싶다면 아래 포스팅에서 설명한다. [Redis] 레디스란? 특징, 활용예시, 비교 정리레디스란? Redis는 Remote Disctionary Server의 약자로 키(Key) : 값(Value) 해시 맵과 같은 구조를 가진 NoSQL 데이터베이스이다. MySQL, Oracle같은 일..
결제 취소 기능에 대해 포스팅하기 앞서 iamport를 사용하기 위한 준비과정 및 결제 기능 구현하는 방법에 대해서는 아래 포스팅에 설명되어 있다. [Spring] 아임포트(import)로 결제 기능 구현하기 (클라이언트 + 서버 코드 포함) import 란? 아임포트는 쇼핑몰 서버를 대신해서 쇼핑몰에서 사용자가 상품을 구매하려 할 때 실제 결제 요청 받는 역할을 하고 이 요청을 받아서 PG(결제 대행 업체)에 요청을 해준다. 그리고 결제 hstory0208.tistory.com 결제 취소 기능 구현 상품을 결제했으면 당연히 취소도 가능해야한다. 그렇기 때문에 결제 취소 로직을 추가하였다. 아래에서 설명하는 iamport에 결제 취소 요청을 보내는 코드를 구현하면 결제 완료된 상품에 대한 상품에 대한 결..