본문 바로가기
기술 블로그

Project Day 5 : S.A 피드백 수정

by 우 석 2024. 4. 1.

S.A 피드백

  • 포인트는 도메인을 따로 관리하는 게 좋습니다. 객체의 관점에서 point는 User의 상태로 갖는 값은 아닙니다.
  • 또한 포인트를 설계한다면 게시글, 댓글 등 포인트 유입 경로를 통해 어디서 지급받은 내용인지 알 수 있도록 남기면 좋습니다.

 

수정

 

최종 포인트 저장 (pointId, userId, point) → Point 테이블

포인트 기록 테이블(pointId, userId , point , 발생장소log, 생성일) -> PointRecord 테이블

  • 포인트 도메인의 포인트 가감 서비스 메소드 ← 타 도메인에서 포인트서비스를 주입받아서 사용
    • e.g. 게시판에서 사용했다고하면 “POST” → 발생장소는 String 타입


PointServiceImpl.Java

@Service
@RequiredArgsConstructor
public class PointServiceImpl implements PointService {

    private final PointRepository pointRepository;
    private final PointRecordService pointRecordService;
    private final int SIGNUP_REWARD = 1000;
    private final int INITIAL_POINT = 0;

    @Override
    @Transactional
    public void deductPointForPurchase(Long userId, int price) {

        Point userPoint = getPoint(userId);
        int previousPoint = userPoint.getPoint();

        if (userPoint.getPoint() >= price) {
            int newPointBalance = userPoint.getPoint() - price;
            userPoint.update(newPointBalance);

            pointRecordService.createPointRecord(
                userPoint.getId(), previousPoint, -price, userPoint.getPoint()
            );
        } else {
            throw new InsufficientPointException(ErrorCode.INSUFFICIENT_POINT);
        }
    }

    @Override
    @Transactional
    public void rewardPointForSignUp(Long userId) {

        Point signupPoint = Point.createOf(userId, SIGNUP_REWARD);
        pointRepository.save(signupPoint);

        pointRecordService.createPointRecord(
            signupPoint.getId(), INITIAL_POINT, +SIGNUP_REWARD, SIGNUP_REWARD
        );
    }

    @Override
    @Transactional
    public void earnPoint(Long userId, int point) {

        Point userPoint = getPoint(userId);
        int previousPoint = userPoint.getPoint();
        int newPointBalance = userPoint.getPoint() + point;
        userPoint.update(newPointBalance);

        pointRecordService.createPointRecord(
            userPoint.getId(), previousPoint, +point, userPoint.getPoint()
        );
    }

    @Override
    public Point getPoint(Long userId) {
        return pointRepository.findByUserId(userId)
            .orElseThrow(() -> new PointNotFoundException(ErrorCode.POINT_NOT_FOUND));
    }
}

 

deductPointForPurchase(Long userId, int price):

  • 구매에 대한 포인트 차감을 수행,.
  • 사용자의 포인트를 확인하고, 구매 금액보다 충분한 포인트가 있는지 확인.
  • 포인트가 있으면 해당 금액만큼 포인트를 차감하고, 포인트 이력을 기록.
  • 부족한 경우 InsufficientPointException

rewardPointForSignUp(Long userId):

  • 회원가입에 대한 포인트 보상을 수행
  • 회원가입 시 지정된 보상 포인트를 사용자의 포인트로 저장하고, 포인트 이력을 기록.

earnPoint(Long userId, int point):

  • 포인트를 적립 메서드
  • 사용자의 현재 포인트에 지정된 포인트를 추가하고, 포인트 이력을 기록

 

PointRecordServiceImpl.Java

@Override
@Transactional
public void createPointRecord(Long pointId, int previousPoint, int amount, int finalPoint) {
    PointRecord pointRecord = PointRecord.createOf(
        pointId, previousPoint, amount, finalPoint
    );
    pointRecordRepository.save(pointRecord);
}

 

createPointRecord(Long pointId, int previousPoint, int amount, int finalPoint);

  • 포인트 기록 메서드

'기술 블로그' 카테고리의 다른 글

AWS EC2 & IaaS, PaaS, SaaS  (0) 2024.04.13
MySQL Replication 구축  (0) 2024.04.12
MySQL Replication  (0) 2024.04.11
Project Day 4 : 일주일 회고  (0) 2024.03.29
Project Day 1 : 주제 정하기  (2) 2024.03.26