내일배움캠프 프로젝트 14

BuySell - 최종 프로젝트 종료

BuySell https://www.notion.so/40-Four-T-46a46435ffb44c168c20e25ad82f7da7 40 (Four T) | Notion ‼ 회의 요약 💬 &피드백 모음💜 band-wavelength-b24.notion.site 목차 프로젝트 소개 팀소개 프로젝트 계기 주요기능 개발기간 기술스택 서비스 구조 와이어프레임 API 명세서 ERD 프로젝트 파일 구조 기술적 의사결정 Trouble Shooting 프로젝트 소개 중고 거래 플랫폼으로 개인 간의 중고 거래를 더욱 쉽게 접근할 수 있게 매칭해주는 게시판 형태의 서비스입니다. 중고 물품을 판매하는 글을 작성할 수 있고 구매자가 구매 요청을 하면 판매자와 구매자가 매칭 됩니다. 팀소개 팀장 부팀장 팀원 팀원 김성현 황승현 ..

BuySell - 주문 조회

구매한 상품에 대한 리뷰와 평점을 남길 수 있는 로직이 구현되었다. 이제 마이페이지에서 주문내역을 조회 후 리뷰를 작성할 수 있게 주문조회 기능을 구현중인데, 현재 정책상 삭제된 게시물에도 리뷰를 작성할 수 있게 되어있다. 그러나 주문조회 시 softDelete가 true인 게시물을 조회할 수 없는 에러가 발생했다.. soft delete된 데이터를 조회하기 위해서 3가지의 방법이 있다. JPQL등에서 직접 처리하기 실무에서는 다양한 상황들이 나타나기 때문에 모든 상황을 직접 다룰 수 있게 JPQL을 사용하는 것을 권장드립니다. 참고로 실무에서는 대부분의 조회 쿼리가 단순하지 않기 때문에 JPQL을 자주 사용하게 됩니다. 하이버네이트 @Filter 대안으로는 하이버네이트 @Filter를 사용할 수 있는데..

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..

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달간의 커리큘럼에서 배운 내용을 모두 사용할 수 있는게 아무래도 게시판 혹은 쇼핑몰 형태의 서비스라고 생각되었다. 주제가 조금 진부할 수 있으나, 우리는 백엔드 공부를 ..