Coder Social home page Coder Social logo

shop-n-save's Introduction

shop-n-save 🛒

다양한 상품을 거래할 수 있는 쇼핑몰 프로젝트입니다. 이커머스 기업 쿠팡을 모티브로 제작하였습니다.


프로젝트 목표

해당 프로젝트는 대규모 트래픽이 발생하는 환경을 전제로 확장 및 유지 보수성이 좋은 코드를 작성하기 위해 노력한 프로젝트입니다.
본 프로젝트는 View를 사용하지 않고 REST 아키텍처 기반으로 서비스 API를 구현하였기 때문에
예상하고 의도했던대로 코드가 정확히 동작하는지 파악하기 위한 테스트 코드 작성 또한 중요합니다.
어떻게하면 더 좋은 테스트를 작성할 수 있을지 고민하며 지속적인 개선을 통해 보완하는 것을 목표로 합니다.

사용기술

Spring Boot, MySQL, Mybatis, Redis

브랜치 관리 전략

Git-Flow 전략을 사용하였습니다.
master : 사용자가 사용하게 될 코드가 있는 브랜치입니다.
release : 제품의 배포를 준비하는 브랜치입니다. 충분한 테스팅 과정이 이루어집니다.
develop : 기능 개발 완료 후 코드 리뷰를 마친 코드가 Merge됩니다.
feature : 기능 개발을 위한 브랜지입니다. feature/이슈번호로 관리됩니다.
hotfix : 서비스 운영 중 발생한 버그를 처리하는 브랜치입니다.


프로토타입 👀

image 프로토타이핑 툴 '카카오 오븐'을 사용하였습니다.

shop-n-save's People

Contributors

baesuyeon avatar sgkim94 avatar

Watchers

 avatar  avatar

shop-n-save's Issues

로그인 기능 구현

기능

  • 로그인

시나리오

  • 사용자가 회원가입한 계정을 토대로 로그인을 시도한다.

Given

  • 사용자는 회원가입한 아이디 정보와 비밀번호 정보를 가지고 있다.

When

  1. 올바른 정보의 아이디와 비밀번호로 로그인을 시도한다.
  2. 올바르지 않은 아이디와 비밀번호로 로그인을 시도한다.

Then

  1. 정상적으로 로그인이 되어 세션에 사용자 정보를 저장 후 성공 내용을 전달한다.
  2. 사용자 정보를 찾을 수 없어 검증에 실패하여 로그인 실패 내용을 전달한다.

결제 기능

기능

  • 결제 기능

시나리오

  • 로그인한 사용자가 진행한 주문에 대한 결제를 진행한다.

Given

  • payment request dtoorder_id를 가진다.
  • 주문 금액은 Ordertotal price와 일치해야 한다.
  • 주문 상태가 WAITING_PAYMENT 인 주문에 대해서만 결제를 진행할 수 있다.
  • 주문 상태가 변경된다.(WAITING_PAYMENT -> PREPARING_DELIVERY)
  • 결제는 [결제 대기, 결제 완료] 중 한 상태를 가진다.
  • 결제시 [결제 완료] 상태를 가진다.

로그아웃 기능

기능

  • 로그아웃 기능

시나리오

  • 사용자가 로그아웃을 시도한다.

Given

  • 로그인이 되어있는 사용자여야 한다.

When

  • 로그인이 되어있는 사용자가 로그아웃을 시도한다.

Then

  • 로그아웃에 성공한다.

상품 클래스 리팩토링

[1] 패키지 구조 변경(도메인형)
[2] @builder 어노테이션을 클래스 대신 생성자에 추가
[3] 기본 생성자 접근 제어자(PRIVATE)
[4] 상품 수정 메서드 변경(DIP, 메서드 명 수정)
[5] 상품 생성, 변경시 카테고리 필드 추가

  • 상품은 최하위 카테고리에만 생성 가능

프로젝트 생성

프로젝트 구성

  • Spring Boot 2.4.2
  • JPA / Hibernate
    • JPA 란 EJB3.0 에서 Hibernate를 기반으로 만들어진 새로운 자바 ORM 기술 표준
    • 생산성
      • 반복적인 CRUD 가 사라진다.
    • 유지보수
      • SQL 은 빌드를 추가하면 모든 쿼리가 변경되지만, JPA 는 엔티티 필드만 추가해주면 된다.
    • 패러다임 불일치 해결
    • 성능
      • JPA 는 애플리케이션과 데이터베이스 사이에서 동작한다. 이렇게 애플레케이션과 데이터 베이스 사이에 계층이 하나 더 있으면 최적화 관점에서 시도해 볼 수 있는 것들이 많다.
      • 만약 똑같은 SELECT 가 2번 있다면 JDBC API 는 데이터베이스와 두번 통신했을 것인데, JPA 는 사용하면 한 번만 데이터베이스에 전달하고 두 번째는 조회한 회원 객체를 재사용한다.
      • SQL 힌트를 넣을 수 있는 기능도 제공한다.
    • 데이터 접근 추상화와 벤더 독립성
    • 자바 진영의 ORM 기술 표준
  • Gradle

문서

  • Google docs
  • Kakao oven

Convention

상품 생성/조회/수정/삭제 기능

기능

  • 상품 생성/조회/수정/삭제 기능

1. 상품 생성 시나리오

  • 판매자/관리자가 상품 생성 기능을 시도한다.

Given

  • 판매자/관리자 권한이 있어야 한다.

When

  1. 판매자/관리자 권한이 없는 사용자가 상품 생성 기능을 시도한다.
  2. 판매자/관리자 권한이 있는 사용자가 상품 생성 기능을 시도한다.

Then

  1. 판매자/관리자 권한이 없는 사용자는 상품 생성 기능 권한이 없어 실패 내용을 전달한다.
  2. 상품이 생성된다

2. 상품 수정/삭제 기능 시나리오

  • 판매자가 본인이 생성한 상품의 수정/삭제 기능을 시도한다.
  • 관리자가 상품 수정/삭제 기능을 시도한다.

When

  1. 판매자가 본인이 생성한 상품의 수정/삭제 기능을 시도한다.
  2. 판매자가 타인이 생성한 상품의 수정/삭제 기능을 시도한다.
  3. 관리자가 상품의 수정/삭제 기능을 시도한다.

Then

  1. 상품 정보가 상품의 수정/삭제된다.
  2. 상품 수정/삭제 권한이 없어 실패 내용을 전달한다.
  3. 상품 정보가 상품의 수정/삭제된다.

3. 상품 조회 기능 시나리오

  • 상품 조회 기능을 시도한다.

When

  1. 상품 조회를 시도한다.

Then

  1. 상품 정보가 조회된다.

회원가입 기능 구현

기능

  • 회원가입

시나리오

  • 사용자가 서비스 이용을 위해 회원가입을 시도

Given

  • 사용자는 본인이 서비스에 사용할 이메일과 비밀번호 정보를 가지고 있다.

When

  1. 이메일, 비밀번호 정보를 가지고 회원가입을 시도한다.
  2. 올바르지 않은 이메일 형식을 입력하여 회원가입을 시도한다.
  3. 이미 가입된 이메일로 회원가입을 시도한다.

Then

  1. 서비스 회원으로 등록된다.
  2. 올바르지 않은 이메일 형식이라고 오류를 리턴한다.
  3. 이미 가입된 사용자로 오류를 리턴한다.

회원 정보 생성/수정/조회 기능 리팩토링

리팩토링 항목

  • 자바 코드를 사용해서 SQL 구문을 생성하는 대신 XML 사용
  • 회원 정보에 address 추가
  • 회원정보 수정기능 수정
  • 패키지 구조 변경
  • Controller 필수값 파라미터 primitive type 사용
  • email 컬럼 unique index로 수정

회원 정보 수정/조회 기능

기능

  • 회원 정보 수정/조회 기능

시나리오

  • 사용자가 회원 정보 수정/조회 기능을 시도한다.

Given

  • 로그인이 되어있는 사용자여야 한다.
  • 로그인한 사용자의 email과 회원 정보를 수정/조회하려는 대상의 email이 같아야 한다.

When

  1. 로그인이 되어있지 않은 사용자가 회원 정보 수정/조회 기능을 시도한다.
  2. 로그인한 email과 다른 회원의 정보를 수정/조회 기능을 시도한다.

Then

  1. 로그인이 되어있지 않은 사용자는 회원정보 수정/조회 권한이 없어 실패 내용을 전달한다.
  2. 타 사용자 정보의 수정/조회 권한이 없어 실패 내용을 전달한다.

주문 기능

기능

  • 주문 기능

시나리오

  • 로그인한 사용자가 특정 상품을 주문한다.

Given

  • 주문은 [결제 대기, 배송 준비, 배송중, 배송완료, 취소] 중 한 상태를 가진다.
  • 회원은 주문 생성(place), 결제(pay), 주문 취소(cancle), 상태 조회(getStatus), 전체 가격 조회(getTotalPrice) 기능을 수행할 수 있다.
  • 주문 항목 1개 이상을 주문할 수 있다.
  • 주문 항목의 수량은 1 이상이어야 한다.
  • 주문하려는 상품이 시스템 내 존재해야 한다.
  • 주문 생성시 [결제 대기] 상태를 가진다.
  • [배송중, 배송완료, 취소] 상태의 주문은 취소할 수 없다.

멤버 클래스 리팩토링

[1] 전화번호 필드 추가
[2] @builder 어노테이션을 클래스 대신 생성자에 추가
[3] 생성자 대신 정적 팩토리 메서드 사용(AuthMember.java)

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.