분류 전체보기 93

BuySell - S3 이미지업로드 (2)

버킷에 이미지 업로드가 정상적으로 작동하는것을 확인했다. 그래서 이제 그 게시글에 대한 이미지인걸 어떻게 찾아서 가지고 올까? 라는 생각을 했다. (이미지 업로드 되면 request에서 쓰려고 imgurl 부분을 주석으로 해놨는데 까먹음) 고민 한 방법들 1. 퍼블릭 URL을 변수로 어딘가에 저장해두고, 프론트에서 input type hidden 을 사용해서 어떻게 어떻게 구현하기 (그냥 생각만 함) 2. 이미지 URL을 백 서버에서 저장 후 관리하는 법 사실 몇가지 더 있었는데, 대부분 프론트에 대한 내용이라 생략했다. 그리고 이해가 안갔음.. 일단 나는 백엔드 공부를 하는 사람이니까.. 당연히 2번을 선택했다. 게시글에 대한 이미지 URL을 저장하는 로직이 없었기 때문에, 이미지 업로드를 시도하면 아..

BuySell - S3 이미지 업로드

S3를 사용해 이미지 업로드 기능을 구현해보려고 한다. S3 버킷을 채택한 이유! 1. 서비스의 가용성 이 거의 100%이다. (서비스를 제공할 수 있는 상태) 2. 저렴한 비용 사용한 만큼 비용을 낸다. 장기간 보관을 하지만 빈도수가 낮은 파일들 (ex: 법적 보관기간 5년 파일)은 타입 저장방식을 달리해 비용 절감이 가능 (파일 access 빈도수에 따라 보호수준을 차등할 수 있고 차별화 된 비용을 지불할 수 있다.) 확장성 AWS가 망하지 않는 한 원하는 만큼 서비스를 사용할 수 있다... 고성능 AWS Region을 선택해 가까운 Region에 데이터를 관리함으로써 네트워크 지연시간을 최소화 할 수 있다. 관련 자료의 양 AWS cloud 서비스에 대한 자료의 양이 많기에 문제 해결이 보다 쉬울 ..

BuySell - 선착순 쿠폰 발급기능 (3)

전에 고민했던 발급 과정을 변경하기로 했다. 미리 생성해 둔 쿠폰을 발급하는 방법이 아닌, 쿠폰 발급 요청이 들어오면 생성하고 발급하는 방법으로 변경했다. 쿠폰을 생성 후 발급하는 방법은 쿠폰이 필요한 시점에서 생성이 되기 때문에 불필요한 쿠폰을 생성하는 것을 방지할 수 있고, 현재 제약사항에 쿠폰의 만료기한 기능이 있기때문에 발급시점에서 관리를 하게 된다면 조금 더 유연하게 쿠폰을 관리할 수 있다고 생각했다. 그리고 이미 Redis를 적용해 동시성 제어를 사용하려했기 때문에, 생성과 발급을 동시에 처리하는게 프로젝트에서 추구하는 방향성이 맞다고 생각한다. Redis를 사용한 동시성 이슈를 학습했던 내용을 적용시켜서 코드를 작성해봤다. RedisCouponRepository @Repository clas..

nGrinder - 스크립트 작성하기

일단 나는 kotlin을 사용중인데, Groovy가 뭔지 모르는 사람임.. 부하 테스트를 하기 위해서 Groovy 스크립트로 작성되어야 한다는데 무슨말인지 몰라서 한참을 찾았다. nGrinder에서 kotlin을 직접 실행을 지원하지 않는다. 코틀린 코드로 테스트를 하기 위해선 Groovy 스크립트를 사용해야한다. (ㅅㅂ) 스크립트를 작성하기 위해서는 1. 테스트 할 해당 서비스의 엔드포인트를 알아야한다. 2. 스크립트를 작성한다 (어캐씀?) 3. 스크립트를 검증 후 실행한다.... 이 스크립트가 자바코드로 되어있어서 아직 나는 자바코드를 작성하는법을 모르기 때문에.. 지피티에게 내 테스트코드를 변환해달라고 맡겼다. 분명 코틀린을 배우고 있는데, 자바 코드를 더 많이보는 것 같다.. 빨리 자바 공부해야지..

Setting 2024.03.24

nGrinder 설정하기

선착순 쿠폰기능을 구현을 완료했다. 테스트 케이스는 모두 성공을 했는데, 이제 실제 환경과 비슷하게 설정을 해 부하테스트를 해보려고 한다. 그러기 위해서 nGrinder 설치 및 설정을 해야하는데 이게 꽤 헷갈려서 기록해두려고 한다. 현재 nGrinder 최신버전은 3.5.9버전이다. nGrinder 다운로드 링크 (네이버 Github으로 접속한다.) https://github.com/naver/ngrinder?tab=readme-ov-file GitHub - naver/ngrinder: enterprise level performance testing solution enterprise level performance testing solution. Contribute to naver/ngrinder ..

Setting 2024.03.24

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 = "리뷰를 작성할 때..