Skip to content

[FEAT] MEET-01 회의 안건 저장 및 개설 정책 검증 - #430

Merged
MNPPI223 merged 1 commit into
developfrom
feat/meet-01-agenda-validation
Aug 12, 2026
Merged

[FEAT] MEET-01 회의 안건 저장 및 개설 정책 검증#430
MNPPI223 merged 1 commit into
developfrom
feat/meet-01-agenda-validation

Conversation

@mosungjin

@mosungjin mosungjin commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

📌 연관 이슈

해결하거나 관련된 이슈 번호를 적어주세요.


📝 작업 내용

구현한 주요 기능 및 작업 내역을 요약해 주세요.

  • MEET-01 요청에 mainTopic, subTopics 필드를 추가했습니다.
  • 회의 저장 후 MAIN 안건을 먼저 저장하고, 생성된 MAIN ID를 SUB 안건의 parent_topic_id로 연결했습니다.
  • 회의·예약 슬롯·참석자·안건 저장을 하나의 트랜잭션으로 처리했습니다.
  • 인증 principal의 역할을 회의 개설 명령에 전달하도록 변경했습니다.
  • OWNER는 relatedActionId를 입력할 수 없고, OWNER 외 역할은 반드시 입력하도록 검증했습니다.
  • host를 제외한 참석자가 최소 1명 이상 존재하도록 검증했습니다.
  • 대주제 1개와 소주제 1개 이상을 필수로 검증했습니다.
  • 안건 저장 및 역할·참석자 정책에 대한 단위·영속성 테스트를 추가했습니다.

🖥️ 프론트엔드 연동 가이드 (API 명세)

프론트엔드 팀원들이 API를 바로 연동하고 테스트할 수 있도록 핵심 정보를 작성해 주세요.

1. 주요 엔드포인트

  • POST /api/meetings : 회의실 예약과 함께 회의 및 대주제·소주제를 생성합니다.

2. 요청 파라미터 (Request)

파라미터명 위치 (Query/Body/Path) 필수 여부 설명
title Body 필수 회의 제목, 최대 200자
projectId Body 필수 회의가 속한 프로젝트 ID
meetingRoomId Body 필수 예약할 회의실 ID
startAt Body 필수 시작 일시, yyyy-MM-dd'T'HH:mm:ss
endAt Body 필수 종료 일시, startAt보다 늦어야 함
recordingConsent Body 선택 생략 시 false
relatedActionId Body 역할별 필수 OWNER는 입력 금지, OWNER 외 역할은 필수
attendeeMemberIds Body 필수 host를 제외한 참석자 최소 1명
mainTopic Body 필수 대주제, 공백 불가, 최대 300자
subTopics Body 필수 소주제 목록, 최소 1개, 항목당 최대 300자

요청 예시

{
  "title": "A커머스 온보딩 킥오프",
  "projectId": 12,
  "meetingRoomId": 2,
  "startAt": "2026-08-14T14:00:00",
  "endAt": "2026-08-14T14:30:00",
  "recordingConsent": false,
  "relatedActionId": 305,
  "attendeeMemberIds": [7, 11, 15],
  "mainTopic": "스프린트 진행 상황",
  "subTopics": [
    "개발 진행률 점검",
    "배포 일정 합의"
  ]
}

3. 정상 응답 예시 (201 Created)

응답 JSON 보기 (클릭)
{
  "httpStatus": 201,
  "message": "회의를 예약했습니다.",
  "data": {
    "meetingId": 91,
    "status": "SCHEDULED",
    "title": "A커머스 온보딩 킥오프",
    "startAt": "2026-08-14T14:00:00",
    "endAt": "2026-08-14T14:30:00",
    "recordingConsent": false,
    "meetingRoom": {
      "meetingRoomId": 2,
      "name": "회의실 B",
      "location": "박애관 422호"
    },
    "host": {
      "memberId": 3,
      "name": "지우"
    },
    "attendees": [
      {
        "memberId": 3,
        "name": "지우",
        "teamName": "기획"
      },
      {
        "memberId": 7,
        "name": "이든",
        "teamName": "개발"
      }
    ]
  }
}

4. ⚠️ 프론트엔드 참고 및 주의사항

  • mainTopicsubTopics는 모두 필수입니다.
  • subTopics에는 최소 한 개 이상의 소주제가 필요합니다.
  • attendeeMemberIds에는 host 이외의 참석자가 최소 한 명 필요합니다.
  • host가 목록에 포함되더라도 서버에서 중복 제거되며, host 외 참석자 수에는 포함되지 않습니다.
  • OWNER는 relatedActionId를 보내면 안 됩니다.
  • ADMIN·LEADER·MEMBER는 relatedActionId를 반드시 보내야 합니다.
  • 화면의 parentTeamActionId는 요청의 relatedActionId로 전달하면 됩니다.
  • 이번 작업에는 회의의 teamId와 상위 팀 액션의 teamId 일치 검증이 포함되지 않았습니다. C 도메인의 액션 팀 조회 계약이 준비된 후 별도 작업으로 연결합니다.

🚨 주요 에러 코드 및 예외 (Exceptions)

프론트엔드에서 에러 핸들링을 할 수 있도록 주요 예외 상황을 명시해 주세요.

  • MT-002 : 같은 회의실과 예약 시간이 중복된 경우
  • MT-003 : 종료 시각이 시작 시각보다 늦지 않은 경우
  • MT-004 : 회의실 이용 가능 시간을 벗어난 경우
  • MT-005 : 시작 또는 종료 시각이 30분 단위가 아닌 경우
  • MT-010 : 다른 회사 또는 삭제된 구성원이 참석자에 포함된 경우
  • MT-012 : 과거 시각으로 회의를 예약한 경우
  • MT-015 : 대주제 또는 하나 이상의 소주제가 누락되거나 올바르지 않은 경우
  • MT-016 : 개설자 역할과 relatedActionId 입력 정책이 일치하지 않는 경우
  • MT-017 : host 외 참석자가 한 명도 없는 경우
  • MR-001 : 존재하지 않거나 비활성화된 회의실인 경우
  • PJ-001 : 존재하지 않는 프로젝트인 경우
  • AC-001 : 존재하지 않는 상위 팀 액션인 경우

💡 백엔드 리뷰 포인트 (Backend Review)

백엔드 팀원들이 코드 리뷰 시 집중해서 봐주었으면 하는 부분을 적어주세요.

  • 아키텍처 및 도메인: 안건 저장을 MeetingTopicRepository 포트와 JPA Adapter로 분리했습니다.
  • 트랜잭션: 회의 저장 후 MAIN → SUB 순서로 저장하며, 안건 저장 실패 시 회의·슬롯·참석자까지 함께 롤백됩니다.
  • 권한 정책: 요청 본문이 아닌 인증 principal의 역할을 이용해 relatedActionId 정책을 검증합니다.
  • 검증 순서: 역할·참석자·안건 기본 검증을 외부 도메인 조회 전에 수행합니다.
  • 후속 작업: 액션의 실제 teamId 조회 계약이 추가되면 회의 팀과 상위 팀 액션 팀의 일치 여부를 검증해야 합니다.

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 주석 및 콘솔 로그를 제거했습니다.
  • API 기능이 정상 동작하는지 테스트했습니다.
  • 예외(잘못된 값) 상황에 대한 검증 및 테스트를 통과했습니다.
  • meeting 도메인 전체 테스트를 통과했습니다.
  • 다른 담당 도메인의 코드를 수정하지 않았습니다.

Summary by CodeRabbit

  • 새로운 기능

    • 회의 생성 시 대주제와 하나 이상의 소주제를 입력할 수 있습니다.
    • 소주제는 입력 순서대로 회의 안건에 저장됩니다.
    • 인증된 개설자 역할에 따라 관련 액션 정책을 확인합니다.
    • 개설자 외 참석자를 최소 한 명 이상 선택할 수 있도록 지원합니다.
  • 버그 수정

    • 필수 안건, 참석자, 역할 조건이 충족되지 않을 때 명확한 오류 메시지를 제공합니다.
    • 회의 안건 입력값의 공백, 누락 및 길이를 검증합니다.

@mosungjin
mosungjin requested a review from MNPPI223 August 12, 2026 06:15
@mosungjin mosungjin self-assigned this Aug 12, 2026
@mosungjin mosungjin added the enhancement New feature or request label Aug 12, 2026
@mosungjin mosungjin added this to Z Aug 12, 2026
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7858600b-bbb3-4832-873e-f1bf74f13821

📥 Commits

Reviewing files that changed from the base of the PR and between 2373f24 and ef61a35.

📒 Files selected for processing (11)
  • src/main/java/com/module06/backend/meeting/application/command/CreateMeetingCommand.java
  • src/main/java/com/module06/backend/meeting/application/service/MeetingService.java
  • src/main/java/com/module06/backend/meeting/domain/model/MeetingAgenda.java
  • src/main/java/com/module06/backend/meeting/domain/repository/MeetingTopicRepository.java
  • src/main/java/com/module06/backend/meeting/exception/MeetingErrorCode.java
  • src/main/java/com/module06/backend/meeting/infrastructure/persistence/adapter/MeetingTopicPersistenceAdapter.java
  • src/main/java/com/module06/backend/meeting/presentation/api/MeetingController.java
  • src/main/java/com/module06/backend/meeting/presentation/api/request/CreateMeetingRequest.java
  • src/test/java/com/module06/backend/meeting/application/service/MeetingServiceTest.java
  • src/test/java/com/module06/backend/meeting/infrastructure/persistence/adapter/MeetingTopicPersistenceAdapterTest.java
  • src/test/java/com/module06/backend/meeting/presentation/api/MeetingControllerTest.java

📝 Walkthrough

Walkthrough

회의 생성 요청에 개설자 역할과 필수 안건을 추가했습니다. 서비스는 역할별 액션 정책과 참석자 조건을 검증합니다. 검증된 MAIN·SUB 안건은 회의 생성과 같은 트랜잭션에서 저장합니다.

Changes

회의 생성 흐름

Layer / File(s) Summary
생성 요청 및 명령 계약
src/main/java/com/module06/backend/meeting/presentation/api/..., src/main/java/com/module06/backend/meeting/application/command/CreateMeetingCommand.java, src/test/java/com/module06/backend/meeting/presentation/api/MeetingControllerTest.java
Controller가 인증 principal의 role을 명령에 전달합니다. 요청과 명령에 mainTopic, subTopics, hostRole을 추가했습니다. 참석자 최소 크기를 검증합니다.
회의 생성 검증 및 안건 모델
src/main/java/com/module06/backend/meeting/domain/model/MeetingAgenda.java, src/main/java/com/module06/backend/meeting/application/service/MeetingService.java, src/main/java/com/module06/backend/meeting/exception/MeetingErrorCode.java, src/test/java/com/module06/backend/meeting/application/service/MeetingServiceTest.java
MeetingAgenda가 안건을 검증하고 문자열을 정규화합니다. 서비스가 역할별 relatedActionId, host 외 참석자, hostRole을 검증합니다. MT-015~MT-017 오류 코드와 관련 테스트를 추가했습니다.
안건 계층 영속화
src/main/java/com/module06/backend/meeting/domain/repository/MeetingTopicRepository.java, src/main/java/com/module06/backend/meeting/infrastructure/persistence/adapter/MeetingTopicPersistenceAdapter.java, src/test/java/com/module06/backend/meeting/infrastructure/persistence/adapter/MeetingTopicPersistenceAdapterTest.java
저장 계약을 추가했습니다. 어댑터가 MAIN을 먼저 저장하고 생성된 식별자를 부모로 사용해 SUB를 입력 순서대로 저장합니다. JPA 통합 테스트가 유형, 순서, 부모 식별자를 검증합니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant MeetingController
  participant MeetingService
  participant MeetingAgenda
  participant MeetingTopicPersistenceAdapter

  Client->>MeetingController: 회의 생성 요청과 인증 principal
  MeetingController->>MeetingService: CreateMeetingCommand 전달
  MeetingService->>MeetingAgenda: 안건 검증 및 정규화
  MeetingService->>MeetingService: 역할·액션·참석자 조건 검증
  MeetingService->>MeetingTopicPersistenceAdapter: meetingId와 MeetingAgenda 전달
  MeetingTopicPersistenceAdapter-->>MeetingService: MAIN·SUB 안건 저장 완료
  MeetingService-->>MeetingController: 생성된 회의 반환
Loading

Possibly related PRs

  • Z-Groupware/BACKEND#59: 회의 생성 명령, 서비스, Controller, 오류 처리의 기존 흐름을 확장합니다.
  • Z-Groupware/BACKEND#66: 회의 안건 도메인과 영속화 흐름을 함께 변경합니다.
  • Z-Groupware/BACKEND#71: 저장된 안건의 식별자와 부모 식별자를 회의 조회 흐름에 연결합니다.

Suggested reviewers: mnppi223

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ❓ Inconclusive 대부분의 요구사항을 충족하지만, 안건 저장 실패 시 관련 데이터의 원자적 롤백 구현과 테스트는 변경 요약에서 확인되지 않습니다. 트랜잭션 경계와 안건 저장 실패 시 회의·슬롯·참석자 롤백 테스트를 추가하거나 해당 동작을 확인할 근거를 제시하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 회의 안건 저장과 역할별 개설 정책 검증이라는 주요 변경을 정확하고 간결하게 설명합니다.
Out of Scope Changes check ✅ Passed 변경 사항이 회의 안건 저장, 개설 정책 검증, API 전달, 영속화 및 관련 테스트 범위에 포함됩니다.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/meet-01-agenda-validation

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

@github-project-automation github-project-automation Bot moved this to Todo in Z Aug 12, 2026

@MNPPI223 MNPPI223 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

확인했습니다.
고생하셨어요

@MNPPI223
MNPPI223 merged commit b9f78e3 into develop Aug 12, 2026
15 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in Z Aug 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[FEAT] MEET-01 회의 안건 저장 및 역할별 개설 검증

2 participants