flowchart TD Start([법인 관리자가 사용자 초대]) --> GenerateToken[8글자 토큰 생성
예: K7MNPQ2R
UserInvitation 저장
상태: PENDING] GenerateToken --> SendEmail[이메일 발송
- 링크 포함
- 8글자 토큰 표시] SendEmail --> UserType{사용자 유형} %% ======================================== %% 신규 회원 플로우 %% ======================================== UserType -->|신규 회원
미가입자| NewUserPath{초대 확인 방법} NewUserPath -->|이메일 링크| EmailLink1[이메일 링크 클릭
/signup/portalUser?invitation=CODE] NewUserPath -->|일반 회원가입| DirectSignup[일반 회원가입 진행
ROLE_USER로 생성] EmailLink1 --> SignupPage1[회원가입 페이지
- 이메일 자동 입력됨
- 법인명 표시] SignupPage1 --> RegisterForm[가입 정보 입력
초대 수락] RegisterForm --> RegisterComplete[회원가입 완료
ROLE_CORP_USER로 생성
상태: COMPLETED] RegisterComplete --> NewUserEnd([가입 완료 안내]) DirectSignup --> Login4[로그인] Login4 --> AfterLogin4[로그인 성공] AfterLogin4 --> CheckInvitation %% ======================================== %% 기존 회원 플로우 %% ======================================== UserType -->|기존 회원
ROLE_USER| ExistingUserPath{초대 확인 방법} ExistingUserPath -->|이메일 링크
비로그인 상태| EmailLink2[이메일 링크 클릭
/signup/decision?invitation=CODE] ExistingUserPath -->|이메일 링크
로그인 상태| EmailLinkLoggedIn[이메일 링크 클릭
/signup/decision?invitation=CODE] ExistingUserPath -->|직접 로그인| DirectLogin[로그인 페이지에서 로그인] %% 비로그인 상태에서 이메일 링크 클릭 EmailLink2 --> DecisionPagePublic[초대 수락 페이지
비로그인 상태] DecisionPagePublic --> RedirectLogin2[로그인 유도] RedirectLogin2 --> Login2[로그인] Login2 --> AfterLogin2[로그인 성공] %% 로그인 상태에서 이메일 링크 클릭 → 바로 수락 페이지 EmailLinkLoggedIn --> DecisionPageDirect[초대 수락 페이지
/signup/decision_process
초대 수락] DecisionPageDirect --> UserDecision %% 직접 로그인 DirectLogin --> Login3[로그인] Login3 --> AfterLogin3[로그인 성공] %% ======================================== %% 로그인 후 초대 확인 (PortalAuthenticationSuccessHandler) %% ======================================== AfterLogin2 --> CheckInvitation[PortalAuthenticationSuccessHandler
PENDING 초대 확인
findFirstByInvitationEmailAndStatus] AfterLogin3 --> CheckInvitation CheckInvitation --> HasInvitation{PENDING 초대 존재?} HasInvitation -->|없음| NormalHome[메인 페이지 이동] HasInvitation -->|있음| SaveToSession[세션에 초대 정보 저장
pendingInvitation=true
pendingInvitationToken
pendingInvitationOrgName] SaveToSession --> RedirectHome[메인 페이지로 이동] %% ======================================== %% 메인 페이지 팝업 (index.html) %% ======================================== RedirectHome --> ShowPopup[팝업 표시
OOO에서 초대가 도착했습니다
초대를 확인하시겠습니까?] ShowPopup --> PopupChoice{사용자 선택} PopupChoice -->|확인| GoDecisionPage[초대 수락 페이지 이동
/signup/decision?invitation=TOKEN] PopupChoice -->|취소| StayHome[메인 페이지 유지
다음 로그인 시 팝업 재표시] StayHome --> NextLogin[다음 로그인] NextLogin --> CheckInvitation GoDecisionPage --> DecisionPage[초대 수락 페이지
/signup/decision_process
초대 수락] DecisionPage --> UserDecision{사용자 선택} UserDecision -->|수락| AcceptProcess[초대 수락 처리
1. PortalOrg 변경
2. ROLE_CORP_USER 전환
3. 약관 재동의
상태: COMPLETED] UserDecision -->|거절| RejectProcess[초대 거절 처리
상태: REJECTED] AcceptProcess --> LogoutPrompt[로그아웃 후 재로그인 안내] LogoutPrompt --> ExistingUserEnd([초대 수락 완료]) RejectProcess --> RejectEnd([초대 거절 완료
다음 로그인 시 팝업 안 뜸]) %% ======================================== %% 스타일링 %% ======================================== style Start fill:#e1f5e1 style NewUserEnd fill:#c8e6c9 style ExistingUserEnd fill:#c8e6c9 style RejectEnd fill:#fff9c4 style NormalHome fill:#e3f2fd style GenerateToken fill:#bbdefb style AcceptProcess fill:#c5cae9 style RejectProcess fill:#ffecb3 style CheckInvitation fill:#ffe0b2 style SaveToSession fill:#ffe0b2 style ShowPopup fill:#f8bbd0 style PopupChoice fill:#f8bbd0 style StayHome fill:#e1bee7 style NextLogin fill:#e1bee7