Merged
Conversation
- RdbmsManagementPort 인터페이스 구현 - createRdbms: 인스턴스 생성 및 available 상태 대기 - updateRdbms: 인스턴스 수정 (크기, 스토리지, 패스워드) - deleteRdbms: 인스턴스 삭제 (스냅샷 옵션 지원) - Command → AWS SDK Request 변환 로직 - CSP 중립 필드를 AWS 특화 필드로 매핑"
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[Phase 1] RDBMS 포트 및 모델 정의 구현
📋 개요
AWS RDS 자원 관리 기능 구현의 Phase 1로, 헥사고날 아키텍처를 준수하여 CSP(Cloud Service Provider) 비종속적인 포트 인터페이스와 도메인 모델을 정의했습니다.
🎯 구현 목표
providerSpecificConfig를 통한 CSP별 특화 설정 지원📦 구현 내용
1. Command 모델 정의 (
port/model/rdbms/)1.1 RdbmsCreateCommand
RDBMS 인스턴스 생성을 위한 도메인 커맨드입니다. CSP 중립적인 필드를 사용하여 모든 클라우드 프로바이더를 동일한 인터페이스로 지원합니다.
주요 추상화 전략:
instanceNamedbInstanceIdentifierserverNameinstanceIdinstanceSizedb.t3.microGP_Gen5_2db-custom-2-7680networkSecurityIdsecurityGroupIdfirewallRuleauthorizedNetworkszoneavailabilityZonezonezonehighAvailabilitymultiAzhighAvailabilityhighAvailability핵심 필드:
engine: 데이터베이스 엔진 타입 (mysql, postgresql, mariadb, oracle, sqlserver)allocatedStorage: 스토리지 크기 (GB) - 모든 CSP 공통 단위providerSpecificConfig: CSP별 특화 설정을 위한 확장 포인트subnetGroupName,parameterGroupName등resourceGroupName,sku등databaseFlags,backupConfiguration등설계 고려사항:
providerSpecificConfig로 확장 가능CloudSessionCredential포함1.2 RdbmsUpdateCommand
RDBMS 인스턴스 수정을 위한 도메인 커맨드입니다. 인스턴스 크기, 스토리지, 패스워드 등 변경 가능한 속성만 포함합니다.
주요 필드:
instanceSize: 인스턴스 크기 변경 (CSP 중립적)allocatedStorage: 스토리지 크기 변경 (GB)adminPassword: 관리자 패스워드 변경 (선택적)applyImmediately: 즉시 적용 여부 (일부 CSP만 지원)providerSpecificConfig: CSP별 특화 수정 옵션설계 고려사항:
providerSpecificConfig로 처리1.3 RdbmsDeleteCommand
RDBMS 인스턴스 삭제를 위한 도메인 커맨드입니다. 스냅샷, 백업 등 삭제 관련 옵션을 포함합니다.
주요 필드:
skipSnapshot: 최종 스냅샷 건너뛰기 (AWS 특화, 다른 CSP는providerSpecificConfig로)snapshotName: 최종 스냅샷 이름 (선택적)deleteAutomatedBackups: 자동 백업 삭제 여부providerSpecificConfig: CSP별 특화 삭제 옵션설계 고려사항:
skipSnapshot)도 포함하되, 주석으로 다른 CSP 처리 방법 명시providerSpecificConfig로 확장 가능1.4 RdbmsQuery
RDBMS 인스턴스 목록 조회를 위한 쿼리 모델입니다. 페이징, 필터링 기능을 제공합니다.
주요 필드:
regions: 조회할 리전 목록 (null이면 모든 리전)instanceName: 인스턴스 이름으로 필터링 (CSP 중립적)engine: 엔진 타입으로 필터링instanceSize: 인스턴스 크기로 필터링 (CSP 중립적)status: 상태로 필터링 (CSP별 상태 값 다를 수 있음)tagsEquals: 태그로 필터링page,size: 페이징 정보편의 메서드:
all(): 모든 인스턴스 조회byInstanceName(): 특정 이름으로 조회byEngine(): 특정 엔진 타입으로 조회byStatus(): 특정 상태로 조회설계 고려사항:
Page인터페이스와 호환2. Port 인터페이스 정의 (
port/outbound/rdbms/)헥사고날 아키텍처의 핵심인 포트 인터페이스를 정의했습니다. 포트는 도메인과 외부 시스템 간의 **계약(Contract)**을 정의하며, CSP별 구현은 Adapter에서 담당합니다.
2.1 RdbmsManagementPort
역할: RDBMS 인스턴스의 CRUD 작업을 담당하는 포트입니다.
책임:
createRdbms)updateRdbms)deleteRdbms)특징:
Command객체를 받아 도메인 중심 설계CloudResource로 통일하여 일관성 유지2.2 RdbmsDiscoveryPort
역할: RDBMS 인스턴스의 조회/탐색 기능을 담당하는 포트입니다.
책임:
listRdbmsInstances)getRdbmsInstance)getInstanceStatus)특징:
@Transactional(readOnly = true)적용 가능Page<CloudResource>반환Optional<CloudResource>로 null 안전성 보장2.3 RdbmsLifecyclePort
역할: RDBMS 인스턴스의 생명주기 관리(시작/중지/재시작)를 담당하는 포트입니다.
책임:
ResourceLifecyclePort를 확장하여 일반적인 리소스 생명주기 관리 기능 상속start(ResourceIdentity, CloudSessionCredential))stop(ResourceIdentity, CloudSessionCredential))terminate(ResourceIdentity, CloudSessionCredential))rebootInstance(String, CloudSessionCredential))특징:
ResourceLifecyclePort를 확장하여 인터페이스 계층 구조 명확화reboot만 추가로 제공reboot는 OS 레벨 재부팅으로stop+start보다 빠르고 안전🔄 Phase 2: AWS RDS 어댑터 구현
Phase 1에서 정의한 포트 인터페이스를 구현하는 AWS RDS 어댑터를 구현했습니다.
1. AWS RDS 어댑터 구현 (
adapter/outbound/aws/rds/)1.1 AwsRdsConfig
역할: AWS RDS 클라이언트를 생성하는 설정 클래스입니다.
주요 기능:
설계 특징:
@ConditionalOnProperty로 AWS 활성화 여부에 따라 빈 생성 제어1.1.1 AwsS3Config 리팩토링
역할: AWS S3 설정 클래스를 JIT 세션 관리 패턴으로 리팩토링했습니다.
리팩토링 배경:
1.2 AwsRdsMapper
역할: AWS SDK의
DBInstance객체를 도메인 모델인CloudResource로 변환하는 매퍼입니다.1.3 AwsRdsManagementAdapter
역할: RDBMS 인스턴스의 생성, 수정, 삭제 기능을 제공하는 어댑터입니다.
구현된 기능:
1. createRdbms (인스턴스 생성)
RdbmsCreateCommand→CreateDbInstanceRequest변환instanceName→dbInstanceIdentifierinstanceSize→dbInstanceClassnetworkSecurityId→vpcSecurityGroupIdszone→availabilityZonehighAvailability→multiAZavailable상태까지 대기 (최대 30분)AwsRdsMapper를 통해CloudResource로 변환하여 반환2. updateRdbms (인스턴스 수정)
RdbmsUpdateCommand→ModifyDbInstanceRequest변환instanceSize,allocatedStorage,adminPassword,applyImmediatelyavailable상태까지 대기CloudResource로 변환하여 반환3. deleteRdbms (인스턴스 삭제)
RdbmsDeleteCommand→DeleteDbInstanceRequest변환skipSnapshot,snapshotName,deleteAutomatedBackups주요 특징:
CloudErrorTranslator를 통한 통일된 예외 처리waitForInstanceAvailable메서드로 인스턴스 상태 대기 (폴링 간격: 30초)1.4 AwsRdsDiscoveryAdapter
역할: RDBMS 인스턴스의 조회/탐색 기능을 제공하는 어댑터입니다.
구현된 기능:
1. listRdbmsInstances (인스턴스 목록 조회)
RdbmsQuery→DescribeDbInstancesRequest변환instanceName:dbInstanceIdentifier로 필터링engine: 엔진 타입으로 필터링instanceSize:dbInstanceClass로 필터링status:dbInstanceStatus로 필터링Page인터페이스 반환AwsRdsMapper를 통해CloudResource로 변환2. getRdbmsInstance (특정 인스턴스 조회)
Optional<CloudResource>반환으로 null 안전성 보장3. getInstanceStatus (인스턴스 상태 조회)
주요 특징:
executeWithRdsClient헬퍼 메서드로 클라이언트 생성/종료 자동화CloudErrorTranslator를 통한 통일된 예외 처리1.5 AwsRdsLifecycleAdapter
역할: RDBMS 인스턴스의 생명주기 관리(시작/중지/재시작) 기능을 제공하는 어댑터입니다.
구현된 기능:
1. start (인스턴스 시작) - ResourceLifecyclePort 구현
UnsupportedOperationException발생ResourceIdentity를 통해 리소스 정보 전달2. stop (인스턴스 중지) - ResourceLifecyclePort 구현
StopDbInstanceRequest생성 및 실행ResourceIdentity를 통해 리소스 정보 전달3. terminate (인스턴스 종료) - ResourceLifecyclePort 구현
RdbmsManagementPort.deleteRdbms()를 통해 처리해야 함UnsupportedOperationException발생하여 명시적으로 처리 방법 안내4. rebootInstance (인스턴스 재시작) - RdbmsLifecyclePort 추가 기능
RebootDbInstanceRequest생성 및 실행stop+start보다 빠르고 안전한 재시작 제공주요 특징:
RdbmsLifecyclePort를 구현하여ResourceLifecyclePort의 모든 기능 상속CloudErrorTranslator를 통한 통일된 예외 처리아키텍처 개선:
RdbmsLifecyclePort가ResourceLifecyclePort를 확장하여 일반적인 리소스 생명주기 관리 기능 상속reboot만 추가로 제공하여 인터페이스 계층 구조 명확화2. DTO 클래스 구현 (
dto/)Controller 계층에서 사용하는 요청/응답 DTO 클래스들을 구현했습니다.
2.1 RdbmsCreateRequest
역할: RDBMS 인스턴스 생성을 위한 요청 DTO입니다.
2.2 RdbmsUpdateRequest
역할: RDBMS 인스턴스 수정을 위한 요청 DTO입니다.
2.3 RdbmsDeleteRequest
역할: RDBMS 인스턴스 삭제를 위한 요청 DTO입니다.
2.4 RdbmsQueryRequest
역할: RDBMS 인스턴스 목록 조회를 위한 요청 DTO입니다.
2.5 RdbmsResponse
역할: RDBMS 인스턴스 정보를 반환하는 응답 DTO입니다.
3. 의존성 추가 (pom.xml)
AWS RDS SDK 의존성을 추가했습니다.
✅ 체크리스트
Phase 1
providerSpecificConfig확장 포인트 제공Phase 2
🔒 감사 로깅 적용
배경
RDBMS 인스턴스 관리 작업에 대한 보안 감사 및 컴플라이언스를 위해 감사 로깅을 추가했습니다.
ObjectStorageController와 동일한 패턴을 적용하여 일관된 감사 로깅 정책을 유지합니다.변경 사항
1. AuditResourceType 통일
변경 전:
OBJECT_STORAGE_CONTAINER: Object Storage Container 전용 리소스 타입RDBMS_INSTANCE: RDBMS 인스턴스 전용 리소스 타입 (신규 추가 예정)S3_BUCKET: S3 버킷 전용 리소스 타입변경 후:
CLOUD_PROVIDER리소스 타입 사용OBJECT_STORAGE_CONTAINER,RDBMS_INSTANCE,S3_BUCKET)변경 이유:
AuditResourceTypeenum에 필드가 과도하게 증가하는 문제 방지action필드로 구체적인 작업을 구분할 수 있어 리소스 타입 분리가 불필요영향받는 파일:
AuditResourceType.java:OBJECT_STORAGE_CONTAINER,RDBMS_INSTANCE,S3_BUCKET제거ObjectStorageController.java: 모든@AuditRequired의resourceType을CLOUD_PROVIDER로 변경RdbmsController.java: 모든@AuditRequired의resourceType을CLOUD_PROVIDER로 변경2. RdbmsController 감사 로깅 추가
추가된 감사 로깅:
listRdbmsInstancesLIST_RDBMS_INSTANCESgetRdbmsInstanceGET_RDBMS_INSTANCEcreateRdbmsCREATE_RDBMS_INSTANCEupdateRdbmsUPDATE_RDBMS_INSTANCEdeleteRdbmsDELETE_RDBMS_INSTANCEstartInstanceSTART_RDBMS_INSTANCEstopInstanceSTOP_RDBMS_INSTANCErebootInstanceREBOOT_RDBMS_INSTANCEgetInstanceStatusGET_RDBMS_INSTANCE_STATUS데이터 포함 정책:
3. 보안 및 안전성 보장
원본 데이터 보호:
MaskingService.toMaskedJson()은 깊은 복사본을 생성하여 마스킹 처리민감 정보 자동 마스킹:
password,pwd,pass→***token,jwt,auth,key→***secretkey,secret_key→ 마스킹accountscope,account_scope→ 마스킹email,phone,ssn등 → 부분 마스킹비동기 처리:
@Async로 비동기 처리되어 성능 영향 최소화예외 처리:
참고 사항
기존 감사 로깅 시스템 활용
@AuditRequired어노테이션 기반 감사 로깅 시스템을 그대로 활용ObjectStorageController와의 일관성
ObjectStorageController와 동일한 패턴으로 구현CLOUD_PROVIDER로 통일하여 일관성 유지확장성
CLOUD_PROVIDER리소스 타입을 사용하여 enum 확장 없이 적용 가능🔐 adminPassword 암호화 보안 구현
배경
RDBMS 인스턴스 생성 및 수정 시 전달되는
adminPassword는 민감한 정보이므로, 로그 파일 유출 및 메모리 덤프 공격으로부터 보호하기 위해 암호화 처리를 적용했습니다.구현 내용
1. Service 계층에서 암호화
RdbmsUseCaseService에서
EncryptionService를 사용하여adminPassword를 암호화합니다.특징:
RdbmsCreateCommand와RdbmsUpdateCommand에는 암호화된 값이 전달됨CloudErrorCode.ENCRYPTION_FAILED예외 발생2. Adapter 계층에서 복호화
AwsRdsManagementAdapter에서 AWS SDK로 전달하기 직전에 복호화합니다.
특징:
CloudErrorCode.DECRYPTION_FAILED예외 발생3. 로깅 시 마스킹 처리
원본 데이터 보호:
LogMaskingUtils.maskSensitiveData()를 사용하여 민감 정보 마스킹마스킹 규칙:
password,pwd,pass→***token,jwt,auth,key→***secretkey,secret_key→ 마스킹보안상 이점
1. 로그 파일 보호 (가장 큰 이점)
2. 메모리 덤프 시 부분적 보호
3. 레이어 간 전달 보호