Skip to content

Conversation

@dolong2
Copy link
Owner

@dolong2 dolong2 commented Nov 7, 2025

κ°œμš”

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ°°ν¬μ‹œμ— μ΄ˆκΈ°ν™” 슀크립트λ₯Ό μˆ˜ν–‰ν•˜λŠ” λ‘œμ§μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

μž‘μ—…λ‚΄μš©

  • μ΄ˆκΈ°ν™” 슀크립트 λ„μ»€νŒŒμΌ λ‚΄μš©μ„ μƒμ„±ν•˜λŠ” λ©”μ„œλ“œ μΆ”κ°€
  • λ„μ»€νŒŒμΌ 생성을 ν•˜λ‚˜μ˜ λ©”μ„œλ“œμ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ μˆ˜μ •
  • λ„μ»€νŒŒμΌ 생성 μ„œλΉ„μŠ€μ—μ„œ when λΆ„κΈ°λŒ€μ‹  getApplicationDockerFileContent λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ μˆ˜μ •
  • λ„μ»€νŒŒμΌ 생성 μ„œλΉ„μŠ€μ— μ΄ˆκΈ°ν™” 슀크립트 κ΄€λ ¨ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μΆ”κ°€

체크리슀트

νƒ¬ν”Œλ¦Ώμ™Έμ— ν•„μš”ν•œ ν•­λͺ©μ΄ 있으면 μΆ”κ°€ν•΄μ£Όμ„Έμš”.

  • λ‘œμ»¬μ—μ„œ λΉŒλ“œκ°€ μ„±κ³΅ν•˜λ‚˜μš”?
  • μΆ”κ°€(μˆ˜μ •)ν•œ μ½”λ“œκ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ‚˜μš”?
  • pr 타켓 λΈŒλžœμΉ˜κ°€ 맞게 μ„€μ •λ˜μ–΄ μžˆλ‚˜μš”?
  • prμ—μ„œ μž‘μ—…ν•  λ‚΄μš©λ§Œ μž‘μ—…λλ‚˜μš”?
  • κΈ°μ‘΄ API와 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” 사항이 μžˆλ‚˜μš”?

Summary by CodeRabbit

릴리슀 λ…ΈνŠΈ

  • μƒˆλ‘œμš΄ κΈ°λŠ₯

    • Docker 파일 생성 μ‹œ μ—¬λŸ¬ 초기 슀크립트(RUN λͺ…λ Ή) μΆ”κ°€ μ‹€ν–‰ 지원
  • λ¦¬νŒ©ν† λ§

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μœ ν˜•λ³„ Dockerfile 생성 λ‘œμ§μ„ 톡합해 호좜 방식 λ‹¨μˆœν™”
  • ν…ŒμŠ€νŠΈ

    • 초기 슀크립트 흐름을 λ°˜μ˜ν•˜λ„λ‘ λ‹¨μœ„ ν…ŒμŠ€νŠΈ 및 λͺ© μ„€μ • μ—…λ°μ΄νŠΈ

@dolong2 dolong2 self-assigned this Nov 7, 2025
@dolong2 dolong2 added ✨ Feature κΈ°λŠ₯ 개발 2️⃣ Priority: 쀑 μš°μ„ μˆœμœ„ 쀑 labels Nov 7, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 7, 2025

Walkthrough

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νƒ€μž…λ³„ Dockerfile 생성 λ‘œμ§μ„ 톡합 API둜 λ¦¬νŒ©ν† λ§ν•˜κ³ , 초기 슀크립트(initialScripts)λ₯Ό μ‘°νšŒΒ·μ‚½μž…ν•˜λ„λ‘ μ„œλΉ„μŠ€μ™€ ν…ŒμŠ€νŠΈλ₯Ό 변경함.

Changes

μ½”ν˜ΈνŠΈ / 파일(s) λ³€κ²½ μš”μ•½
FileContent λ¦¬νŒ©ν† λ§
src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
getApplicationDockerFileContent(applicationType, version, port, env, initialScripts) 곡용 API μΆ”κ°€. κΈ°μ‘΄ νƒ€μž…λ³„ 퍼블릭 λΉŒλ”λ“€μ„ private으둜 μ „ν™˜ν•˜κ³  initialScripts λ§€κ°œλ³€μˆ˜ μΆ”κ°€. 초기 슀크립트 RUN ν–‰ 생성을 μœ„ν•œ getInitialScriptsString 헬퍼 μΆ”κ°€ 및 env 톡합 μœ μ§€.
μ„œλΉ„μŠ€ λ ˆμ΄μ–΄ μ—…λ°μ΄νŠΈ
src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt
QueryApplicationInitialScriptPort μ˜μ‘΄μ„± μΆ”κ°€ 및 μƒμ„±μž μΈμžμ— μ£Όμž…. findAllByApplication으둜 초기 슀크립트λ₯Ό μ‘°νšŒν•˜μ—¬ FileContent.getApplicationDockerFileContent(..., initialScripts) 호좜둜 Dockerfile 생성 흐름 톡합.
ν…ŒμŠ€νŠΈ μ—…λ°μ΄νŠΈ
src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt
QueryApplicationInitialScriptPort λͺ© μΆ”κ°€ 및 μ£Όμž…. λͺ¨λ“  μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ findAllByApplication(application)을 빈 리슀트둜 λͺ¨ν‚Ή. κΈ°λŒ€κ°’ 검증을 톡합 API(getApplicationDockerFileContent) 호좜둜 λ³€κ²½.

Sequence Diagram(s)

sequenceDiagram
    participant Client as μš”μ²­μž
    participant Service as CreateDockerFileServiceImpl
    participant QueryInit as QueryApplicationInitialScriptPort
    participant FileContent as FileContent
    participant FS as νŒŒμΌμ‹œμŠ€ν…œ

    Client->>Service: Dockerfile 생성 μš”μ²­ (application)
    Service->>QueryInit: findAllByApplication(application)
    QueryInit-->>Service: initialScripts : List<String>
    Service->>FileContent: getApplicationDockerFileContent(type, version, port, env, initialScripts)
    FileContent-->>Service: Dockerfile λ‚΄μš© (String)
    Service->>FS: Dockerfile μ“°κΈ°
    FS-->>Service: μ™„λ£Œ 응닡
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • μΆ”κ°€λ‘œ μ£Όμ˜ν•  파일/μ˜μ—­:
    • FileContent.kt의 초기 슀크립트 RUN 라인 생성 및 env 병합 둜직
    • CreateDockerFileServiceImpl의 μƒμ„±μž μ„œλͺ… λ³€κ²½κ³Ό μ˜μ‘΄μ„± μ£Όμž… μœ„μΉ˜
    • ν…ŒμŠ€νŠΈμ—μ„œ λͺ¨ν‚Ήλœ 초기 μŠ€ν¬λ¦½νŠΈκ°€ μ‹€μ œ 생성 결과에 λ°˜μ˜λ˜λŠ”μ§€ 검증

Possibly related issues

Possibly related PRs

Suggested labels

:\u2692: Refactor

μ‹œ

🐰 μƒˆλ²½ 토끼가 λ§ν•˜λ„€,
Dockerfile에 슀크립트 ν•œ 쀌 λ„£κ³ ,
νƒ€μž… 가리지 μ•Šκ³  ν†΅ν•©ν–ˆλ„€,
κΉ”λ”νžˆ μŒ“μΈ RUN 쀄듀에,
λΉŒλ“œ μ€€λΉ„ 끝! πŸ₯•βœ¨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
βœ… Passed checks (2 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed 제λͺ©μ΄ PR의 μ£Όμš” 변경사항(μ΄ˆκΈ°ν™” 슀크립트 적용)을 λͺ…ν™•ν•˜κ²Œ μ„€λͺ…ν•˜κ³  있으며, 이슈 λ²ˆν˜Έλ„ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
✨ Finishing touches
  • πŸ“ Generate docstrings
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/apply-initial-script-to-deploy

πŸ“œ Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 4e2680d and 29bd8e2.

πŸ“’ Files selected for processing (1)
  • src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt (2 hunks)
🧰 Additional context used
🧠 Learnings (2)
πŸ““ Common learnings
Learnt from: dolong2
Repo: dolong2/dcd PR: 703
File: src/main/kotlin/com/dcd/server/core/domain/volume/model/Volume.kt:1-12
Timestamp: 2025-09-01T14:52:42.625Z
Learning: dolong2 prefers to implement validation logic (such as path validation for Volume.physicalPath) in the business logic layer rather than in domain model init blocks, keeping domain models as simple data containers.
Learnt from: dolong2
Repo: dolong2/dcd PR: 703
File: src/test/resources/data.sql:28-30
Timestamp: 2025-09-01T14:57:07.656Z
Learning: dolong2 prefers to implement deletion validation in business logic rather than using database CASCADE constraints. For volume deletion, they want to validate if any mounts exist before allowing deletion, preventing accidental data loss while maintaining explicit control over the deletion process.
Learnt from: dolong2
Repo: dolong2/dcd PR: 655
File: src/main/kotlin/com/dcd/server/persistence/workspace/entity/WorkspaceJpaEntity.kt:12-14
Timestamp: 2025-07-12T14:05:23.333Z
Learning: dolong2λŠ” JPA의 GeneratedValue(strategy = GenerationType.UUID) λŒ€μ‹  μƒμ„±μžμ—μ„œ UUID.randomUUID()둜 직접 μ΄ˆκΈ°ν™”ν•˜λŠ” 방식을 μ„ ν˜Έν•œλ‹€. 더 κ°„λ‹¨ν•˜κ³  예츑 κ°€λŠ₯ν•œ λ™μž‘μ„ μœ„ν•΄μ„œλ‹€.
Learnt from: dolong2
Repo: dolong2/dcd PR: 659
File: src/main/kotlin/com/dcd/server/core/domain/domain/usecase/ConnectDomainUseCase.kt:40-41
Timestamp: 2025-07-14T15:01:47.531Z
Learning: dolong2λŠ” κΈ°λŠ₯적으둜 λ¬Έμ œκ°€ μ—†λŠ” μ½”λ“œ κ°œμ„ μ‚¬ν•­μ˜ 경우, μ‹€μ œλ‘œ ν•„μš”ν•  λ•ŒκΉŒμ§€ μˆ˜μ •μ„ λ―Έλ£¨λŠ” μ‹€μš©μ μΈ 접근법을 μ„ ν˜Έν•œλ‹€. 예λ₯Ό λ“€μ–΄ 의미둠적 정확성을 μœ„ν•œ 변경은 ν•΄λ‹Ή κΈ°λŠ₯이 μ‹€μ œλ‘œ ν•„μš”ν•  λ•Œ μˆ˜μ •ν•˜λŠ” 방식을 νƒν•œλ‹€.
πŸ“š Learning: 2025-02-15T10:33:37.315Z
Learnt from: dolong2
Repo: dolong2/dcd PR: 517
File: src/main/kotlin/com/dcd/server/presentation/domain/application/data/exetension/ApplicationRequestDataExtension.kt:13-13
Timestamp: 2025-02-15T10:33:37.315Z
Learning: In the DCD project, while spaces are allowed in application names (UI/display), they must be replaced with appropriate characters in specific technical contexts:
1. With underscores for Docker container names (in Application.kt)
2. With hyphens for HTTP configuration files (in GenerateHttpConfigServiceImpl.kt)

Applied to files:

  • src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and Test
πŸ”‡ Additional comments (1)
src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt (1)

167-173: 치λͺ…적 μ΄μŠˆκ°€ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€ βœ“

이전 λ¦¬λ·°μ—μ„œ μ§€μ λœ μ€„λ°”κΏˆ 문자 λˆ„λ½ λ¬Έμ œκ°€ Line 170μ—μ„œ μ˜¬λ°”λ₯΄κ²Œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이제 각 RUN λͺ…λ Ήμ–΄ 뒀에 \n이 ν¬ν•¨λ˜μ–΄ Dockerfile ꡬ문 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt (1)

36-36: μ΄ˆκΈ°ν™” μŠ€ν¬λ¦½νŠΈκ°€ μžˆλŠ” 경우의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μΆ”κ°€λ₯Ό κ³ λ €ν•˜μ„Έμš”

ν˜„μž¬ λͺ¨λ“  ν…ŒμŠ€νŠΈλŠ” 빈 μ΄ˆκΈ°ν™” 슀크립트 리슀트만 μ‚¬μš©ν•©λ‹ˆλ‹€. μ‹€μ œ μ΄ˆκΈ°ν™” μŠ€ν¬λ¦½νŠΈκ°€ μžˆμ„ λ•Œ Dockerfile에 μ˜¬λ°”λ₯΄κ²Œ ν¬ν•¨λ˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μΆ”κ°€ν•˜λ©΄ 더 μ™„μ „ν•œ ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό 확보할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ:

given("μ΄ˆκΈ°ν™” μŠ€ν¬λ¦½νŠΈκ°€ μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ£Όμ–΄μ§€κ³ ") {
    val application = ApplicationGenerator.generateApplication(applicationType = ApplicationType.SPRING_BOOT)
    val initialScripts = listOf(
        ApplicationInitialScript(/* ... */, script = "apt-get update"),
        ApplicationInitialScript(/* ... */, script = "apt-get install -y curl")
    )
    every { queryApplicationEnvPort.findByApplication(application) } returns emptyList()
    every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns initialScripts
    
    `when`("μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν• λ•Œ") {
        createDockerFileService.createFileToApplication(application, application.version)
        
        then("μƒμ„±λœ DockerFile에 μ΄ˆκΈ°ν™” μŠ€ν¬λ¦½νŠΈκ°€ ν¬ν•¨λ˜μ–΄μ•Όν•¨") {
            val actualFileContent = File("./${application.name}/Dockerfile").readText()
            actualFileContent shouldContain "RUN apt-get update"
            actualFileContent shouldContain "RUN apt-get install -y curl"
        }
    }
}

Also applies to: 65-65, 93-93, 121-121

πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 7adc1b9 and 4e2680d.

πŸ“’ Files selected for processing (3)
  • src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt (2 hunks)
  • src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt (4 hunks)
  • src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt (9 hunks)
🧰 Additional context used
🧠 Learnings (4)
πŸ““ Common learnings
Learnt from: dolong2
Repo: dolong2/dcd PR: 703
File: src/main/kotlin/com/dcd/server/core/domain/volume/model/Volume.kt:1-12
Timestamp: 2025-09-01T14:52:42.625Z
Learning: dolong2 prefers to implement validation logic (such as path validation for Volume.physicalPath) in the business logic layer rather than in domain model init blocks, keeping domain models as simple data containers.
Learnt from: dolong2
Repo: dolong2/dcd PR: 703
File: src/test/resources/data.sql:28-30
Timestamp: 2025-09-01T14:57:07.656Z
Learning: dolong2 prefers to implement deletion validation in business logic rather than using database CASCADE constraints. For volume deletion, they want to validate if any mounts exist before allowing deletion, preventing accidental data loss while maintaining explicit control over the deletion process.
Learnt from: dolong2
Repo: dolong2/dcd PR: 655
File: src/main/kotlin/com/dcd/server/persistence/workspace/entity/WorkspaceJpaEntity.kt:12-14
Timestamp: 2025-07-12T14:05:23.333Z
Learning: dolong2λŠ” JPA의 GeneratedValue(strategy = GenerationType.UUID) λŒ€μ‹  μƒμ„±μžμ—μ„œ UUID.randomUUID()둜 직접 μ΄ˆκΈ°ν™”ν•˜λŠ” 방식을 μ„ ν˜Έν•œλ‹€. 더 κ°„λ‹¨ν•˜κ³  예츑 κ°€λŠ₯ν•œ λ™μž‘μ„ μœ„ν•΄μ„œλ‹€.
Learnt from: dolong2
Repo: dolong2/dcd PR: 659
File: src/main/kotlin/com/dcd/server/core/domain/domain/usecase/ConnectDomainUseCase.kt:40-41
Timestamp: 2025-07-14T15:01:47.531Z
Learning: dolong2λŠ” κΈ°λŠ₯적으둜 λ¬Έμ œκ°€ μ—†λŠ” μ½”λ“œ κ°œμ„ μ‚¬ν•­μ˜ 경우, μ‹€μ œλ‘œ ν•„μš”ν•  λ•ŒκΉŒμ§€ μˆ˜μ •μ„ λ―Έλ£¨λŠ” μ‹€μš©μ μΈ 접근법을 μ„ ν˜Έν•œλ‹€. 예λ₯Ό λ“€μ–΄ 의미둠적 정확성을 μœ„ν•œ 변경은 ν•΄λ‹Ή κΈ°λŠ₯이 μ‹€μ œλ‘œ ν•„μš”ν•  λ•Œ μˆ˜μ •ν•˜λŠ” 방식을 νƒν•œλ‹€.
πŸ“š Learning: 2025-08-12T14:59:22.963Z
Learnt from: dolong2
Repo: dolong2/dcd PR: 692
File: src/main/kotlin/com/dcd/server/core/domain/env/spi/QueryApplicationEnvPort.kt:0-0
Timestamp: 2025-08-12T14:59:22.963Z
Learning: In the dcd codebase, when updating port interface method signatures to include workspace parameters for tenant isolation, all layers must be updated together: the port interface, service interface, service implementation, persistence adapter, repository layer, and use case callers. The user dolong2 demonstrated proper multi-layer refactoring by updating QueryApplicationEnvPort.findAllByLabelsIn to include workspace parameter and systematically updating all dependent code in a single commit, including updating repository method name to findAllByWorkspaceAndLabelsIn.

Applied to files:

  • src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt
  • src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt
πŸ“š Learning: 2025-08-12T14:59:22.963Z
Learnt from: dolong2
Repo: dolong2/dcd PR: 692
File: src/main/kotlin/com/dcd/server/core/domain/env/spi/QueryApplicationEnvPort.kt:0-0
Timestamp: 2025-08-12T14:59:22.963Z
Learning: In the dcd codebase, when updating port interface method signatures to include workspace parameters, all layers must be updated together: the port interface, persistence adapter implementation, repository layer, service callers, and tests. The user dolong2 demonstrated proper multi-layer refactoring by updating QueryApplicationEnvPort.findAllByLabelsIn to include workspace parameter and updating all dependent code in a single commit.

Applied to files:

  • src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt
πŸ“š Learning: 2025-02-15T10:33:37.315Z
Learnt from: dolong2
Repo: dolong2/dcd PR: 517
File: src/main/kotlin/com/dcd/server/presentation/domain/application/data/exetension/ApplicationRequestDataExtension.kt:13-13
Timestamp: 2025-02-15T10:33:37.315Z
Learning: In the DCD project, while spaces are allowed in application names (UI/display), they must be replaced with appropriate characters in specific technical contexts:
1. With underscores for Docker container names (in Application.kt)
2. With hyphens for HTTP configuration files (in GenerateHttpConfigServiceImpl.kt)

Applied to files:

  • src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and Test
πŸ”‡ Additional comments (2)
src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt (1)

61-64: μ΄ˆκΈ°ν™” 슀크립트 쑰회 둜직 확인 μ™„λ£Œ

μ΄ˆκΈ°ν™” 슀크립트λ₯Ό μ‘°νšŒν•˜μ—¬ 슀크립트 λ¬Έμžμ—΄ 리슀트둜 λ³€ν™˜ν•˜λŠ” 둜직이 λͺ…ν™•ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 포트 호좜과 μΌκ΄€λœ νŒ¨ν„΄μ„ μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt (1)

25-30: ν…ŒμŠ€νŠΈ 섀정이 μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€

μƒˆλ‘œμš΄ QueryApplicationInitialScriptPort μ˜μ‘΄μ„±μ΄ μΆ”κ°€λ˜κ³  μ„œλΉ„μŠ€ μƒμ„±μžμ— μ˜¬λ°”λ₯΄κ²Œ μ „λ‹¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature κΈ°λŠ₯ 개발 2️⃣ Priority: 쀑 μš°μ„ μˆœμœ„ 쀑

Projects

None yet

Development

Successfully merging this pull request may close these issues.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ°°ν¬μ‹œ μ΄ˆκΈ°ν™” 슀크립트 적용

2 participants