- member.plan_expires_at + iap_purchase 테이블(중복 결제 방지) - POST /api/billing/google/verify: 구매 검증 후 PREMIUM 부여/갱신(만료 연장), 세션 plan 즉시 동기화 - GET /api/billing/products: 구독 상품(월간/연간) - 테스트 모드(billing.test-mode=true): test- 토큰 검증 없이 승인 → 전 과정 테스트 가능 - GooglePlayVerifier 인터페이스 + 스텁(실연동 지점), 실연동 시 구현체 교체 - 관리자 수동 plan 변경은 만료일 없이(영구), 결제는 만료일 부여 - 만료 자동 강등 스케줄러(매시), MemberResponse.planExpiresAt 노출 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.6 KiB
Java
39 lines
1.6 KiB
Java
package com.sb.web.auth.domain;
|
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Data;
|
|
import lombok.NoArgsConstructor;
|
|
|
|
import java.io.Serializable;
|
|
import java.time.LocalDateTime;
|
|
|
|
/**
|
|
* 회원 도메인. member 테이블과 매핑.
|
|
* 로컬(아이디/비밀번호) + 소셜(네이버 등) 로그인을 함께 수용한다.
|
|
*/
|
|
@Data
|
|
@Builder
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
public class Member implements Serializable {
|
|
|
|
private Long id;
|
|
private String loginId; // 로컬 로그인 아이디 (소셜 전용은 null)
|
|
private String password; // BCrypt 해시 (소셜 전용은 null)
|
|
private String name;
|
|
private String email;
|
|
private String provider; // LOCAL / NAVER / GOOGLE
|
|
private String providerId; // 소셜 제공자 측 고유 ID
|
|
private String googleId; // 구글 sub (계정 연결용 — LOCAL 계정에 구글을 연결해도 provider 는 유지)
|
|
private String googlePicture; // 구글 아바타 URL (로그인 시 동기화)
|
|
private String profileImage; // 사용자 지정 프로필 이미지(data URL). 우선순위: profileImage > googlePicture > 이니셜
|
|
private String role; // USER / ADMIN
|
|
private String plan; // FREE / PREMIUM (멤버십)
|
|
private LocalDateTime planExpiresAt; // 유료 멤버십 만료일 (NULL=만료없음/무료)
|
|
private Long points; // 활동 포인트 (게시판 글/댓글 작성 보상)
|
|
private String status; // ACTIVE / SUSPENDED / WITHDRAWN
|
|
private LocalDateTime createdAt;
|
|
private LocalDateTime updatedAt;
|
|
}
|