-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NCloud Terraform 변환 코드 구현 #133
NCloud Terraform 변환 코드 구현 #133
Conversation
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
ISSUES CLOSED: boostcampwm-2024#78
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다!
테라폼 부분은 서버나 클라이언트에서 import해서 사용하게 될텐데 apps 말고 packages로 옮기면 좋을 것 같아요.
accessKey: string; | ||
secretKey: string; | ||
region: string; | ||
site: string; | ||
name: string; | ||
serviceType: string; | ||
requiredVersion: string; | ||
source: string; | ||
|
||
constructor(json: any) { | ||
this.serviceType = 'provider'; | ||
this.name = 'ncloud'; | ||
this.accessKey = json.accessKey; | ||
this.secretKey = json.secretKey; | ||
this.region = json.region; | ||
this.site = json.site || 'public'; | ||
this.requiredVersion = '>= 0.13'; | ||
this.source = 'NaverCloudPlatform/ncloud'; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지금은 클래스 생성자가 다른 클래스도 전부 json: any
로 되어 있는데, 생성자 파라미터는 구조분해할당으로 받고, 파라미터 없이 정의할 수 있는 부분은 위에서 하는건 어떨까요?
이렇게 하면 json.site
처럼 값을 확인하지 않고 파라미터에서 기본값을 설정할 수도 있습니다.
타입 활용이랑 가독성이 개선될 것 같아요.
this.resourceNameMap = new Map(); | ||
} | ||
|
||
addResourceFromJson(jsonData: { nodes?: CloudCanvasNode[] }) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
혹시 jsonData
를 객체로 설정하신 이유가 있나요? 바로 CloudCanvasNode[]
배열을 받는건 어떤가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
parseToNCloudModel()
함수는 ncloud에 종속적인 부분이라 ncloud provider의 메서드로 넣으면 어떨까 하는 생각이 들었습니다.
아니면 지금처럼 임시로 TerraformConvertor에 두거나요.
return new NCloudVPC({ | ||
name: name || 'vpc', | ||
ipv4CidrBlock: properties.cidrBlock | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
||
부분을 생성자 파라미터의 기본값으로 설정하면 어떨까요?
+NCloudModel 관련 클래스에서 속성이 있어도 지금처럼 생성자에 입력되지 않는 속성들이 있는데 ?
를 사용해서 optional을 표시하면 좋을 것 같습니다.
const terraformBlock = ` | ||
terraform { | ||
required_providers { | ||
ncloud = { | ||
source = "${providerProperties.terraform.required_providers.ncloud.source}" | ||
} | ||
} | ||
required_version = "${providerProperties.terraform.required_version}" | ||
}`; | ||
|
||
const providerBlock = ` | ||
provider "${this.provider.name}" { | ||
${this.formatProperties(providerProperties.provider)} | ||
}`; | ||
|
||
const resourceBlocks = this.resources | ||
.sort((a, b) => a.priority - b.priority) | ||
.map(resource => { | ||
const properties = this.replaceReferences(resource.getProperties()); | ||
return ` | ||
resource "${resource.serviceType}" "${resource.name}" { | ||
${this.formatProperties(properties)} | ||
}`; | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
문자열 템플릿 부분을 utils로 분리하는건 어떨까요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
포크된 레포에는 이미 반영된 상태이고 머지 이후에 다시 pr올릴려고 했는데 그냥 올리겠습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DFS를 써서 참조의존성으로 그래프를 만드는 방식으로 다시 리팩토링 하는 것도 좋아보입니다.
고생하셨습니다!
연관 이슈
주요 작업
구현 결과
hclCopyresource "ncloud_vpc" "my-vpc" {
name = "my-vpc"
ipv4_cidr_block = "172.16.0.0/16"
}
비고
문제: 하드코딩된 참조값
해결: 플레이스홀더 패턴과 ResourceNameMap 도입
문제: 배열이 단일 값으로 처리
해결: 모델에서 배열 구조 유지
문제: 모델-컨트롤러 책임 불명확
해결: 관심사 분리 및 인터페이스 기반 설계
ResourcePriority enum으로 순서 보장
리소스 간 참조 관리 방법
정규표현식 vs 단순 문자열 체크
플레이스홀더 패턴의 도입
인터페이스 기반 vs 추상 클래스
Properties 구조 설계
명확한 책임 분리
재사용 가능한 컴포넌트
일관된 코드 패턴
확장 가능한 구조
인터페이스 기반 설계
TypeScript 타입 시스템 활용