From 7ffd9b3e6b15134d61d8035a9cebd41e690973a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 31 May 2025 17:16:05 +0000 Subject: [PATCH 1/4] Initial plan for issue From c3bfb1032a5b089ae3ef7e04267682e49eb26214 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 31 May 2025 17:19:29 +0000 Subject: [PATCH 2/4] Fix non-English content and grammar issues in main documentation files Co-authored-by: justinyoo <1538528+justinyoo@users.noreply.github.com> --- CONTRIBUTING.md | 2 +- README.md | 12 ++++++------ docs/00-setup.md | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 438b448..54ebe47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ chances of your issue being dealt with quickly: - **Version** - what version is affected (e.g. 0.1.2) - **Motivation for or Use Case** - explain what are you trying to do and why the current behavior is a bug for you - **Browsers and Operating System** - is this a problem with all browsers? -- **Reproduce the Error** - provide a live example or a unambiguous set of steps +- **Reproduce the Error** - provide a live example or an unambiguous set of steps - **Related Issues** - has a similar issue been reported before? - **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be causing the problem (line of code or commit) diff --git a/README.md b/README.md index 3c52efe..be928fb 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ But here's the situation... - Build applications using GitHub Copilot Agent Mode. - Add custom instruction to GitHub Copilot so that you have more control over GitHub Copilot. -- Add various MCP servers to GitHub Copilot에 so that you build the applications more precisely. +- Add various MCP servers to GitHub Copilot so that you build the applications more precisely. ## Prerequisites -During this workshop, [GitHub Codespaces](https://docs.github.com/ko/codespaces/about-codespaces/what-are-codespaces) is highly recommended because there's no need for preparation, except a web browser. However, if you really need to use your machine, make sure you've installed everything identified below. +During this workshop, [GitHub Codespaces](https://docs.github.com/en/codespaces/about-codespaces/what-are-codespaces) is highly recommended because there's no need for preparation, except a web browser. However, if you really need to use your machine, make sure you've installed everything identified below. ### Common @@ -61,7 +61,7 @@ During this workshop, [GitHub Codespaces](https://docs.github.com/ko/codespaces/ ## Product Requirements Document -First and the foremost place for you to start is this [PRD (Product Requirements Document)](./product-requirements.md). This document will give you better understanding what todo and how to do. +First and foremost, the place for you to start is this [PRD (Product Requirements Document)](./product-requirements.md). This document will give you a better understanding of what to do and how to do it. ## Workshop Instructions @@ -90,9 +90,9 @@ Check out the complete example of each application. They're also vibe-coded with ## Read More... -- [GitHub Codespaces](https://docs.github.com/ko/codespaces/about-codespaces/what-are-codespaces) -- [GitHub Copilot](https://docs.github.com/ko/copilot/about-github-copilot/what-is-github-copilot) +- [GitHub Codespaces](https://docs.github.com/en/codespaces/about-codespaces/what-are-codespaces) +- [GitHub Copilot](https://docs.github.com/en/copilot/about-github-copilot/what-is-github-copilot) - [GitHub Copilot: Agent Mode](https://code.visualstudio.com/blogs/2025/04/07/agentMode) - [GitHub Copilot: MCP](https://code.visualstudio.com/blogs/2025/05/12/agent-mode-meets-mcp) - [GitHub Copilot: Custom Instructions](https://code.visualstudio.com/docs/copilot/copilot-customization) -- [GitHub Copilot: Changing AI Models](https://docs.github.com/ko/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat?tool=vscode) +- [GitHub Copilot: Changing AI Models](https://docs.github.com/en/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat?tool=vscode) diff --git a/docs/00-setup.md b/docs/00-setup.md index 3de7b79..92b681e 100644 --- a/docs/00-setup.md +++ b/docs/00-setup.md @@ -231,8 +231,8 @@ Refer to the [README](../README.md) doc for preparation. You should be able to see the following. If you see `microsoft` in `origin`, you should clone it again from your forked repository. ```bash - origin https://github.com/<자신의 GitHub ID>/github-copilot-vibe-coding-workshop.git (fetch) - origin https://github.com/<자신의 GitHub ID>/github-copilot-vibe-coding-workshop.git (push) + origin https://github.com//github-copilot-vibe-coding-workshop.git (fetch) + origin https://github.com//github-copilot-vibe-coding-workshop.git (push) upstream https://github.com/microsoft/github-copilot-vibe-coding-workshop.git (fetch) upstream https://github.com/microsoft/github-copilot-vibe-coding-workshop.git (push) ``` From 191157803768c65b98bc52f7a106f098c75f64e2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 31 May 2025 17:23:31 +0000 Subject: [PATCH 3/4] Translate Korean content to English in documentation files Co-authored-by: justinyoo <1538528+justinyoo@users.noreply.github.com> --- complete/README.md | 2 +- .../java/demo/.github/code-instructions.md | 100 +++++++++--------- complete/java/demo/diagram.md | 76 ++++++------- 3 files changed, 89 insertions(+), 89 deletions(-) diff --git a/complete/README.md b/complete/README.md index 517c197..b1a1d42 100644 --- a/complete/README.md +++ b/complete/README.md @@ -31,7 +31,7 @@ Refer to the [README](../README.md) doc for preparation. 1. Open a web browser and navigate to `http://localhost:3000`. 1. Verify if the web application is running properly. -1. 아래 명령어를 실행시켜 컨테이너 앱을 삭제합니다. +1. Clean up by running the following command to remove the containerized apps. ```bash docker compose down --rmi all diff --git a/complete/java/demo/.github/code-instructions.md b/complete/java/demo/.github/code-instructions.md index 7dbaa72..ff7c11b 100644 --- a/complete/java/demo/.github/code-instructions.md +++ b/complete/java/demo/.github/code-instructions.md @@ -1,93 +1,93 @@ -# Spring Boot 기반 자바 개발을 위한 코드 생성 가이드 (VSCode + GitHub Copilot) +# Spring Boot Java Development Code Generation Guide (VSCode + GitHub Copilot) -이 문서는 VSCode에서 GitHub Copilot을 활용해 Spring Boot 기반 자바 프로젝트를 개발할 때 따를 코드 생성 규칙과 가이드를 정의합니다. +This document defines code generation rules and guidelines to follow when developing Spring Boot-based Java projects using GitHub Copilot in VSCode. --- -## 1. 기본 설정 +## 1. Basic Configuration -- **사용 언어**: Java 17 이상 -- **프레임워크**: Spring Boot 3.x -- **빌드 도구**: Gradle (Kotlin DSL) 또는 Maven -- **프로젝트 구조**: `src/main/java`, `src/main/resources` 표준 구조 사용 -- **이름 규칙**: 클래스 및 메서드는 `CamelCase`, 변수는 `lowerCamelCase` +- **Language**: Java 17 or higher +- **Framework**: Spring Boot 3.x +- **Build Tool**: Gradle (Kotlin DSL) or Maven +- **Project Structure**: Use standard `src/main/java`, `src/main/resources` structure +- **Naming Convention**: Classes and methods use `CamelCase`, variables use `lowerCamelCase` --- -## 2. 패키지 구조 예시 +## 2. Package Structure Example ``` com.example.project -├── controller // REST 컨트롤러 -├── service // 비즈니스 로직 -├── repository // JPA 레포지토리 -├── domain // 엔티티 및 도메인 모델 -├── dto // DTO (데이터 전송 객체) -├── config // 설정 클래스 -├── exception // 커스텀 예외 및 핸들러 +├── controller // REST controllers +├── service // Business logic +├── repository // JPA repositories +├── domain // Entities and domain models +├── dto // Data Transfer Objects +├── config // Configuration classes +├── exception // Custom exceptions and handlers ``` --- -## 3. 코드 스타일 +## 3. Code Style -- **생성자 주입** 사용 (`@RequiredArgsConstructor`) -- **Lombok**으로 보일러플레이트 제거: +- Use **constructor injection** (`@RequiredArgsConstructor`) +- Remove boilerplate with **Lombok**: - `@Getter`, `@Setter`, `@ToString`, `@NoArgsConstructor`, `@AllArgsConstructor` -- 모든 **public 클래스 및 메서드에 JavaDoc** 작성 -- 로그는 `@Slf4j`로 처리 +- Write **JavaDoc for all public classes and methods** +- Handle logs with `@Slf4j` --- -## 4. REST API 작성 규칙 +## 4. REST API Writing Rules -- `@RestController`, `@RequestMapping` 사용 -- 응답은 `ResponseEntity<>`로 감싸기 -- 요청 바디 검증은 `@Valid`와 함께 `@RequestBody` 사용 -- 예외는 `@ControllerAdvice`로 전역 처리 +- Use `@RestController`, `@RequestMapping` +- Wrap responses with `ResponseEntity<>` +- Use `@Valid` with `@RequestBody` for request body validation +- Handle exceptions globally with `@ControllerAdvice` --- -## 5. JPA 작성 규칙 +## 5. JPA Writing Rules -- `@Entity`, `@Table`, `@Id` 필수 사용 -- `@ManyToOne(fetch = FetchType.LAZY)` 선호 -- 양방향 매핑은 꼭 필요할 때만 사용 -- 엔티티는 직접 반환하지 말고 DTO를 사용 +- Required use of `@Entity`, `@Table`, `@Id` +- Prefer `@ManyToOne(fetch = FetchType.LAZY)` +- Use bidirectional mapping only when necessary +- Don't return entities directly; use DTOs --- -## 6. 테스트 작성 규칙 +## 6. Testing Rules -- 통합 테스트: `@SpringBootTest`, 컨트롤러 테스트: `@WebMvcTest` -- 의존성 목킹: `@MockBean` 또는 `Mockito` -- 테스트 클래스 이름: `클래스명 + Test.java` -- 테스트는 `src/test/java` 아래에 위치 +- Integration tests: `@SpringBootTest`, controller tests: `@WebMvcTest` +- Dependency mocking: `@MockBean` or `Mockito` +- Test class naming: `ClassName + Test.java` +- Tests should be located under `src/test/java` --- -## 7. Copilot 활용 팁 +## 7. Copilot Usage Tips -- `// 생성: 설명` 형태의 주석으로 Copilot에게 명령 -- 메서드 시그니처나 클래스 선언만 먼저 작성해도 자동 완성 유도 가능 -- 생성된 코드는 반드시 **리팩토링 및 검토**할 것 -- 필요한 로직 흐름에 대해 인라인 주석 사용 (예: `// 사용자 존재 여부 확인`) +- Use comments in the format `// Generate: description` to command Copilot +- Writing just method signatures or class declarations can induce auto-completion +- Always **refactor and review** generated code +- Use inline comments for required logic flow (e.g., `// Check if user exists`) --- -## 예시 프롬프트 +## Example Prompts ```java -// 생성: 사용자(User) 엔티티를 관리하는 REST 컨트롤러 +// Generate: REST controller that manages User entities ``` ```java -// 생성: 이메일로 사용자 조회하는 서비스 메서드 +// Generate: Service method that finds user by email ``` --- -## 8. 의존성 설정 예시 (Gradle Kotlin DSL 기준) +## 8. Dependency Configuration Example (Gradle Kotlin DSL) ```kotlin dependencies { @@ -95,18 +95,18 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.projectlombok:lombok") - runtimeOnly("com.h2database:h2") // 또는 사용 중인 DBMS + runtimeOnly("com.h2database:h2") // or your DBMS in use testImplementation("org.springframework.boot:spring-boot-starter-test") } ``` --- -## 9. API 문서화 +## 9. API Documentation -- Swagger(OpenAPI) 문서를 위해 `springdoc-openapi` 사용 -- 컨트롤러에 `@Operation`, DTO나 엔티티에 `@Schema` 활용 +- Use `springdoc-openapi` for Swagger (OpenAPI) documentation +- Use `@Operation` in controllers, `@Schema` in DTOs or entities --- -**끝.** +**End.** diff --git a/complete/java/demo/diagram.md b/complete/java/demo/diagram.md index 6500c40..c424ad7 100644 --- a/complete/java/demo/diagram.md +++ b/complete/java/demo/diagram.md @@ -1,29 +1,29 @@ -# SNS API 서비스 다이어그램 +# SNS API Service Diagram -## 전체 시스템 구조 +## Overall System Architecture ``` +--------------------------------------------+ -| FastAPI 애플리케이션 | +| FastAPI Application | +--------------------------------------------+ -| - title: "Simple SNS API" | -| - CORS 미들웨어 추가 | -| - API 라우터 설정 (/api) | +| - title: "Simple SNS API" | +| - CORS middleware added | +| - API router configuration (/api) | +--------------------------------------------+ | - | 사용 + | uses v +--------------------------------------------+ -| 데이터베이스 | +| Database | +--------------------------------------------+ | - SQLite | -| - 테이블: posts, comments, likes | +| - Tables: posts, comments, likes | +--------------------------------------------+ | - | 포함 + | contains v +--------------------------------------------+ -| 데이터 모델 | +| Data Models | +--------------------------------------------+ | | | | | | v v v | @@ -32,32 +32,32 @@ +----------+ +------+ +------+ | +--------------------------------------------+ | - | 구현 + | implements v +--------------------------------------------+ -| API 엔드포인트 | +| API Endpoints | +--------------------------------------------+ -| 포스트 관련: | +| Post-related: | | - GET /api/posts | | - POST /api/posts | | - GET /api/posts/{postId} | | - PATCH /api/posts/{postId} | | - DELETE /api/posts/{postId} | | | -| 댓글 관련: | +| Comment-related: | | - GET /api/posts/{postId}/comments | | - POST /api/posts/{postId}/comments | | - GET /api/posts/{postId}/comments/{id} | | - PATCH /api/posts/{postId}/comments/{id} | | - DELETE /api/posts/{postId}/comments/{id}| | | -| 좋아요 관련: | +| Like-related: | | - POST /api/posts/{postId}/likes | | - DELETE /api/posts/{postId}/likes | +--------------------------------------------+ ``` -## 데이터 모델 상세 다이어그램 +## Detailed Data Model Diagram ``` +----------------+ +----------------+ +----------------+ @@ -89,7 +89,7 @@ +----------------+ +----------------+ ``` -## 데이터베이스 스키마 다이어그램 +## Database Schema Diagram ``` +----------------+ +----------------+ +----------------+ @@ -107,32 +107,32 @@ | +------------------------+ | | | +-----------------------+------------------------+ - 외래 키 관계 + Foreign Key Relationships ``` -## API 흐름 다이어그램 +## API Flow Diagram ``` -클라이언트 → HTTP 요청 → FastAPI 애플리케이션 → API 라우터 → 비즈니스 로직 → -SQLite 데이터베이스 → 결과 → Pydantic 모델 변환 → JSON 응답 → 클라이언트 +Client → HTTP Request → FastAPI Application → API Router → Business Logic → +SQLite Database → Results → Pydantic Model Conversion → JSON Response → Client ``` -## API 엔드포인트 설명 +## API Endpoint Descriptions -1. **포스트 관련 API** - - `GET /api/posts`: 모든 포스트 목록 조회 - - `POST /api/posts`: 새 포스트 작성 - - `GET /api/posts/{postId}`: 특정 포스트 조회 - - `PATCH /api/posts/{postId}`: 특정 포스트 수정 - - `DELETE /api/posts/{postId}`: 특정 포스트 삭제 +1. **Post-related APIs** + - `GET /api/posts`: Retrieve all posts + - `POST /api/posts`: Create a new post + - `GET /api/posts/{postId}`: Retrieve a specific post + - `PATCH /api/posts/{postId}`: Update a specific post + - `DELETE /api/posts/{postId}`: Delete a specific post -2. **댓글 관련 API** - - `GET /api/posts/{postId}/comments`: 특정 포스트의 댓글 목록 조회 - - `POST /api/posts/{postId}/comments`: 특정 포스트에 댓글 작성 - - `GET /api/posts/{postId}/comments/{commentId}`: 특정 댓글 조회 - - `PATCH /api/posts/{postId}/comments/{commentId}`: 특정 댓글 수정 - - `DELETE /api/posts/{postId}/comments/{commentId}`: 특정 댓글 삭제 +2. **Comment-related APIs** + - `GET /api/posts/{postId}/comments`: Retrieve comments for a specific post + - `POST /api/posts/{postId}/comments`: Create a comment on a specific post + - `GET /api/posts/{postId}/comments/{commentId}`: Retrieve a specific comment + - `PATCH /api/posts/{postId}/comments/{commentId}`: Update a specific comment + - `DELETE /api/posts/{postId}/comments/{commentId}`: Delete a specific comment -3. **좋아요 관련 API** - - `POST /api/posts/{postId}/likes`: 특정 포스트에 좋아요 추가 - - `DELETE /api/posts/{postId}/likes`: 특정 포스트의 좋아요 취소 +3. **Like-related APIs** + - `POST /api/posts/{postId}/likes`: Add a like to a specific post + - `DELETE /api/posts/{postId}/likes`: Remove a like from a specific post From e963a1448f1472e8d98c8b46456a6e28249e201d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 31 May 2025 17:25:25 +0000 Subject: [PATCH 4/4] =?UTF-8?q?Fix=20systematic=20grammar=20errors:=20'whi?= =?UTF-8?q?ch=20is=20you're'=20=E2=86=92=20'which=20you're'=20and=20subjec?= =?UTF-8?q?t-verb=20agreement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: justinyoo <1538528+justinyoo@users.noreply.github.com> --- docs/00-setup.md | 2 +- docs/01-python.md | 4 ++-- docs/02-javascript.md | 4 ++-- docs/03-java.md | 4 ++-- docs/04-dotnet.md | 6 +++--- docs/05-containerization.md | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/00-setup.md b/docs/00-setup.md index 92b681e..76b573f 100644 --- a/docs/00-setup.md +++ b/docs/00-setup.md @@ -305,7 +305,7 @@ Refer to the [README](../README.md) doc for preparation. ```text Here's the PRD for you. Carefully read through the entire PRD and do the following for me. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Generate an OpenAPI document in YAML format. - The OpenAPI document should capture all API endpoints, parameters and request/response payloads. - Assume the API server is `http://localhost:8080` and the base URL is `/api`. diff --git a/docs/01-python.md b/docs/01-python.md index 60558d7..71a9948 100644 --- a/docs/01-python.md +++ b/docs/01-python.md @@ -67,7 +67,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to write a Python application. But before that, I need to set up a virtual environment. Follow the instructions below. - Your working directory is `python`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Use `.venv` for the virtual environment. - Use `uv` as the Python package manager. ``` @@ -82,7 +82,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to build a FastAPI application as a backend API. Carefully read the entire PRD and `openapi.yaml`. Then, follow the instructions below. - Your working directory is `python`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Use FastAPI as the API app framework. - Use SQLite as the database. - Use in-memory feature of SQLite. diff --git a/docs/02-javascript.md b/docs/02-javascript.md index 354de5b..f1a1826 100644 --- a/docs/02-javascript.md +++ b/docs/02-javascript.md @@ -70,7 +70,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to scaffold a React web app. Follow the instructions below. - Your working directory is `javascript`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Use ViteJS as the frontend app framework. - Use default settings when initializing the project. - Use `SimpleSocialMediaApplication` as the name of the project while initializing. @@ -131,7 +131,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to build a React web app. Follow the instructions below. - Your working directory is `javascript`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - There's a backend API app running on `http://localhost:5050`. - Use `openapi.yaml` that describes all the endpoints and data schema. - Create all the UI components defined in this link: {{FIGMA_SECTION_LINK}}. diff --git a/docs/03-java.md b/docs/03-java.md index 3e5a74f..983a7d3 100644 --- a/docs/03-java.md +++ b/docs/03-java.md @@ -75,7 +75,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to scaffold a Spring Boot app. Follow the instructions below. - Your working directory is `java`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Use Spring Boot CLI to create the Spring Boot app project. - Use Gradle as the Java package manager. - Use the package name of `com.contoso.springapp`. @@ -103,7 +103,7 @@ Refer to the [README](../README.md) doc for preparation. - The existing FastAPI application is located at `python`. - Your working directory is `java/springapp`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Analyze the application structure of the existing FastAPI app. - Migrate all the endpoints. Both corresponding endpoints should be exactly the same as each other. - Use SQLite as the database. diff --git a/docs/04-dotnet.md b/docs/04-dotnet.md index b1bb445..63fe102 100644 --- a/docs/04-dotnet.md +++ b/docs/04-dotnet.md @@ -69,7 +69,7 @@ Refer to the [README](../README.md) doc for preparation. I'd like to scaffold a Blazor web app. Follow the instructions below. - Your working directory is `dotnet`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Show me the list of .NET projects related to Blazor and ask me to choose. - Generate a Blazor project. - Use the project name of `Contoso.BlazorApp`. @@ -92,12 +92,12 @@ Refer to the [README](../README.md) doc for preparation. - The existing React application is located at `javascript`. - Your working directory is `dotnet/Contoso.BlazorApp`. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Analyze the application structure of the existing React app. - Migrate all the React components to Blazor ones. Both corresponding components should be as exactly close to each other as possible. - Migrate all necessary CSS elements from React to Blazor. - While migrating JavaScript elements from React to Blazor, maximize using Blazor's native features as much as possible. If you have to use JavaScript, use Blazor's JSInterop features. - - If necessary, add NuGet packages that is compatible with .NET 9. + - If necessary, add NuGet packages that are compatible with .NET 9. ``` 1. Once migration is over, use prompt like below to verify the migration result. diff --git a/docs/05-containerization.md b/docs/05-containerization.md index c8bea48..050ffac 100644 --- a/docs/05-containerization.md +++ b/docs/05-containerization.md @@ -71,7 +71,7 @@ Refer to the [README](../README.md) doc for preparation. - The Java app is located at `complete/java`. - Your working directory is the repository root. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Create a Dockerfile, `Dockerfile.java`. - Use Microsoft OpenJDK 21. - Use multi-stage build approach. @@ -112,7 +112,7 @@ Refer to the [README](../README.md) doc for preparation. - The .NET app is located at `complete/dotnet`. - Your working directory is the repository root. - - Identify all the steps first, which is you're going to do. + - Identify all the steps first, which you're going to do. - Create a Dockerfile, `Dockerfile.dotnet`. - Use .NET 9. - Use multi-stage build approach.