Code Monkey home page Code Monkey logo

unique-auction's Introduction

unique-auction :)

한정판 거래 플랫폼 Unique Auction

StockX와 국내 KREAM를 벤치마킹한 한정판 거래 플랫폼

Unique Auction은 Springboot, Mysql, JPA, Docker, Kafka, Redis, Scouter 기술스택을 사용하여 만들어진 프로젝트입니다. 패키지는 DDD 계층 구조를 따르고 있으며, 객체 지향 원칙을 준수하기 위해 노력했습니다. Spring Boot와 JPA를 사용하여 백엔드를 개발하였으며, MySQL을 데이터베이스로 사용합니다. 또한 Docker를 활용해 컨테이너화하고 Kafka와 Redis를 사용하여 메시지 큐와 세션 기능을 구현했습니다.

01. Team convention

팀 협업을 위한 프로젝트 관리 규약
Team convention 바로가기

02. API Guide

API 가이드 문서
API Guide 바로가기

03. Structure

프로젝트 아키텍처


서버 구성도


04. Monitoring

성능 측면에서는 Scouter를 사용하여 애플리케이션 모니터링을 진행하고, Ngrinder를 사용하여 가상 유저 1800명으로 부하테스트를 수행했습니다. groovy로 작성된 스크립트를 사용해 부하테스트 코드를 작성했습니다. 이를 통해 자동화된 부하테스트를 더 쉽고 빠르게 수행할 수 있습니다. 테스트 진행은 핵심 로직인 특정 상품에 대한 구매와 판매 거래 체결에 대한 부하 테스트를 진행했습니다. 결과적으로 총 Test Count 31,000 / TPS 1,170 / Peak TPS 2,200 / Error 260의 결과를 얻었습니다. 요청 처리율 99.2%에서 100%로 보장할 수 있도록 성능 병목현상을 찾아내고 최적화 작업을 진행할 계획입니다!



05. Use case

유스케이스
Use case 바로가기


06. UI Prototype

UI 프로토타입 카카오 오븐
카카오 오븐 바로가기

unique-auction's People

Contributors

f-lab-bot avatar f-lab-lion avatar superkkj avatar vymr1000 avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

vymr1000

unique-auction's Issues

[Feature] docker compose 에서 서비스 실행하지 않기.

목표

application을 로컬에서 실행하기 위애 의존성있는 인프라가 구축되어 있어야 합니다.
실제 운영환경을 생각해보면 이미 인프라가 모두 갖춰져 있는 상태에서 변경된 소스코드로 빌드된 에플리케이션을 배포합니다.

이와 같은 구조를 만들어 주기 위해서 로컬에서 실행하는 docker compose 파일에는 의존성이 있는 인프라(mysql)만 만들어 줍니다.
에플리케이션 실행은 IDE에서 run, debug 기능을 통해서 실행해 줍니다.

개발 편의성에서도 차이가 납니다. build, docer restart할 필요가 없어집니다.

as-is:
로컬에서 build -> docker 재실행 -> postman 등으로 테스트 -> 코드수정 -> (반복) build -> docker 재실행
to-be:
docker 실행 -> run (debug) -> -> postman 등으로 테스트 -> 코드수정 -> rerun (debug)

방법

docker compose 에서 application: 부분 제거

[Feature] Trade 및 UserService 로직 강화

목표
Trade 및 UserService 로직 강화

방법
Trade 및 UserService 로직 강화

  • 거래시 발생할 수 있는 데이터 정합성의 문제를 해결한다
  • 사용자 회원가입시 발생할 수 있는 동시성 문제에 대해 로직을 강화하도록 한다.

[BUG] base엔티티 상속이 아닌 컴포지션으로 변경

Describe the bug

현재 상속으로 베이스 엔티티가 구현 되있다
허나 상속의 문제점으로 다중상속이 안됀다던지 만약
부모 클래스 변경으로인해 하위클래스 전부 변경이일어나는듯
문제점이 많아서 이를
컴포지션으로 구현을 다시해 상속에 대한 문제점을 해결한다.

To Reproduce

  1. Extennd 된 코드들을 embeded 코드로 변경

[Feature] profile 분리하기

목표

로컬환경과 운영환경으로 분리한다.

방법

  • application.yml -> defalut value
  • application-local.yml -> 로컬실행환경
  • application-release.yml -> 운영환경

[Feature] 동시성 이슈 어플리케이션 로직에서처리.

목표

현재는 유니크 키를 주고 동시성 문제를 처리하는데 비용이 많이든다

애플리케이션 코드선에서 처리하는법으로 한다.

방법

자료를 좀더 찾아봐야겠지만

멀티스레드 환경에서 Lock 키워드로 문제해결 방향을 잡아야 될거같다.

[BUG] findAll 사용하지 않도록 수정

Describe the bug

findAll()은 db의 모든 데이터를 조회합니다.
특히 시간이 지남에 따라 수가 계속 증가하는 성질이 있는 데이터인 경우.
이 기능은 매우매우 위험 합니다. 절대로 사용하면 안되는 기능입니다.

findAll 없이 기능을 구현해주세요~

[Feature] Github action

목표

github action을 이용햐여 CI 적용

  • test 통과
  • 코드 포멧 체크
  • build

대상

  • 브랜치 : develop, master
  • PR

PR없이 repote에 푸시된 브랜치는 돌아가지 않게 해주세요.

담당자 : @superkkj

[Feature] 상품 CRUD

목표

상품 생성 , 조회 , 변경 , 삭제에 대한 API 를 구현한다.

방법

REST API 규칙을 최대한 지키면서 개발한다.

상품 조회 , 변경 , 삭제 시 상품 ID값을 넘겨주고

조회 , 변경 , 삭제를 한다,

상품 검색을위한 api도 개발한다.

[BUG] ValidationCheckAspect 함수명 변경

Describe the bug

ValidationCheckAspect쪽도 수정 부탁드립니다.

as-is

public void validaiontCheck(ProceedingJoinPoint proceedingJoinPoint) throws Throwable

  • 더 적절한 함수명으로 바꿔주세요. 명사 -> 동사 형태로 되어있어 이름이 매우 어색합니다
  • throws는 필요해 보이지 않습니다.

[Feature] ddl은 docker에서 초기화 하는 용도로만 사용하기

목표
ddl을 spring에서 초기화 하는 용도로 사용하지 않고
docker로 mysql이 올라갈때 실행하는 방식으로 변경하기.

as-is : docker에서 실행된 mysql은 테이블이 하나도 없는 비어있는 상태이고, application 이 실행되면서 초기화 한다.
to-be : docker에서 mysql을 올릴때 ddl을 사용해 초기화한다. application이 실행될때는 이미 만들어져 있는 DB에 붙어서 실행되는 구조.

방법
설정 spring.sql.init.mode 제거.

spring:
  sql:
    init:
      mode: always

[BUG] 이벤트리스너 대체로 다른 방법찾아서 구현하기

Describe the bug

이벤트리스너로 리뷰 등록을 처리 하고 있다

의존성은 약해지지만 코드 구현부분이 복잡해서 다른 방법을 대안을 찾아보자.

이벤트리스너는 의존성을 약하게 하는등 사용이유가 있지만 .
로직 처리후 후속작업을 더해야되는역할? 등 으로 사용되는경우가 더 많은거 같다.

[BUG] user password에 plain text가 들어가는 현상

Describe the bug

JoinRequest -> user로 변형시 plain text가 encodedPassword로 들어갑니다.
이어서 바로 암호화를 한다고하더라도 순간적으로 plain text로 들어가는것은 사실입니다.
개발자의 부주의로 이 데이터를 그대로 사용할수도 있어서 원천 차단할 필요가 있습니다.

return User.builder()
.email(joinRequest.getEmail())
.username(joinRequest.getUsername())
.encodedPassword(joinRequest.getPassword())
.phone(joinRequest.getPhone())
.role(requestRole)
.build();

[BUG] 리뷰 등록 안되는 현상

Describe the bug

리뷰등록 api 동작하지않음

To Reproduce

재현하기 위한 스텝을 상세히 기록해 주세요
POST http://localhost:8080/reviews

{
    "userId": 1123,
    "productId": 1,
    "score": 1,
    "content": "일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십일이삼사오륙칠팔구십"
}

etc

2022-11-11 16:40:26.486 ERROR 19830 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.uniqueauction.web.review.request.SaveReviewRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.uniqueauction.web.review.request.SaveReviewRequest (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

2번째 이슈

위 이슈가 해결되었다고 가정하더라도 아래 이슈가 발생합니다.
유저가 없는경우 response가 아래처럼 출력됩니다.

{
    "success": false,
    "error": {
        "errorCode": "not_found_user",
        "errorMessage": "가입하지 않은 이메일이거나 잘못된 비밀번호입니다."
    }
}

유저의 id나 password를 입력하지 않았기때문에 적절하지 않습니다.

[Feature] 상품 도메인 설계 - 엔티티 개발

목표
어떤 내용을 개발할지 적어주세요.

방법
목표를 이루기 위한 해결 방법을 대략적으로 설명 해주세요.
->

  • domain 엔티티를 개발.
  • 추가로 필요한 enum이 있으면 개발.
  • repository 까지만 추가. (함수는 추가안함)

대안
위 방법 외에 대안이 있으면 작성해주세요.

주의사항
해결 과정에서 주의해야할 사항이 있다면 작성해주세요.

etc
추가적으로 알아야할 내용을 작성해주세요.

[Feature] 상품 리뷰 등록 & 조회 api

목표

  • 유저가 상품에 대한 리뷰를 등록하는 api
  • 유저가 내가 남긴 리뷰를 모아 볼 수 있다. -> 유저별 리뷰 조회 api
  • 상품에 대한 리뷰 조회가 가능하다 -> 상품조회시 리뷰 정보까지 response로 내려주도록 변경

이번 작업단위가 너무 크다고 생각하는 경우 다른 issue로 나누어 작업해주세요

[Feature] test profile 분리하기

목표

로컬환경과 운영환경으로 분리한다.

방법

  • application.yml -> defalut value
  • application-test.yml -> ci 등 test contianer로 동작하는 환경
  • application-localtest.yml ->로컬에서 docke compose로 환경을 만들어둔 상태로 테스트 실행

[BUG] 구매 불가능한현상

Describe the bug

구매등록 validation 실패하는 현상

To Reproduce

재현하기 위한 스텝을 상세히 기록해 주세요
POST http://localhost:8080/purchase

{
    "userId": 1123,
    "productId": 1123,
    "size": 1,
    "productSize": "1",
    "bidPrice": "1000",
    "shippingAddress": "1adsf"
}

Expected behavior

200 ok

error log

2022-11-11 16:34:47.296 ERROR 19830 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Long'. Check configuration for 'productId'] with root cause

[Feature] 벨리데이션 어노테이션 공통으로 통합작업

목표
기존 이메일 폰 어노테이션등 어노테이션을 각 파라미터마다 따로만들어주는대
이를 하나로 통합해서 중복코드를 줄이고 한개의 커스텀 벨리데이션으로 여러 필드들을 관리할 수 있다

방법
enum으로
벨리데이션 메세지 , 정규식등을 추가해주고 커스텀어노테이션에 필요한값을 넣어주는식으로해서
중복을 줄인다.

로그인

관련된 이슈 번호

  • issue : #8

요약

  • 로그인 API 구현
  • 로그인 서비스 구현 및 테스트 코드 작성

변경사항 (할 일)

  • API 테스트 코드 작성
  • 필드값에 대한 validation
  • 예외처리 방안
  • session 기능 적용

[BUG] github action에 job 이름변경

to @superkkj

Describe the bug
github action에서 job이름이 설정되어 어떤 기능이 성공/실패 했는지 명확하게 알 수 있어야한다.

todo
job1, job2 처럼 되어있는 네이밍 변경

Screenshots
스크린샷 2022-10-23 오전 1 49 31

[Feature] 클라우드 환경 구축

목표

애플리케이션 클라우드 환경 구축

방법

네이버 클라우드 플랫폼(NCP) 를 활용하여 애플리케이션 및 데이터베이스 시스템 환경을 구축한다.

  • 애플리케이션용 app-server 구축
  • DB용 db-server 구축

[Feature] 회원가입 - sample

목표
회원가입

방법
user insert

주의사항
해결 과정에서 주의해야할 사항이 있다면 작성해주세요.

  • 권한설정을 user만 해야함.

etc
추가적으로 알아야할 내용을 작성해주세요.

[Feature] service layer 소스코드가 request에 의존하는 현상 수정하기

목표

user service 등 service layer에서 request 객체를 그대로 사용하고있습니다 (=의존하고 있습니다)
지금 상태로는 api 인터페이스의 변경이 일어나면 service레이어의 소스코드도 수정되어야합니다.
이런 변경에도 service 레이어의 소스코드가 변경되지 않도록 의존성 관리를 해주세요~

@Transactional
public void join(JoinRequest joinRequest) {
User user = joinRequest.convert(joinRequest);
if (!existsByEmail(user.getEmail())) {
user.setEncodedPassword(encryptService.encrypt(joinRequest.getPassword()));
} else {
throw new CommonException(DUPLICATE_USER);
}
userRepository.save(user);
}

방법

@vymr1000 님이 고민해서 수정해주세요

[BUG] 회원가입 api 동작하지 않는 현상 & password 검증오류

Describe the bug

  1. 회원가입 안되는 현상
  2. 이 현상을 수정하더라도 password 양식이 맞지않아 회원가입이 안된다고하네요... 길이도늘리고 숫자, 특수문자도 넣었습니다.
    정확한 password 룰이 무엇인지 알려주세요

To Reproduce

POST http://localhost:8080/users

{
    "isAdmin" : false,
    "email" : "[email protected]",
    "password": "helloworld1@",
    "username": "abcd",
    "phone": "01012341234"
}

Expected behavior

2xx or 4xx

Screenshots

  1. 회원가입 안되는현상

image

  1. password 검증

image

[Feature] ncloud 배포환경 만들기

목표

현재 프로젝트를 Ncloud 배포 및 실행한다.

방법

master 브랜치에 푸쉬될경우에만 , ncloud 에 배포되도록

githubAction And Ncloud SourceDeploy(배포,자동실행)기능을 이용한다

[BUG] user join 로직 및 데이터 부정합성 수정

Describe the bug

  1. 현재 로직상 회원가입을하면 유저가 아무도 없는데
    등록이 된다 나온다 , 서비스 쪽 분기 에서 로직이 잘못된거같다.

  2. 유저가 등록을 할시 role 필드에서 0이 저장된다 . JPA 필드처리 관련해서 수정.

etc
Entity field (테이블 클래스) 관련
String 필드가 많아서 익숙한듯 그냥 넘어 가기 쉬운 경우가있다

이넘 필드 같은 경우 우리가 원하는 스트링 데이터가 들어갈 수 있도록 어노테이션을 따로지정해주는듯 ( 지정안해주면 어노테이션 필드 순서인 인트가 들어감)
스트링 필드외에 다른필드 선언시 다른 변수가 없는지 테스트를 하고 체크를해야 된다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.