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 |