FlipNote 서비스의 그룹 백엔드 레포지토리입니다.
- Java 17 이상
- Gradle 8 이상
- MySQL 8
- RabbitMQ
- gRPC 서비스 (User · Image) 실행 중
./gradlew build아래 환경 변수를 시스템 또는 배포 환경에 설정합니다.
# ─── 데이터베이스 ──────────────────────────────────────
SPRING_DATASOURCE_URL=
SPRING_DATASOURCE_USERNAME=
SPRING_DATASOURCE_PASSWORD=
# ─── RabbitMQ ─────────────────────────────────────────
RABBITMQ_HOST=
RABBITMQ_PORT=
RABBITMQ_USERNAME=
RABBITMQ_PASSWORD=
# ─── gRPC 서비스 URL ───────────────────────────────────
GRPC_USER_URL=
GRPC_IMAGE_URL=
# ─── 이메일 (Resend) ───────────────────────────────────
RESEND_API_KEY=
RESEND_FROM_EMAIL=
# ─── 기본 이미지 URL ───────────────────────────────────
# 그룹 기본 이미지로 사용할 URL로 변경하세요
IMAGE_DEFAULT_GROUP=
# ─── 기타 ─────────────────────────────────────────────
APP_CLIENT_URL=./gradlew bootRun- HTTP API:
http://localhost:8084 - gRPC:
localhost:9094 - Swagger:
http://localhost:8084/groups/swagger-ui.html
./gradlew bootJarmain 브랜치에 push 시 GitHub Actions가 자동으로 아래 과정을 실행합니다.
- Docker 이미지 빌드
- GitHub Container Registry(
ghcr.io)에 push - Slack 알림 (성공/실패)
배포에 필요한 시크릿은 GitHub Repository → Settings → Secrets and variables → Actions에 등록해야 합니다.
| Secret | 설명 |
|---|---|
ORG_PAT |
GHCR push용 Personal Access Token |
간략화 버전
src/main/java/flipnote/group/
├── adapter/ # 입출력 어댑터 (REST 컨트롤러, gRPC 엔드포인트, 영속성)
├── api/ # 공통 응답 형식, 예외 핸들러, DTO
├── application/ # 유스케이스, 커맨드/결과 포트, 서비스
├── domain/ # 도메인 모델, 정책, 이벤트
├── global/ # 설정, 상수, 응답 래퍼
└── infrastructure/ # 이메일, 메시징(RabbitMQ), QueryDSL 리포지토리
상세 구조 보기
src/main/java/flipnote/group/
├── GroupApplication.java # 애플리케이션 진입점
│
├── adapter/
│ ├── in/
│ │ ├── grpc/
│ │ │ └── GroupCommandService.java # gRPC 서버 엔드포인트
│ │ └── web/ # REST 컨트롤러
│ │ ├── GroupController.java
│ │ ├── InviteController.java
│ │ ├── JoinController.java
│ │ ├── MeController.java
│ │ ├── MemberController.java
│ │ └── PermissionController.java
│ └── out/
│ ├── entity/ # JPA 엔티티
│ │ ├── GroupEntity.java
│ │ ├── GroupMemberEntity.java
│ │ ├── InviteEntity.java
│ │ ├── JoinEntity.java
│ │ ├── PermissionEntity.java
│ │ └── RoleEntity.java
│ └── persistence/ # 포트 구현체 (리포지토리 어댑터)
│ ├── GroupRepositoryAdapter.java
│ ├── GroupMemberRepositoryAdapter.java
│ ├── GroupRoleRepositoryAdapter.java
│ ├── InviteRepositoryAdapter.java
│ └── JoinRepositoryAdapter.java
│
├── api/
│ ├── advice/
│ │ └── GlobalExceptionHandler.java
│ └── dto/
│ ├── request/ # 요청 DTO (23개)
│ └── response/ # 응답 DTO (17개)
│
├── application/
│ ├── dto/ # 메시지 DTO (RabbitMQ)
│ ├── listener/
│ │ └── GuestInviteEventListener.java
│ ├── port/
│ │ ├── in/ # 유스케이스 인터페이스
│ │ │ ├── command/ # 커맨드 객체 (29개)
│ │ │ └── result/ # 결과 객체 (17개)
│ │ └── out/ # 출력 포트 인터페이스
│ │ ├── GroupRepositoryPort.java
│ │ ├── GroupMemberRepositoryPort.java
│ │ ├── GroupRoleRepositoryPort.java
│ │ ├── InviteRepositoryPort.java
│ │ ├── JoinRepositoryPort.java
│ │ └── NotificationMessagePort.java
│ └── service/ # 유스케이스 구현체 (23개)
│
├── domain/
│ ├── event/
│ │ └── GuestInviteCreatedEvent.java
│ ├── model/
│ │ ├── group/ # Group, Category, Visibility, JoinPolicy
│ │ ├── invite/ # InviteInfo, InviteStatus, InviteResponseStatus
│ │ ├── join/ # JoinInfo, JoinStatus
│ │ ├── member/ # MemberInfo, GroupMemberRole
│ │ ├── permission/ # GroupPermission
│ │ └── role/ # GroupRole
│ └── policy/
│ ├── BusinessException.java
│ └── ErrorCode.java
│
├── global/
│ ├── config/ # 설정 (Async, Auditing, gRPC, QueryDSL, Swagger 등)
│ ├── constants/
│ │ └── HttpConstants.java
│ └── response/
│ ├── ApiResponse.java
│ └── ApiResponseAdvice.java
│
└── infrastructure/
├── email/
│ ├── EmailService.java
│ └── ResendEmailService.java # Resend 이메일 발송 구현체
├── messaging/
│ ├── RabbitMQConfig.java
│ └── GroupJoinRequestMessageProducer.java
└── persistence/
├── jpa/ # Spring Data JPA 리포지토리
└── querydsl/ # QueryDSL 커스텀 쿼리 구현체
src/main/proto/
├── group.proto # GroupCommandService (그룹명 조회, 멤버십 확인, 내 그룹 목록)
├── image.proto # ImageCommandService (이미지 URL 조회/변경)
└── user.proto # UserQueryService (유저 조회)
src/main/resources/
├── application.yml
└── templates/email/
└── guest-group-invitation.html # 게스트 초대 이메일 템플릿