분류 전체보기 98

Redis를 사용한 선착순 쿠폰발급 시스템

최종프로젝트 BuySell의 선착순 쿠폰발급 기능구현을 위한 연습을 해보기로 했다. 요구사항 선착순 100명에게 쿠폰을 지급하는 이벤트이다. 101개 이상 지급되면 안된다. 순간적으로 몰린 트래픽으로 인해 다른 페이지의 성능에 지장을 주면 안된다. Entity @Entity class Coupon( val userId: Long, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null } Repository interface CouponRepository: JpaRepository Service @Service class ApplyService( private val couponRepository: CouponRep..

SpringBoot 2024.03.21

BuySell - 선착순 쿠폰발급 (2)

어제 고민해보았던 내용 정리 튜터님께 여쭤보니 동시성 제어를 하는 방법을 몇가지 알려주셨다. 쿠폰 발급 과정 1. 쿠폰을 미리 생성 -> 선착순 발급 2. 쿠폰 발급 요청 시 쿠폰생성 -> 선착순 발급 1번을 선택하기로 했다. phantom write를 방지하기 위한 방법 isolation level을 설정하는 것인데 격리수준을 serializable을 사용할지, repeatable read를 사용할지에 대한 고민도 생긴다. serializable을 사용하면 가용성의 저하가 발생하기에 잘 사용하지 않는다. repeatable read를 사용하면 선착순 요구사항을 지키기 어렵다. (먼저 신청한 A는 실패했는데 B는 성공할 가능성이 있음) 그리고 Redis를 사용하는 방법 싱글쓰레드인 Redis를 사용하면 ..

BuySell - 선착순 쿠폰발급

동시성 제어 기능을 구현하기 위해 우리 프로젝트에서 어떤 내용으로 동시성 제어를 해볼까 고민하다가 선착순 쿠폰발급 기능을 추가하게 되었다. 쿠폰의 혜택이 좋을수록 트래픽이 몰리게 될 것이고 순차적인 발급을 위해 좋은 주제인 것 같다. 일단 현재 임시적으로 요구사항을 정해보았다. 쿠폰번호 제약 사항 16자리 영문 + 숫자 영문은 대문자만 입력 가능 사용가능 여부 available = Boolean 설정 쿠폰에 사용자 정보 입력 (사용한 id 확인) 쿠폰 지급받은 계정만 사용 가능 쿠폰 사용기한 추가 쿠폰생성은 어드민만 가능 쿠폰 n개 선착순 발급 n개 이상의 쿠폰이 발급되면 안됨 트래픽이 몰렸을 때 다른 웹페이지의 속도가 저하되어선 안됨 일단 쿠폰을 생성하는 코드를 작성해보았다. @Service class..

Buysell - 별점기능 구현(2)

이전에 사용하던 별점 통계내는 쿼리가 잘못되었다. 판매자의 게시글에 대한 리뷰의 평점을 종합해서 받아오게 작성하면 되는 상황이었는데, 이전 쿼리는 상대방의 id에 바로 평점을 부여하는 방식이라 서비스 코드가 제대로 작동이 되질 않았다. @Query ("SELECT AVG(r.rating) FROM Review r WHERE r.post.member.id = :memberId") override fun createReview( postId: Int, request: CreateReviewRequest, principal: UserPrincipal ): MessageResponse { val post = postRepository.findByIdOrNull(postId) ?: throw ModelNotFou..

BuySell - 별점기능 구현

내가 처음에 생각했던 별점기능은 진짜 별거없이 금방 끝낼것 같았는데 검색해보니 좀 복잡해보인다. 깊게 생각 안해서 일어난 일인듯... 내가 생각했던 방식은 float으로 게시물에 대한(정확히 말하자면 판매자의 별점) 별점 등록하기 (애초에 이거부터가 글렀음) 값을 평균내서 판매자 별점에 반영하기 이거 였는데 지금 생각해보면 되겠나 싶다. front에서 생각해보면 평점을 등록할 때 별 몇개를 준다거나 그런식으로 점수를 부여할텐데 단순히 소수점 한자리까지만 표현하자는 생각으로 float을 사용하게 됨 별점은 1에서 5까지 소수점이 없는 정수로 선택 그 값을 평균낼땐 float 형태가 되어야함 member와 별점을 어떻게 연관지을지 생각도 해야하고.. @Schema(description = "리뷰를 작성할 때..

최종프로젝트 (BuySell) 중고거래 플랫폼 서비스

벌써 최종프로젝트 주차가 찾아왔다. 저번주부터 시작이었는데, 너무 바빠서 TIL 올릴 시간이 없었다. (핑계임) 프로젝트 기획을 두 번 하게 되었다.... 첫 기획은 카카오지도 API를 이용한 배낭여행 코스추천 서비스였다. 안해본 지도API 기능을 사용해 무언가 만들고자 했던게 굉장히 재밌어보였는데, 까고보니 프론트였다 지도API를 사용을 부수적인 기능으로 두고, 백쪽을 조금 더 이용하기 편하게 지도API를 사용하려고 했으나 사실 지도API를 의존하는 서비스 형태가 되어버려서 엎고 새로 기획하게 됬다. 중고거래 플랫폼 BuySell 약 3달간의 커리큘럼에서 배운 내용을 모두 사용할 수 있는게 아무래도 게시판 혹은 쇼핑몰 형태의 서비스라고 생각되었다. 주제가 조금 진부할 수 있으나, 우리는 백엔드 공부를 ..

Redis와 Cache 정리글 (수정 전)

레디스 key:value 형태 쿼리가 아닌 커맨드 기반 비관계형 데이터베이스 (NoSQL) in memory cache disk가 아닌 memory에 데이터를 저장(속도가 빠른 대신 휘발성) single threads 사용 (동시성 관련해서 스프링부트보다 관리가 더 편할 수 있음) 자료구조, 명령어는 공식문서 참고해라 레디스를 사용할땐 어떤 비즈니스 요구사항에서 어떤 데이터를 레디스에 저장할 지를 토대로 적절한 자료구조를 고민하자 레디스가 사용될 때 Cache 저장소로써의 활용 In-memory 구조로 빠르게 동작하면서 다양한 자료구조를 지원 Scale-out 상황에서 중앙 저장소로써의 활용 (대략적으로 이해는 했으나 공부가 더 필요한듯) 레디스는 자체적으로 영속성을 위한 기능을 제공하지만, 영속성을 목..

카테고리 없음 2024.02.23

Oauth2.0 소셜로그인 구현

Oauth 2.0의 4가지 프로토콜 중 Authorization code grant 방식에 대한 정리 글 Authorization Code Grant 권한부여를 하기 위해 자체 생성한 Authorization Code를 전달하는 방식 용어정리 Resource: OAuth Provider로 부터 가져오고자 하는 자원 Resource Owner: Resource의 주인. (사용자) OAuth Provider: 쉽게 말해 소셜로그인 기능이라면 카카오, 구글이 된다 (인증을 담당하는 Authorization Server도 별개로 가지고 있다.) Authorization Server: 인증을 처리해주는 서버 Client: Resource를 사용하기 위해 OAuth Provider에 접근하는 application ..

SpringBoot 2024.02.17

백오피스 프로젝트

🛵배달 시스템 Backend Server 🎁 프로젝트 개요 개발 기간 : 24.01.22 ~ 24.01.29 (1주) 개발 환경 : Kotlin, Spring Boot, Supabase, PostgreSql 프로젝트 이름 : 배달 프로젝트 프로젝트 설명 : 배달 시스템을 모방한 백엔드 시스템 개발 👩 Team B05 오재영 github 역할 - 와이어 프레임, 프로필 관리, 계좌 관리, 인증/인가 박유진 github 역할 - ERD, 가게 CRUD, 메뉴 CRUD 김성현 github 역할 - ERD, 리뷰 / 리뷰 답글 CRUD 윤승환 github 역할 - API 명세, 주문 Flow Chart, 장바구니 / 주문 CRUD 김현득 github 역할 - 가게 CRUD 초안 작성 📚기술스택 Backend S..

뉴스피드 프로젝트 마무리

ReviewUs 프로젝트 소개 소비자들이 사용한 제품, 장소, 서비스 등에 리뷰하여 정보를 공유하는 뉴스피드 웹 서비스를 구현하고자 하였으며,댓글 알바 없는 순수 리뷰 실 사용자 서비스를 만들기 위해 기획했습니다. 팀원 🤝 이동욱 김성현 한정민 이제원 ⚙️ Backend Stack )) 와이어 프레임 구상 API ERD 패키지 구조 뉴스피드 프로젝트 주차 KPT 회고 일시: 2024-01-15 (월) 16시~16시반 (30m) 참석자: 4명 (동욱, 성현, 정민, 제원) 내용: KPT 회고 KEEP 컨벤션이란게 어떤 것이고 팀 개발 활동에서 어떠한 영향을 주는지에 대해서 이해하고 사용했다. 팀 단위로 깃을 사용해보는 경험이 많은 도움이 되었다. 서로 소통을 노력하는 부분이 좋았다. 팀 분위기가 팀 개발 ..