Skip to content

Feature/172#185

Merged
KwonSunJae merged 29 commits intodevelopfrom
feature/172
Dec 31, 2025
Merged

Feature/172#185
KwonSunJae merged 29 commits intodevelopfrom
feature/172

Conversation

@YuSung011017
Copy link

설계 C안 적용 - Worker 기반 멀티 테넌트 구조 리팩토링

📋 개요

이슈 #172의 설계 C안을 적용하여 Worker 기반 멀티 테넌트 구조를 구현했습니다. 기존 설계 B안에서 설계 C안으로 전환하며, tenant_worker_map을 제거하고 cloud_resource_worker_map을 추가하여 리소스 단위 접근 제어를 구현했습니다.

🎯 주요 변경 사항

1. Worker 엔티티 및 서비스 수정

  • Worker 엔티티: tenant_id 제거, organization_id 추가
  • Worker는 테넌트 독립적으로 동작하며, User 또는 Organization 중 하나에만 연결
  • WorkerService: createWorkerFromUser(), createWorkerFromOrganization() 메서드 추가
  • WorkerRepository: 테넌트 관련 메서드 제거, Organization 관련 메서드 추가

2. CloudResourceWorkerMap 추가

  • 새로운 엔티티: CloudResourceWorkerMap (복합 PK: cloud_resource_id, worker_id)
  • 리소스 단위로 Worker 접근 권한 관리
  • access_scope 필드 제거 (리소스 단위 관리로 불필요)
  • CloudResourceWorkerService: 리소스-Worker 매핑 관리 서비스
  • CloudResourceWorkerController: 리소스-Worker 매핑 관리 API

3. TenantWorkerMap Deprecated 처리

  • TenantWorkerService, TenantWorkerController @deprecated 처리
  • 기존 코드는 유지하되, 새로운 기능은 CloudResourceWorkerMap 사용

4. WorkerRole 구조 개선

  • WorkerRole에서 tenant_id 제거 (Role이 이미 tenant_id를 가짐)
  • WorkerRoleId: tenant 필드 제거
  • WorkerRoleService: 불필요한 tenant 관련 메서드 제거
  • WorkerRoleController: tenantId 파라미터 제거

5. RBAC 제약조건 강화

  • Role 엔티티: UNIQUE(tenant_id, role_key) 제약조건 추가
  • Permission 엔티티: UNIQUE(tenant_id, action, resource) 제약조건 추가
  • 테넌트별 역할 및 권한 중복 방지
  • 인덱스 추가로 조회 성능 최적화

🔄 설계 C안 핵심 원칙

  1. Worker는 테넌트 독립적: Worker는 User 또는 Organization 기반으로 생성되며, 테넌트와 직접 연결되지 않음
  2. 리소스 단위 접근 제어: CloudResourceWorkerMap을 통해 리소스별로 Worker 접근 권한 관리
  3. Role 기반 테넌트 스코프: Role이 이미 tenant_id를 가지므로 WorkerRole에는 중복 제거
  4. 테넌트별 네임스페이스: Role과 Permission은 테넌트별로 고유한 키를 가짐

📝 변경된 파일

엔티티

  • Worker.java: tenant_id 제거, organization_id 추가
  • WorkerRole.java: tenant_id 제거
  • CloudResourceWorkerMap.java: 새로 추가
  • Role.java: UNIQUE 제약조건 추가
  • Permission.java: UNIQUE 제약조건 추가

서비스

  • WorkerService.java: User/Organization 기반 Worker 생성 메서드 추가
  • CloudResourceWorkerService.java: 새로 추가
  • WorkerRoleService.java: tenant 관련 메서드 제거
  • TenantWorkerService.java: @deprecated 처리

컨트롤러

  • WorkerController.java: 주석 수정 (설계 C 기준)
  • CloudResourceWorkerController.java: 새로 추가
  • WorkerRoleController.java: tenantId 파라미터 제거
  • TenantWorkerController.java: @deprecated 처리
  • OrganizationController.java: Organization 기반 Worker 생성 API 추가

DTO

  • WorkerResponse.java: tenant_id 제거, organizationId 추가
  • WorkerRoleResponse.java: tenant 정보는 Role을 통해 제공
  • CloudResourceWorkerMapResponse.java: 새로 추가

테스트

  • 모든 Worker 관련 테스트 코드를 설계 C안에 맞게 수정
  • 테스트 모두 통과 (1,626개 테스트 성공)

✅ 검증 완료

  • 컴파일 성공
  • 모든 테스트 통과 (1,626개)
  • 설계 C안 요구사항 준수 확인
  • UNIQUE 제약조건 추가
  • Deprecated 처리 완료

🔗 관련 이슈

Closes #172

📚 참고 문서

- OrganizationMemberId: (organization_id, user_id) 복합 PK
- TenantWorkerMapId: (tenant_id, worker_id) 복합 PK
- WorkerRoleId: (worker_id, role_id, tenant_id) 복합 PK

Related to #172, #163, #165
- Worker: User 1:N Worker 관계, (user_id, tenant_id) unique constraint
- OrganizationMember: 복합 PK (organization_id, user_id), BaseEntity 제거, status 필드 제거
- TenantWorkerMap: 복합 PK (tenant_id, worker_id), Shared Tenant 접근 관리
- WorkerRole: 복합 PK (worker_id, role_id, tenant_id), Worker 역할 관리

Related to #172, #163, #165
- WorkerRepository: Worker 조회 메서드
- OrganizationMemberRepository: 복합 PK 기반 OrganizationMember 조회
- TenantWorkerMapRepository: TenantWorkerMap 조회 및 관리
- WorkerRoleRepository: WorkerRole 조회 및 관리

Related to #172, #163, #165
- Worker 관련 에러 코드 정의
- WORKER_NOT_FOUND, WORKER_DUPLICATE_USER_TENANT 등

Related to #172, #163, #165
- WorkerService: User 기반 Worker 생성 및 조회
- OrganizationMemberService: User-Organization 관계 관리
- TenantWorkerService: Shared Tenant 접근 권한 검증 및 Worker 할당
- WorkerRoleService: Worker 역할 부여 및 관리

Related to #172, #163, #165
- 설계 B 요구사항: User는 전역 계정, 테넌트 맥락 없음
- tenant 필드 제거 (Worker로 관리)
- organization 필드 제거 (OrganizationMember로 관리)

Related to #172, #163, #165
- Deprecated 필드 제거 (orgKey, orgName, description, parentOrganization, status, orgType 등)
- name 필드만 유지
- @OnetoOne Tenant 관계 제거

Related to #172, #163, #165
- @OnetoOne Organization 관계 제거
- ownerOrganization 필드 유지 (Dedicated Tenant용)
- tenant_type enum 유지 (DEDICATED/SHARED)

Related to #172, #163, #165
- existsByName 추가 (설계 B: name 필드 사용)
- Deprecated 필드 사용 메서드들 @deprecated 처리
- 계층 구조 관련 메서드들 빈 결과 반환하도록 수정

Related to #172, #163, #165
- findByTenant, findActiveUsersByTenant, countActiveUsersByTenant 제거
- findByOrganizationId 제거
- User 엔티티의 tenant, organization 필드 제거에 따른 수정

Related to #172, #163, #165
- addUserToOrganization, removeUserFromOrganization을 OrganizationMemberService로 위임
- Deprecated 필드 사용 제거
- 계층 구조 관련 메서드 제거 또는 수정
- name 필드만 사용

Related to #172, #163, #165
- user.getOrganization() 제거
- OrganizationMemberService.getOrganizationsByUserId() 사용
- User-Organization 관계를 OrganizationMember로 확인

Related to #172, #163, #165
- getUsersByTenant, getActiveUsersByTenant, getActiveUserCountByTenant 제거
- updateUser에서 tenant, organization 필드 설정 제거
- User 엔티티의 tenant, organization 필드 제거에 따른 수정

Related to #172, #163, #165
- Deprecated 필드들 @deprecated 처리하여 호환성 유지
- name 필드만 사용
- from() 메서드에서 테넌트 정보 매핑 제거 (설계 B: Organization에 tenant 필드 없음)

Related to #172, #163, #165
- JwtService: user.getTenant() 제거, TODO 추가 (Worker 기반 구현 필요)
- AuthenticationService: user.getTenant() 제거, TODO 추가
- AuthorizationServiceImpl: user.getTenant() 제거, TODO 추가

Related to #172, #163, #165
- HealthCheckService: user.getTenant() 제거, TODO 추가 (Worker 기반 구현 필요)
- MonitoringNotificationService: userRepository.findActiveUsersByTenant() 제거, TODO 추가

Related to #172, #163, #165
- Worker 생성, Tenant 할당, 역할 부여, Organization 멤버십 등 모든 시나리오 검증
- 19개 테스트 모두 통과
- 설계 B 요구사항에 따른 테스트 구현

Related to #172, #163, #165
- OrganizationServiceTest, OrganizationHierarchyServiceTest 등 Deprecated 테스트 파일들을 java-disabled 폴더로 이동
- WorkerServiceIntegrationTest로 대체
- 추후 수정 후 재활성화 예정

Related to #172, #163, #165
- Tenant 엔티티: @manytoone ownerOrganization → @OnetoOne organization으로 변경
- Organization 엔티티: @OnetoOne(mappedBy) Tenant tenant 추가
- OrganizationRepository: ownerOrganization → organization 쿼리 수정
- 테스트: Shared Tenant도 organization을 가지도록 수정 (1:1 관계)

Related to #172, #163, #165
- Worker 관련 DTO 추가 (CreateWorkerRequest, WorkerResponse)
- OrganizationMember 관련 DTO 추가 (AddMemberRequest, OrganizationMemberResponse)
- TenantWorkerMap 관련 DTO 추가 (AssignWorkerRequest, TenantWorkerMapResponse)
- WorkerRole 관련 DTO 추가 (AssignRoleRequest, WorkerRoleResponse)

이슈 #172 Phase 5 완료
- OrganizationMemberController 추가 (조직 멤버 관리 API)
- WorkerController 추가 (Worker 생성 및 조회 API)
- TenantWorkerController 추가 (테넌트-Worker 할당 API)
- WorkerRoleController 추가 (Worker 역할 관리 API)
- UserOrganizationController 추가 (사용자 조직 목록 조회 API)
- OrganizationController TODO 주석 업데이트 (완료 표시)

이슈 #172 Phase 6 완료
- Worker 기반 멀티 테넌트 구조 마이그레이션 스크립트 추가
- 새로운 테이블 생성 (workers, organization_member, tenant_worker_map, worker_role)
- Tenant 테이블 수정 (tenant_type 컬럼 추가, MySQL 버전 호환 처리)
- 기존 데이터 마이그레이션 스크립트 (User.tenant_id, User.organization_id 이관)
- 데이터 검증 쿼리 및 롤백 스크립트 포함

이슈 #172 Phase 7 완료
- OrganizationMemberControllerTest 추가 (3개 테스트)
- WorkerControllerTest 추가 (3개 테스트)
- TenantWorkerControllerTest 추가 (3개 테스트)
- WorkerRoleControllerTest 추가 (4개 테스트)
- UserOrganizationControllerTest 추가 (2개 테스트)

총 15개 테스트 모두 통과
이슈 #172 Phase 8 완료
- Worker 엔티티: tenant_id 제거, organization_id 추가
- Worker는 User 또는 Organization 중 하나에만 연결 (테넌트 독립적)
- WorkerService: createWorkerFromUser, createWorkerFromOrganization 메서드 추가
- WorkerRepository: tenant_id 관련 메서드 제거, organization_id 관련 메서드 추가
- WorkerResponse: tenant_id 제거, organizationId 추가

이슈 #172 설계 C안 적용
- CloudResourceWorkerMap 엔티티 추가 (복합 PK: cloud_resource_id, worker_id)
- CloudResourceWorkerMapId 복합 PK 클래스 추가
- CloudResourceWorkerMapRepository 추가
- CloudResourceWorkerService 추가 (리소스 단위 Worker 접근 권한 관리)
- CloudResourceWorkerController 추가 (리소스-Worker 매핑 관리 API)
- CloudResourceWorkerMapResponse DTO 추가
- TenantWorkerService, TenantWorkerController @deprecated 처리
- WorkerErrorCode: CloudResourceWorkerMap 관련 에러 코드 추가

이슈 #172 설계 C안 적용
- WorkerRole 엔티티: tenant_id 제거 (Role이 이미 tenant_id를 가짐)
- WorkerRoleId: tenant 필드 제거
- WorkerRoleRepository: tenant_id 관련 쿼리 수정 (Role을 통해 필터링)
- WorkerRoleService: findByWorkerIdAndTenantId, findByTenantId 메서드 제거
- WorkerRoleController: tenantId 파라미터 제거
- WorkerRoleResponse: tenant 정보는 Role을 통해 제공

이슈 #172 설계 C안 적용
- Role 엔티티: UNIQUE(tenant_id, role_key) 제약조건 추가
- Permission 엔티티: UNIQUE(tenant_id, action, resource) 제약조건 추가
- 인덱스 추가: tenant_id, role_key, action, resource
- 테넌트별 역할 및 권한 중복 방지

이슈 #172 설계 C안 적용
- WorkerControllerTest: tenantId 제거, createWorkerFromUser 사용
- WorkerRoleControllerTest: tenantId 파라미터 제거, findByWorkerId만 사용
- WorkerServiceIntegrationTest: 설계 C안 시나리오에 맞게 수정
- TenantWorkerControllerTest: @deprecated 처리

이슈 #172 설계 C안 적용
- Organization 기반 Worker 생성 API 추가
- POST /api/v1/organizations/{id}/workers 엔드포인트 추가

이슈 #172 설계 C안 적용
@YuSung011017 YuSung011017 self-assigned this Dec 19, 2025
@KwonSunJae KwonSunJae merged commit f5cc9b9 into develop Dec 31, 2025
3 checks passed
@KwonSunJae KwonSunJae deleted the feature/172 branch December 31, 2025 14:46
@KwonSunJae KwonSunJae restored the feature/172 branch December 31, 2025 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants