Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2단계 - 주문 기능 구현] 허브(방대의) 미션 제출합니다. #7

Merged
merged 109 commits into from
Jun 5, 2023

Conversation

greeng00se
Copy link
Member

@greeng00se greeng00se commented May 27, 2023

안녕하세요 카일 😄

이번에 협업 미션에서 리뷰이가 된 허브🌿 라고합니다.

2단계 리뷰 범위입니다! 감사합니다

이번 2단계 주문 기능에서 재화 관련 요소는 쿠폰, 할인을 선택했습니다.
요구사항이 많이 어려워서, 일단 돌아만 가도록 구현을 했습니다.

쿠폰

쿠폰은 아래와 같이 구현하였습니다.
쿠폰은 할인 정책과, 할인 조건을 가지고 있고
할인 조건과 정책이 여러가지 일 경우를 고려하지 않고 하나씩만 가지도록 했습니다.

flowchart RL
    DiscountPolicy --> Coupon
    DiscountCondition --> Coupon
    
    AmountDiscountPolicy --> DiscountPolicy
    PercentDiscountPolicy --> DiscountPolicy
    DeliveryFeeDiscountPolicy --> DiscountPolicy

    MimimumPriceDiscountCondition --> DiscountCondition
    NoneDiscountCondition --> DiscountCondition

DB에 종류 저장, API에 어떤 쿠폰 타입인지 반환하기 위해서
각각의 할인 정책과 할인 조건에 Type Enum을 필드로 가지고 있도록 했습니다.
이 부분에서 고민을 많이 했는데, 말로 설명하지 못하는 약간 애매한 느낌이 많이 들었습니다.
현재의 쿠폰 정책에 관련해서 카일의 의견을 들어보고 싶습니다.

db 구조

image

쿠폰의 경우 정책이나 조건을 따로 저장하지 않고, 하나의 쿠폰 테이블에 저장하도록 했습니다.
(팀원들과 고민을 많이 했었는데, 일단 제일 간단한 방법이라고 생각되었습니다.)

다음 리뷰 요청시 반영 예정

다음 리뷰 요청시에 다음과 같은 부분들을 해보려고 합니다.

  • 인수테스트
  • Fixture 추가
  • README 개선
  • 코드 및 테스트 코드 리팩터링
  • DB Profile 분리(다음주에 팀원들과 같이 AWS에 DB를 설정하기로 했습니다.)

추가적으로 구조에 대해서 고민을 해보다가 궁금증이 더 생긴다면 PR에 남겨놓도록 하겠습니다!
이번 협업 미션동안 잘 부탁드립니다. 감사합니다!!

28일 내용 추가

api 명시 관련해서 안적어놨네요! 일단 프론트랑 정한 명세는 다음과 같습니다!
명세
감사합니다 😄

greeng00se and others added 30 commits May 25, 2023 11:18
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
Co-authored-by: aak2075 <lks971003@gmail.com>
Co-authored-by: wugawuga <dnr3655@naver.com>
@greeng00se
Copy link
Member Author

greeng00se commented Jun 4, 2023

리뷰 범위

안녕하세요 카일!
너무 필요한 리뷰를 많이 남겨주셔서 힘을 내어 리뷰를 반영해보았습니다.

큰 변경사항은 다음과 같습니다.

  1. MemberCoupon 제거
  2. 할인 정책 부분 인터페이스 + 구현체 -> 함수형 인터페이스 + 람다로 변경
  3. CartItem과 OrderItem 분리
  4. cart 패키지와 order 패키지 분리
  5. 인수테스트 추가

변경된 DB 구조는 다음과 같습니다!
image

감사합니다 😄

Copy link

@KIMSIYOUNG KIMSIYOUNG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 허브
리뷰 반영 잘 해주신 것 같습니다.
마지막 미션(?) 여기서 머지하려고 하는데요.
궁금하신 내용이나 더 이야기 나누고 싶은 내용 있으시면, 디엠주시면 같이 논의해보면 좋을 것 같습니다.
고생 많으셨습니다.

import cart.exception.cart.InvalidCartItemOwnerException;
import java.util.Objects;

public class CartItem {

private final Long id;
private final Member member;
private final Long memberId;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

member에서 memberId로 변경된 이유는 무엇인가요? 이 둘을 어떻게 구분하시나요

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Member를 가지지 않아도 된다고 생각했습니다. Member 관련된 비즈니스 로직이 내부에 존재하지 않고, 해당 CartItem의 소유자 확인의 경우 memberId로 충분하다고 생각했습니다!

현재 CartItem을 제외한 다른 클래스를 보면 Member를 가지고 있는게 아닌 memberId를 가지고 있습니다. 따라서 일관성을 이유로 memberId로 변경한 이유도 있습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하 네네 객체를 직접참조하는 것과 아이디를 참조하는 것은 조금 더 고민해보면 좋은 주제인 것 같습니다. 객체지향적인 관점으로 바라보았을 때 객체를 참조함으로써 얻을 수 있는 장점과 객체 그래프를 그릴 수 있다는 장점이 존재하지만, 반대로 단점으로는 불필요한 쿼리가 나갈 수 있고, 의존관계가 강하게 결합된다는 단점도 있을 것 같아요.

전후자에 대한 장단점은 옳다 그르다 또는 이상적이다로 판단하지 않으셨으면 좋겠고, 프로젝트를 진행하면서 어떤 이점을 택하는게 조금 더 개발에 용이할까를 주로 고민해주시면 좋을 것 같습니다.

@FunctionalInterface
public interface CalculateFunction {

Money apply(final Long discountValue, final Money price);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래와 동일한데 클래스로 있는 이유는 네이밍으로 명확하게 보장하기 위함인가요?

private final BiFunction<Long, Money, Money> discountValueCalculator;

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비즈니스 로직과 관련된 함수형 인터페이스를 만드려고 했습니다. 근데 지금보니 네이밍이 별로인 것 같네요 😢
이펙티브 자바의 아이템 44. 표준 함수형 인터페이스를 사용하라를 따라서 BiFunction을 사용하는 게 코드를 보는 입장에서 더욱 빠르게 해당 코드를 이해할 수 있을 것 같습니다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네네🙂 이미 잘 제공되고 있고, 그것에 익숙한 사람이 더 많지 않을까 조심스럽게 추측해봅니다.
물론 허브가 함께하는 사람이 별도의 인터페이스를 정의하는게 더 익숙하신 분들이 많다면 지금 구조가 더 나은 구조이겠지요

.요청_결과_반환();

// then
요청_결과의_상태를_검증한다(요청_결과, 정상_생성);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가독이 좋으시다면 문제없지만 굳이 모두 한글로 작성하지 않아도 괜찮을 것 같네요🙂

  1. IDE지원이 좋지 않음.
  2. 의미는 이해했지만 어떠한 코드를 예상하고 봐야함. (코드만으로 의미를 이해시키며 잘 읽히게 할 수 있다면 그게 더 나을 것 같음)
    의미가 잘 와닿지 않는 부분만 작성해보면 어떨까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확실히 이번에 작성해보면서 IDE 지원이 좋지 않은 걸 느꼈습니다.
시간 효율이 많이 떨어진다는 느낌이 많이 들었습니다.
말씀해주신대로 필요한 부분에 적절하게 한글 메서드를 이용해보는것도 좋을 것 같습니다! 👍

@KIMSIYOUNG KIMSIYOUNG merged commit c9ab539 into woowacourse:greeng00se Jun 5, 2023
include42 pushed a commit that referenced this pull request Jun 5, 2023
* feat: cors 설정

* build: 상품 더미 데이터 추가

* build: utf 8 설정

* build: Spring REST Docs 모듈 추가 (#1)

* feat: 관리자용 장바구니 관리 페이지 추가 (#2)

* test: REST Docs Helper 클래스 추가

* build: asciidoctor 누락 설정 추가

* docs: 장바구니 담기 API docs 작성

* docs: doctype 추가

* feat: 상품 API 문서 추가 (#3)

* chore: 벨리곰 이미지 URL 수정 (#5)

* 응답에 message 추가, 결과 값 result로 포장 (#6)

* test: null 값 수정

* feat: Response 클래스 추가

* feat: CartItemApiController 반환 타입 Response 변경

* feat: ProductApiController 반환 타입 Response 변경

* fix: Response 응답 추가에 따른 테스트 코드 수정

* refactor: 불필요한 생성자 제거 및 빌더 패턴 적용

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* docs: 기능 목록 작성

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문과 관련된 기본 도메인 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 금액 검증 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 포인트 객체 생성

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 수량 검증 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 주문 상품 가격 필드 제거

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 주문 상품 기능 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 가격 필드 타입 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 상품 생성 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 회원 도메인에 포인트 필드 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 도메인 비즈니스 로직 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 주문 상품 도메인에 가격 필드 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 생성자 파라미터 원시값 받도록 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderDao 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderItemDao 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 포인트 파라미터 값 타입으로 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderRepository 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: MemberDao 메서드 명 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: orders, order_item 테이블 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: DAO 메소드 명 수정

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: DAO 조회 반환 타입 Optional로 변경, 코드 리팩터링

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: Spring Validation 의존성 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: PointService 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 회원의 포인트를 조회하는 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderController 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* chore: 코드 서식 정리

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 생성 검증 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* fix: 회원 업데이트 시 포인트도 업데이트 되도록 수정

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: OrderService 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 테스트 코드 수정

- 사용하지 않는 필드 제거
- Transactional 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: MySQL 의존성 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: local, production 환경 분리

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* fix: RowMapper, SQL문 수정 (#7)

* 예외 및 검증 기능 추가 (#8)

* feat: 예외 클래스 추가

* style: 코드 서식 수정

* fix: 예외 로그 수정

* feat: 주문 검증 로직 추가

- 주문 상품이 없으면 예외 발생

* feat: 주문 조회 시 응답 필드 추가

- 대표 상품 이름, 주문 상품 갯수

* chore: dto 패키지 분리

* feat: Request Validation 추가

* test: Request 검증 테스트 추가

* 코드 서식 수정, 상품 생성, 수정 테스트 코드 추가 (#9)

* style: 코드 서식 수정

* refactor: TODO 제거

* test: 상품 생성, 수정 테스트 코드 추가

* docs: 기능 목록 업데이트

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 사용하지 않는 클래스 제거

* refactor: 포인트 배율 상수로 추출

* refactor: PointService 제거, OrderService로 책임 분리

* test: 테스트 코드 DisplayName 수정

* refactor: 인증 처리 로직 리팩터링

* refactor: Dao 메소드 명 수정

* refactor: 패키지 구조 세분화

* feat: PointPolicy 추가

* refactor: 구현체 클래스 infrastructure 패키지로 이동

* refactor: 테스트용 AdminController 삭제

* build: Swagger 의존성 추가

* feat: Swagger 적용

* refactor: PathVariable 명확하게 변경

* test: FixedAmountPointPolicy 테스트 코드 추가

* refactor: AuthInterceptor 스프링 빈 등록 제외, WebMvcConfig에서 AuthProvider 주입 받도록 변경

---------

Co-authored-by: DongUk <68818952+Kim0914@users.noreply.github.com>
Laterality pushed a commit that referenced this pull request Jun 8, 2023
* feat: cors 설정

* build: 상품 더미 데이터 추가

* build: utf 8 설정

* build: Spring REST Docs 모듈 추가 (#1)

* feat: 관리자용 장바구니 관리 페이지 추가 (#2)

* test: REST Docs Helper 클래스 추가

* build: asciidoctor 누락 설정 추가

* docs: 장바구니 담기 API docs 작성

* docs: doctype 추가

* feat: 상품 API 문서 추가 (#3)

* chore: 벨리곰 이미지 URL 수정 (#5)

* 응답에 message 추가, 결과 값 result로 포장 (#6)

* test: null 값 수정

* feat: Response 클래스 추가

* feat: CartItemApiController 반환 타입 Response 변경

* feat: ProductApiController 반환 타입 Response 변경

* fix: Response 응답 추가에 따른 테스트 코드 수정

* refactor: 불필요한 생성자 제거 및 빌더 패턴 적용

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* docs: 기능 목록 작성

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문과 관련된 기본 도메인 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 금액 검증 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 포인트 객체 생성

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 수량 검증 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 주문 상품 가격 필드 제거

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 주문 상품 기능 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 가격 필드 타입 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 상품 생성 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 회원 도메인에 포인트 필드 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 도메인 비즈니스 로직 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 주문 상품 도메인에 가격 필드 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 생성자 파라미터 원시값 받도록 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderDao 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderItemDao 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: 포인트 파라미터 값 타입으로 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderRepository 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: MemberDao 메서드 명 변경

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: orders, order_item 테이블 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: DAO 메소드 명 수정

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: DAO 조회 반환 타입 Optional로 변경, 코드 리팩터링

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: Spring Validation 의존성 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: PointService 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 회원의 포인트를 조회하는 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 기능 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: OrderController 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* chore: 코드 서식 정리

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* feat: 주문 생성 검증 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* fix: 회원 업데이트 시 포인트도 업데이트 되도록 수정

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: OrderService 테스트 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* test: 테스트 코드 수정

- 사용하지 않는 필드 제거
- Transactional 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: MySQL 의존성 추가

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* build: local, production 환경 분리

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* fix: RowMapper, SQL문 수정 (#7)

* 예외 및 검증 기능 추가 (#8)

* feat: 예외 클래스 추가

* style: 코드 서식 수정

* fix: 예외 로그 수정

* feat: 주문 검증 로직 추가

- 주문 상품이 없으면 예외 발생

* feat: 주문 조회 시 응답 필드 추가

- 대표 상품 이름, 주문 상품 갯수

* chore: dto 패키지 분리

* feat: Request Validation 추가

* test: Request 검증 테스트 추가

* 코드 서식 수정, 상품 생성, 수정 테스트 코드 추가 (#9)

* style: 코드 서식 수정

* refactor: TODO 제거

* test: 상품 생성, 수정 테스트 코드 추가

* docs: 기능 목록 업데이트

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>

* refactor: OrderItem builder 패턴 적용

* refactor: Order builder 패턴 적용

* refactor: Member builder 패턴 적용

* refactor: Member builder 패턴 적용

* fix: LocalDateTime 테스트 확인 메서드 변경

* refactor: Request 클래스 명 변경

* refactor: 사용하지 않는 어노테이션 삭제, 클래스 명 변경

* feat: 장바구니를 찾을 수 없는 경우 예외 상황 핸들링 추가

* refactor: API 응답 클래스 명 변경

* refactor: 포인트 사용 시 잔여 포인트 확인 메서드 회원 클래스로 이동

* refactor: Member, CartItem 클래스 빌더 제거

* refactor: Order, OrderItem, Product 클래스 빌더 제거

* refactor: 컨트롤러 반환 타입 구체적으로 명시

* refactor: 테스트 메서드 명 및 Location 검증 추가

* refactor: DB에서 ID 가져올 시 Long 타입으로 가져오도록 변경

---------

Co-authored-by: seokjin8678 <seokjin8678@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants