포인트 기능 중에 게시글 등록을 하면 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 |