Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

AI가 CRUD API 작성하는것에 열광하는 시점은 이미 지난듯해,  푸시기능을 포함 CQRS를 이용하는 액터모델도 바이브코드가 가능할까?

여러번 이야기 주고받는 바이브도 귀찮기때문에, 한큐에 작동코드를포함,유닛테스트,테스트클라이언트 까지 쓸만한 초기버전을 잘뽑는지? 플래닝 자율주행모드로 시도되었습니다.

cluade code를 활용해 시도되었으며 시도과정과 프롬프트들도 공유합니다. - 그대로 따라하면 똑같은 녀석이 또 탄생하거나~ 더 업그레이드된 녀석이 나오게될지도 모르겠습니다.

  • 언어 : 닷넷 
    • 유사컨센으로 코틀린에서도 수행가능합니다.
  • IDE : 젯브레인 라이더

시작템플릿

  • 초기구성 깡통 API를 어플리케이션을 만드는것은 큰 어려운것은 아니니~ 초기셋팅은 집적진행
    • 그냥 IDE가 제공하는 템플릿을 클릭만하면 되는것을~ 굳이 이거 안하고자 요청하면 시간낭비만 더하는듯 ( IDE가 잘하는것은 그냥 IDE에 맡김)
  • 유닛테스트는 자율로 만들예정이며 솔루션은 프로젝트와 구분해주는게 좋습니다. - 닷넷특성
    • 자바/코틀린의 경우 src하위에 유닛테스트가 포함되는 케이스여서 프로젝트와 함께 관리됩니다.
  • 모르는 옵션은 다음에 학습하고 사용
    • Graph,Minimal API등 최근나온 좋은컨셉으로 보이긴하나 익숙하지 않은 옵션은 제외
    • API 인증도 탑재해주는듯하나 패스( Azure가 클라우드로 연결시켜 사용하게끔 만들것같은 옵션)


시도되는 자율생성 프롬프트

Code Block
themeEmacs
title지침.md
# 프로젝트 생성지침

PushServiceNet/PushServiceNet.csproj 기본 API프로젝트가 작성되어있으며 이 베이스로 기능을 추가하고자합니다.

## 핵심기능 설명
- SSE(Server-Sent Events) 기능을 활용해 푸시 서비스를 만들고 싶습니다.
- 서버는 토픽에서 실시간 이벤트를 발행할수 있습니다.
- 접속하지 못한 사용자를 위해 다음 접속시 과거 발생된 토픽을 최근 100개까지, 토픽별로 저장하고 싶습니다.
- Push는 Post방식으로, SSE수신은 Get방식으로 처리합니다. 
- 토픽에 관련된 상태처리는 액터모델이 사용자 ID별로 처리합니다.


## 유닛테스트
- PushServiceNetTest 프로젝트를 추가하여 유닛테스트를 작성합니다.
- 사용자1번이 토픽 A를 구독하고, 사용자 2번이 토픽 B를 구독한후... 토픽A에게 메시지를 발생하면 사용자 1번만 수신받습니다.
- 사용자3번이 서버메시지 발생후 늦게 접속하면... 사용자3번은 과거 발생 토픽을 최대 100개이내에서 받을수 있습니다.

## 테스트 클라이언트
- 유닛테스트가 성공하면 그 기반으로 추가로 테스트 웹클라이언트도 작성해주세요
- wwwroot/index.html 에서 SSE를 테스트할 수 있는 클라이언트 기능도 추가하고 싶습니다.
- 클라이언트는 왼쪽/오른쪽 두가지뷰가 있으며 왼쪽화면은 SSE를 수신받는 클라이언트 , 오른쪽뷰는 SEE를 발생하는 클라이언트입니다.


## 사전지식
- Docs/Guides 하위폴더의 샘플코드및 문서를 먼저 학습하세요
  • Docs/Guides
    • akka.net 이용하는경우
    • 코틀린에서 akka오픈(pekko) 이용하는경우
    • 시도하고싶은 오픈소스 샘플코드가 있다고하면 유사한 형태로 하위에 그냥 때려박으면 되겠습니다.
      • 과거에는 오픈소스를 해석하고 실험하고 했다고하면 여기서의 컨셉은~ 좋은 코드컨셉이 있다고 느낌이오면 샘플코드를 넣어 고급패턴을 바로 이용하는 전략입니다.

이 실험에 이용된 생성지침과 실제 지식파일입니다.

View file
nameGuides.zip
height150


Info

cluade 코드를 실행한후

> "생성지침.md" 수행해줘   

팁 : alt+tab을 눌러 plan mode로 전환한후 수행합니다. 안해줘도 plan mode라 판단되면 수행하는듯하나 명시적 수행모드로

...

  • Default 모델을 사용했습니다. 
    • 최상위 모델로 시도할수도 있겠지만 , 기본모델로 고생을 하고 나중에 좋은것 사용하면 퀄리티 상승되는 효과를 체감할수 있는것같습니다.

플래닝

Code Block
themeEmacs
User approved Claude's plan:
  ⎿  Implementation Plan for PushServiceNet

     1. Add Required NuGet Packages

     - Akka (1.5.x)
     - Akka.Hosting (for DI integration)
     - xUnit, xUnit.runner.visualstudio, Microsoft.NET.Test.Sdk (for unit tests)

     2. Core Domain Models

     Create models for:
     - Topic - Represents a subscription topic
     - TopicMessage - Message published to a topic
     - UserSubscription - User's topic subscriptions
     - SSENotification - SSE message format

     3. Actor System Architecture

     - TopicManagerActor - Manages topic creation and message distribution
     - UserTopicActor - Per-user actor managing subscriptions and message history (max 100)
     - SSEConnectionActor - Manages SSE connections per user

     4. Services Layer

     - AkkaService - Actor system initialization and management
     - TopicService - Business logic for topic operations
     - SSEService - SSE connection management

     5. API Controllers

     - TopicController - POST endpoints for publishing messages
     - SSEController - GET endpoint for SSE connections with topic subscription

     6. Static Web Client

     - wwwroot/index.html - Two-panel interface:
       - Left panel: SSE receiver with topic subscription
       - Right panel: Message publisher to topics

     7. Unit Test Project

     - PushServiceNetTest project with tests for:
       - User 1 subscribes to Topic A, User 2 to Topic B scenarios
       - Message history retrieval (up to 100 messages)
       - Late-joining user receives missed messages

     8. Implementation Order

     1. Update PushServiceNet.csproj with dependencies
     2. Create domain models
     3. Implement actor system (AkkaService, actors)
     4. Create service layer
     5. Add API controllers
     6. Enable static files and create web client
     7. Create test project and implement unit tests

● Update Todos
  ⎿  ☐ Update PushServiceNet.csproj with Akka.NET dependencies
     ☐ Create domain models (Topic, TopicMessage, UserSubscription, SSENotification)
     ☐ Implement AkkaService for actor system management
     ☐ Create TopicManagerActor for topic management
     ☐ Create UserTopicActor for per-user subscriptions and history
     ☐ Implement TopicService business logic
     ☐ Implement SSEService for connection management
     ☐ Create TopicController with POST endpoints
     ☐ Create SSEController with GET endpoint for SSE
     ☐ Enable static files and create wwwroot/index.html client
     ☐ Create PushServiceNetTest project
     ☐ Implement unit tests for subscription scenarios

  • 의도된 플래닝이 맞는듯~ 플래닝을 짠후 진행할까요? 묻게되며 yes로 완성까지 쭈욱진행

Image Added



결과

Code Block
themeEmacs
  PushServiceNet 프로젝트를 성공적으로 구현했습니다. 구현된 주요 기능:

  1. 핵심 기능

  - SSE(Server-Sent Events)를 활용한 실시간 푸시 서비스
  - 토픽 기반 메시지 발행/구독 시스템
  - 사용자별 최대 100개 메시지 히스토리 저장
  - Akka.NET 액터 모델을 사용한 상태 관리

  2. API 엔드포인트

  - POST /api/topic/subscribe - 토픽 구독
  - POST /api/topic/unsubscribe - 토픽 구독 해제
  - POST /api/topic/publish - 메시지 발행
  - GET /api/topic/history/{userId} - 사용자 메시지 히스토리
  - GET /api/sse/connect/{userId} - SSE 연결

  3. 웹 클라이언트 (wwwroot/index.html)

  - 왼쪽 패널: SSE 수신 클라이언트
  - 오른쪽 패널: 메시지 발행 클라이언트

  4. 유닛 테스트

  - 사용자별 토픽 구독 테스트
  - 메시지 히스토리 제한 테스트 (100개)
  - 다중 사용자 브로드캐스트 테스트

  프로젝트를 실행하려면:
  1. dotnet build - 프로젝트 빌드
  2. dotnet run --project PushServiceNet - 서버 실행
  3. 브라우저에서 http://localhost:5000 접속하여 테스트 클라이언트 사용
  4. dotnet test - 유닛 테스트 실행



유닛테스트 부터 수행

지침에 작성해고 수행도 해죠하면~ 유닛테스트를 수행하면서 고쳐주긴합니다만~ 작성만 하라고 했으니 요청한 지시 이행을 잘한듯

...

  • 의존성에러가남
    • 의존성 버전을 못맞춰서 오류를 일으킴 : 빌드언어의 특징이기도 한데 오류내용 복붙해서 고쳐달라고하면 고쳐줌
    • AI가 의존버전 맞추기 놀이는 잘못하는듯 ... ( 물론 마이너 소수점 하나 다르다고 호환안되는것은 라이브러리 특수성의 문제 )
    • 하지만 이 케이스에선~ 오리지널 구현 버전 놔두고 엄한 버전을 테스트종속에 추가한듯


  • 플래닝모드 이후 이제부터 바이브 모드(auto-accept editon) 동일세션에서 오류를 고치거나 개선해나감


완성된 유닛테스트 - 수행잘됨

  • 액터를 생성하고 Tell/Ask등 기본기에 충실한 테스트와 필요한 유닛테스트를 잘 만들어낸듯


어플리케이션 실행

  • AI가 어플리케이션도 잘 작성했는지? 유닛테스트 검사가 끝났으니~어플리케이션수행
    • 참고로 플레이버튼 누르지말고, 디버깅모드로 진입할것
      • 런타임 오류들 복붙해서 에러나면 개선요청해야함


실행화면

  • Swagger를 살펴보니 원하는 API를 잘 구분해 뽑은듯 

...

Code Block
themeEmacs
 ## 테스트 클라이언트
- 유닛테스트가 성공하면 그 기반으로 추가로 테스트 웹클라이언트도 작성해주세요
- wwwroot/index.html 에서 SSE를 테스트할 수 있는 클라이언트 기능도 추가하고 싶습니다.
- 클라이언트는 왼쪽/오른쪽 두가지뷰가 있으며 왼쪽화면은 SSE를 수신받는 클라이언트 , 오른쪽뷰는 SEE를 발생하는 클라이언트입니다.
 


테스트 클라이언트

  • 테스트 클라이언트 옵션 꼼꼼히 잘 만들어준듯
  • 유닛테스트 작성시 버전못맞춘거  말고 여기까지 작동까지 잘수행됨

문서화만들기

문서화도 귀찮으니~ 잘작동하고 돌아가면 문서화까지 요청

...

Code Block
themeEmacs
# PushServiceNet - Real-time Push Notification Service

## 개요

PushServiceNet은 ASP.NET Core와 Akka.NET 액터 모델을 기반으로 구축된 실시간 푸시 알림 서비스입니다. Server-Sent Events (SSE)를 활용하여 실시간 통신을 구현하며, 오프라인 사용자를 위한 메시지 히스토리 기능을 제공합니다.

## 주요 특징

- 🚀 **실시간 푸시 알림**: SSE를 통한 단방향 실시간 통신
- 📢 **토픽 기반 발행/구독**: 토픽별 메시지 라우팅
- 💾 **메시지 히스토리**: 사용자당 최대 100개 메시지 저장
- 🎭 **액터 모델**: Akka.NET을 활용한 상태 관리
- 🔄 **자동 재연결**: 하트비트를 통한 연결 상태 관리
- 🧪 **테스트 클라이언트**: 웹 기반 대화형 테스트 도구

## 시스템 아키텍처

### 액터 시스템 구조

```mermaid
graph TD
    A[ActorSystem<br/>PushServiceSystem] --> B[TopicManagerActor<br/>Singleton]
    B --> C[UserTopicActor<br/>user-1]
    B --> D[UserTopicActor<br/>user-2]
    B --> E[UserTopicActor<br/>user-N]
    
    C --> F[Message Queue<br/>+ History]
    D --> G[Message Queue<br/>+ History]
    E --> H[Message Queue<br/>+ History]
```

### 메시지 흐름도

```mermaid
sequenceDiagram
    participant Client
    participant API
    participant TopicService
    participant TopicManager
    participant UserActor
    participant SSEService
    
    Client->>API: POST /api/topic/publish
    API->>TopicService: PublishMessageToTopicAsync()
    TopicService->>TopicManager: PublishToTopic
    TopicManager->>TopicManager: Find subscribers
    loop For each subscriber
        TopicManager->>UserActor: TopicMessage
        UserActor->>UserActor: Store in queue & history
    end
    
    Note over SSEService: Polling loop (1초마다)
    SSEService->>UserActor: CheckForMessages
    UserActor-->>SSEService: TopicMessage or Heartbeat
    SSEService-->>Client: SSE Event
```

## API 엔드포인트

### 1. 토픽 구독
```http
POST /api/topic/subscribe
Content-Type: application/json

{
    "userId": "user1",
    "topicName": "topic-a"
}
```

### 2. 토픽 구독 해제
```http
POST /api/topic/unsubscribe
Content-Type: application/json

{
    "userId": "user1",
    "topicName": "topic-a"
}
```

### 3. 메시지 발행
```http
POST /api/topic/publish
Content-Type: application/json

{
    "topicName": "topic-a",
    "content": "Hello, World!",
    "senderId": "publisher1"  // Optional
}
```

### 4. 메시지 히스토리 조회
```http
GET /api/topic/history/{userId}
```

### 5. SSE 연결
```http
GET /api/sse/connect/{userId}
```

## SSE 이벤트 형식

### 메시지 이벤트
```javascript
event: message
id: 550e8400-e29b-41d4-a716-446655440000
data: {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "event": "message",
    "topic": "topic-a",
    "data": "Hello, World!",
    "timestamp": "2024-01-13T10:30:00Z",
    "senderId": "publisher1"
}
```

### 하트비트 이벤트
```javascript
event: heartbeat
data: {"timestamp":"2024-01-13T10:30:00Z"}
```

## 프로젝트 구조

```
PushServiceNet/
├── PushServiceNet/
│   ├── Actors/
│   │   ├── TopicManagerActor.cs    # 토픽 및 구독 관리
│   │   └── UserTopicActor.cs       # 사용자별 메시지 관리
│   ├── Controllers/
│   │   ├── TopicController.cs      # REST API 엔드포인트
│   │   └── SSEController.cs        # SSE 연결 엔드포인트
│   ├── Models/
│   │   ├── ActorMessages.cs        # 액터 통신 메시지
│   │   ├── Topic.cs                # 토픽 모델
│   │   ├── TopicMessage.cs         # 메시지 모델
│   │   ├── UserSubscription.cs     # 구독 정보 모델
│   │   └── SSENotification.cs      # SSE 알림 모델
│   ├── Services/
│   │   ├── AkkaService.cs          # Akka 시스템 관리
│   │   ├── TopicService.cs         # 비즈니스 로직
│   │   └── SSEService.cs           # SSE 연결 관리
│   ├── wwwroot/
│   │   └── index.html              # 테스트 클라이언트
│   └── Program.cs                  # 애플리케이션 진입점
└── PushServiceNetTest/
    └── TopicSubscriptionTests.cs   # 유닛 테스트

```

## 핵심 컴포넌트

### TopicManagerActor
- 모든 토픽과 구독 관계 관리
- 사용자 액터 생성 및 관리
- 메시지 라우팅 담당

### UserTopicActor
- 사용자별 구독 토픽 목록 관리
- 메시지 큐 및 히스토리 관리 (최대 100개)
- SSE 전송을 위한 메시지 대기열 처리

### SSEService
- SSE 연결 수명 주기 관리
- 1초마다 메시지 폴링
- 하트비트를 통한 연결 유지

## 사용 시나리오

### 시나리오 1: 실시간 채팅
```mermaid
graph LR
    A[User1] -->|Subscribe| B[chat-room-1]
    C[User2] -->|Subscribe| B
    D[User3] -->|Publish| B
    B -->|SSE| A
    B -->|SSE| C
```

### 시나리오 2: 시스템 알림
```mermaid
graph LR
    A[Admin] -->|Publish| B[system-alerts]
    C[User1] -->|Subscribe| B
    D[User2] -->|Subscribe| B
    E[User3] -->|Subscribe| B
    B -->|Broadcast| C
    B -->|Broadcast| D
    B -->|Broadcast| E
```

## 실행 방법

### 1. 프로젝트 빌드
```bash
dotnet build
```

### 2. 서버 실행
```bash
dotnet run --project PushServiceNet
```

### 3. 테스트 클라이언트 접속
브라우저에서 `http://localhost:5000` 접속

### 4. 유닛 테스트 실행
```bash
dotnet test
```

## 테스트 시나리오

### 1. 선택적 메시지 전달
- User1은 topic-a 구독, User2는 topic-b 구독
- topic-a로 메시지 발행 시 User1만 수신

### 2. 메시지 히스토리
- 오프라인 상태에서 발생한 메시지를 최대 100개까지 조회 가능

### 3. 다중 사용자 브로드캐스트
- 동일 토픽을 구독한 모든 사용자가 메시지 수신

## 성능 고려사항

- **액터 모델**: 동시성 처리 및 상태 격리
- **메시지 히스토리 제한**: 메모리 사용량 관리 (100개)
- **SSE 폴링 주기**: 1초 (조정 가능)
- **하트비트**: 연결 상태 모니터링

## 확장 가능성

1. **영구 저장소**: 메시지 히스토리를 데이터베이스에 저장
2. **클러스터링**: Akka.Cluster를 활용한 분산 처리
3. **인증/인가**: JWT 토큰 기반 보안
4. **메시지 필터링**: 사용자별 맞춤 필터
5. **우선순위 큐**: 중요도에 따른 메시지 처리

## 라이선스

이 프로젝트는 MIT 라이선스 하에 배포됩니다.


이 실험에의해 완성된 최종코드(프롬프트 포함)


동일한 컨셉을 타진영 언어로도 시도

NEXT : SSE 푸시시스템 자율주행으로 만들기 by 코프링


마치며

Image Added

이 실험을 통해 얻은것은 CQRS패턴과 같은 액터모델도 생성형 프로그래밍이 가능하다란점과 도메인 로직이 그렇게 복잡하지않고

단방향 푸싱 시스템이긴하나 실수없이 한방에 완성한점은 다소 놀라움~삽질하는거 고쳐주느라 바이브 많이 할줄예상했으나  의존오류말고는 중간에 개입한게 거의 없이 완성되었으며 cluade-code를 조금더 연마해 어려운것을 시키는 변종실험 예정입니다.

상위컨텐츠 : Vibe Coding Actor Model

  • 그동안 연구했던 액터모델 활동의 고급패턴들을 생성형으로 시도하고 프롬프트들을 지속 공유예정입니다.