저번 글에서 포인트 적립 기능을 구현하기 전 엔티티를 생성하고 Enum을 생성하는 등의 준비를 마쳤다.
포인트 적립은 게시글을 등록할 때 이루어지기 때문에 service단에서 PointCommonService라고 이름을 지어 여러군데에서 사용되는 코드들을 작성하려고 분리했다.
PointCommonService
@Service
@RequiredArgsConstructor
@Transactional
public class PointCommonService {
private final PointHistoryRepo pointHistoryRepo;
private final PointHistoryDetailRepo pointHistoryDetailRepo;
public Long addPoint(Long userId) {
PointHistory pointHistory = pointHistoryRepo.save(
PointHistory.builder()
.userId(userId)
.amount(3L)
.pointHistoryType(PointHistoryType.REGISTRATION)
.pointStat(PointStat.ACCUMULATE)
.endDt(LocalDateTime.now().plusMonths(2L))
.remarks("게시글 등록 적립")
.build()
);
PointHistoryDetail pointHistoryDetail = pointHistoryDetailRepo.save(
PointHistoryDetail.builder()
.pointHistoryId(pointHistory.getPointHistoryId())
.amount(pointHistory.getAmount())
.userId(pointHistory.getUserId())
.endDt(pointHistory.getEndDt())
.build()
);
pointHistoryDetail.setPointAccumulateId();
return pointHistory.getPointHistoryId();
}
}
포인트 적립이 이루어지려면 PointHistory와 PointHistoryDetail 테이블에 모두 적립 관련 데이터가 삽입되어야 한다.
게시글 등록을 하면 3포인트가 적립되도록 구현했다.
그리고 만료일은 포인트 적립일로부터 2개월로 적용하였다.
여기에서 setPointAccumulateId 메소드에는 포인트 내역 상세 Id 값을 지정한다.
나중에 포인트가 사용되거나 만료될 때 언제, 어떤 적립 포인트에서 소멸된 것인지를 알기 위해서 사용하였다.
BoardService -> 게시글 등록
public BoardResponse insert(Long userId, BoardRequest boardRequest) {
Board board = Board.insert(userId, boardRequest);
boardRepo.save(board);
pointCommonService.addPoint(userId);
return board.convertDto();
}
게시글이 등록되고 포인트도 적립 메소드를 호출하면 포인트 적립이 되는 것을 확인할 수 있다.
point_history
point_history_detail
포인트 적립 기능 구현했으니 이제 다음에는 보유한 총 포인트를 조회하는 코드를 구현해야겠다.
'개발' 카테고리의 다른 글
[개발] Maven 의존성 추가 (0) | 2024.05.28 |
---|---|
[개발] 총 포인트 조회 (0) | 2024.04.17 |
[개발] 포인트 적립 구현 - 1 (0) | 2024.04.15 |
포인트 기능 요구사항 정리 (0) | 2024.04.11 |
[에러] 실행중인 포트 종료하기 (0) | 2024.03.25 |