MAKITTDocs

User

docs/domain/user.md

User

개요

사용자 계정, 인증, 프로필, 환경설정을 관리하는 도메인. MAKITT 플랫폼의 모든 사용자(Seller)가 이 도메인으로 관리됩니다.

서버 패키지: com.makitt.core.domain.user


DynamoDB Entity

User

Single Table Design 기반의 메인 사용자 엔티티.

키 구조:

패턴예시
PKUSER#{userId}USER#abc123
SKPROFILEPROFILE

필드:

필드DynamoDB Attribute타입필수설명
pkPKStringOPartition Key
skSKStringOSort Key
entityTypeentity_typeStringO"USER" 고정
userIduser_idStringO사용자 고유 ID
emailemailStringO로그인 이메일
statusstatusUserStatusO계정 상태
signUpStatussign_up_statusSignUpStatusO가입 진행 상태
roleroleStringO"SELLER"
profileprofileUserProfileX프로필 정보 (nested)
preferencespreferencesUserPreferencesX환경설정 (nested)
authauthUserAuthX인증 정보 (nested)
createdAtcreated_atInstantO생성 시각
updatedAtupdated_atInstantO수정 시각
ttlttlLongXTTL (휴면 계정용)

Factory Methods:

  • User.createEmailUser(userId, email, passwordHash) — 이메일 기반 사용자 생성
  • User.createOAuthUser(userId, email, provider, oauthId, oauthProvider) — OAuth 사용자 생성

Nested Objects

UserProfile

필드DynamoDB Attribute타입설명
firstNamefirst_nameString이름
lastNamelast_nameString
namenameString전체 이름 (firstName + lastName)
phonephoneString연락처
imageUrlimage_urlString프로필 이미지 URL

UserPreferences

필드DynamoDB Attribute타입기본값설명
languagelanguageStringko언어 코드
timezonetimezoneStringAsia/Seoul시간대
dateFormatdate_formatStringYYYY-MM-DD날짜 포맷
numberFormatnumber_formatStringcomma_dot숫자 포맷 (1,000.00)
themethemeStringsystem테마 (system/light/dark)

UserAuth

필드DynamoDB Attribute타입설명
providerproviderAuthProvider인증 제공자
oauthIdoauth_idStringOAuth ID (OAuth 사용자만)
oauthProvideroauth_providerStringOAuth 제공자 이름
emailVerifiedemail_verifiedBoolean이메일 인증 여부
passwordHashpassword_hashStringBCrypt 해시 (이메일 사용자만)

Enums

AuthProvider

설명
EMAIL이메일 인증
GOOGLEGoogle OAuth
APPLEApple Sign In

UserStatus

설명
DRAFT가입 진행 중
ACTIVE활성 상태
INACTIVE비활성 상태
SUSPENDED정책 위반으로 정지

SignUpStatus

설명
INIT초기 가입 완료
EMAIL_VERIFIED이메일 인증 완료
READY서비스 사용 가능

GSI (Global Secondary Index)

GSIPK 패턴SK 패턴용도
EntityLookupIndexUSER#{userId}PROFILE엔티티 타입별 조회
UniqueLookupIndex{email}USER#{userId}이메일로 사용자 조회
SecondaryIdIndexOAUTH#{provider}#{oauthId}USER#{userId}OAuth ID로 사용자 조회

OpenSearch Document

UserDocument

Index: users Document ID: userId

필드JSON Field타입설명
userIduser_idString사용자 ID
emailemailString이메일
firstNamefirst_nameString이름
lastNamelast_nameString
namenameString전체 이름
phonephoneString연락처
profileImageUrlprofile_image_urlString프로필 이미지
languagelanguageString언어 코드
timezonetimezoneString시간대
authProviderauth_providerString인증 제공자 (enum name)
oauthIdoauth_idStringOAuth ID
oauthProvideroauth_providerStringOAuth 제공자 이름
statusstatusString계정 상태 (enum name)
signUpStatussign_up_statusString가입 상태 (enum name)
roleroleString역할
emailVerifiedemail_verifiedBoolean이메일 인증 여부
createdAtcreated_atLong생성 시각 (epoch ms)
updatedAtupdated_atLong수정 시각 (epoch ms)

변환: UserDocument.fromEntity(User user) — DynamoDB Entity → OpenSearch Document

검색 기능:

  • searchByEmail(email) — 이메일 정확히 일치
  • searchByName(name) — 이름 부분 일치

Key Builder

클래스: com.makitt.core.common.dynamodb.key.UserKey

// Primary Keys
UserKey.pk(userId)          → "USER#{userId}"
UserKey.sk()                → "PROFILE"

// GSI1: EntityLookupIndex
UserKey.gsi1Pk(userId)      → "USER#{userId}"
UserKey.gsi1Sk()            → "PROFILE"

// GSI2: UniqueLookupIndex (Email)
UserKey.gsi2Pk(email)       → "{email}"
UserKey.gsi2Sk(userId)      → "USER#{userId}"

// GSI3: SecondaryIdIndex (OAuth)
UserKey.gsi3Pk(provider, oauthId) → "OAUTH#{provider}#{oauthId}"
UserKey.gsi3Sk(userId)            → "USER#{userId}"

// Helper
UserKey.extractUserId(pk)   → userId (PK에서 추출)

관련 엔티티

엔티티PKSK설명
RefreshToken--JWT 리프레시 토큰
EmailVerificationToken--이메일 인증 토큰
EmailLock--이메일 중복 방지 잠금