본문 바로가기
개발

[개발] 포인트 적립 구현 - 1

by 공덕뉸나 2024. 4. 15.

포인트 기능 중에 게시글 등록을 하면 3포인트를 적립 해주는 코드를 우선 구현해보려고 한다.

 

PointHistory

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class PointHistory extends BaseEntity implements Serializable {

    @Serial
    private static final long serialVersionUID = -7094631532990738540L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "point_history_id", columnDefinition = "bigint COMMENT '포인트 히스토리 아이디'")
    private Long pointHistoryId;

    @Column(name = "user_id", columnDefinition = "bigint COMMENT '사용자 아이디'")
    private Long userId;

    @Column(name = "amount", columnDefinition = "bigint COMMENT '포인트 점수'")
    private Long amount;

    @Enumerated(EnumType.STRING)
    @Column(name="history_type", columnDefinition = "varchar(50) COMMENT '타입(사용경로)'")
    private PointHistoryType pointHistoryType;

    @Enumerated(EnumType.STRING)
    @Column(name="point_stat", columnDefinition = "varchar(50) COMMENT '유형'")
    private PointStat pointStat;

    @Column(name="end_dt", columnDefinition = "datetime COMMENT '포인트 만료일'")
    private LocalDateTime endDt;

    @Column(name="remarks", columnDefinition = "text COMMENT '비고'")
    private String remarks;
}

PointHistoryDetail

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class PointHistoryDetail extends BaseEntity implements Serializable {

    @Serial
    private static final long serialVersionUID = 1195172057493790077L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "bigint not null comment '포인트 내역 상세 아이디'")
    private Long pointHistoryDetailId;

    @Column(columnDefinition = "bigint COMMENT '사용자 아이디'")
    private Long userId;

    @Column(columnDefinition = "bigint COMMENT '이용된 포인트'")
    private Long amount;

    @Column(columnDefinition = "bigint COMMENT '포인트 적립 아이디(포인트 내역 상세 아이디)'")
    private Long pointAccumulateId;

    @Column(columnDefinition = "datetime COMMENT '포인트 만료일'")
    private LocalDateTime endDt;

    @Column(columnDefinition = "bigint COMMENT '포인트 내역 아이디'")
    private Long pointHistoryId;

    public void setPointAccumulateId() {
        pointAccumulateId = pointHistoryDetailId;
    }
}

 

 

포인트가 예를 들어 3포인트가 적립되었는데 내가 게시글을 수정하며 1포인트를 사용하였다면 어떤 포인트에서 1포인트를 차감해야하는지에 대한 히스토리도 기록해야하기 때문에 포인트 히스토리 상세 엔티티도 추가로 구현 해주었다.

 

PointHistoryType (Enum)

@Getter
@RequiredArgsConstructor
public enum PointHistoryType implements IdEnum {
    REGISTRATION("REGISTRATION", "게시글등록"),
    MODIFY("MODIFY", "게시글수정");

    private final String id;
    private final String desc;

    @JsonValue
    public String getValue(){
        return this.name();
    }

    @JsonCreator
    public static PointHistoryType of(String name) {
        for (PointHistoryType obj : PointHistoryType.values()) {
            if (obj.name().equalsIgnoreCase(name)) {
                return obj;
            }
        }
        return null;
    }

    public static List<Map<String, String>> codes(){

        List<Map<String, String>> codes = new ArrayList<>();

        for (PointHistoryType obj : PointHistoryType.values()) {
            Map<String, String> map = new HashMap<>();

            map.put("name", obj.name());
            map.put("id", obj.getId());
            map.put("desc", obj.getDesc());

            codes.add(map);
        }

        return codes;
    }
}

 

우선 나는 게시글 등록이나 수정을 할 때 포인트를 적립하거나 사용하도록 이용할 것이기 때문에 두 가지 타입으로 생성하였지만 추후에 더 추가될 예정이다.

 

PointStat (Enum)

@Getter
@RequiredArgsConstructor
public enum PointStat implements IdEnum {
    ACCUMULATE("ACCUMULATE", "적립"),
    USE("USE", "사용"),
    EXPIRATION("EXPIRATION", "만료소멸");

    private final String id;
    private final String desc;

    @JsonValue
    public String getValue(){
        return this.name();
    }

    @JsonCreator
    public static PointStat of(String name) {
        for (PointStat obj : PointStat.values()) {
            if (obj.name().equalsIgnoreCase(name)) {
                return obj;
            }
        }
        return null;
    }

    public static List<Map<String, String>> codes(){

        List<Map<String, String>> codes = new ArrayList<>();

        for (PointStat obj : PointStat.values()) {
            Map<String, String> map = new HashMap<>();

            map.put("name", obj.name());
            map.put("id", obj.getId());
            map.put("desc", obj.getDesc());

            codes.add(map);
        }

        return codes;
    }
}

 

포인트는 크게 적립, 사용, 만료소멸 세 가지로 구분되기 때문에 이 포인트가 어떻게 이용되고 있는지에 대한 상태값을 나타내주기 위하여 구현하였다.

 

일단 크게 엔티티와 필요한 Enum을 생성하였으니 다음에는 포인트 적립 코드 구현한 것을 포스팅 하도록 해야겠다.

 

'개발' 카테고리의 다른 글

[개발] 총 포인트 조회  (0) 2024.04.17
[개발] 포인트 적립 구현 - 2  (0) 2024.04.16
포인트 기능 요구사항 정리  (0) 2024.04.11
[에러] 실행중인 포트 종료하기  (0) 2024.03.25
Vue.js 사용하기  (0) 2023.09.11