FlipNote 서비스의 이미지 백엔드 레포지토리입니다.
- Java 17 이상
- Gradle 8 이상
- MySQL 8
- Redis
- AWS S3 버킷
- gRPC 서비스 (Group) 실행 중
./gradlew build아래 환경 변수를 시스템 또는 배포 환경에 설정합니다.
# ─── 데이터베이스 ──────────────────────────────────────
DB_URL=
SPRING_DATASOURCE_USERNAME=
SPRING_DATASOURCE_PASSWORD=
# ─── Redis ────────────────────────────────────────────
SPRING_DATA_REDIS_HOST=
SPRING_DATA_REDIS_PORT=
SPRING_DATA_REDIS_PASSWORD=
# ─── AWS S3 ───────────────────────────────────────────
S3_BUCKET_NAME=
S3_BUCKET_REGION=
S3_ACCESS_KEY=
S3_SECRET_KEY=./gradlew bootRun- HTTP API:
http://localhost:8082 - gRPC:
localhost:9092
./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/image/
├── adapter/ # 입출력 어댑터 (REST 컨트롤러, gRPC 엔드포인트, 영속성, S3)
├── api/ # 공통 응답 형식, DTO
├── application/ # 유스케이스, 커맨드/결과 포트, 서비스
├── domain/ # 도메인 모델, 정책
├── global/ # 설정, 상수
└── infrastructure/ # S3, QueryDSL 리포지토리
상세 구조 보기
src/main/java/flipnote/image/
├── ImageApplication.java # 애플리케이션 진입점
│
├── adapter/
│ ├── in/
│ │ ├── grpc/
│ │ │ └── ImageCommandGrpcService.java # gRPC 서버 엔드포인트
│ │ └── web/
│ │ └── ImageController.java # REST 컨트롤러
│ └── out/
│ ├── S3ImageStorageAdapter.java # S3 이미지 업로드/삭제
│ ├── other/
│ │ └── DefaultImageAdapter.java # 기본 이미지 URL 제공
│ ├── persistence/
│ │ ├── ImageRefRepositoryAdapter.java
│ │ ├── ImageRepositoryAdapter.java
│ │ └── ImageS3KeyAdapter.java
│ └── storage/s3/
│ ├── S3ObjectMetadataAdapter.java # S3 객체 메타데이터 조회
│ ├── S3PresignedUrlAdapter.java # Presigned URL 생성
│ └── S3PublicUrlAdapter.java # 공개 URL 생성
│
├── api/
│ └── dto/
│ ├── request/
│ │ └── IssuePresignedUrlRequestDto.java
│ └── response/
│ └── IssuePresignedUrlResponseDto.java
│
├── application/
│ ├── port/
│ │ ├── in/ # 유스케이스 인터페이스
│ │ │ ├── ActivateImageUseCase.java
│ │ │ ├── ChangeImageUseCase.java
│ │ │ ├── DeleteImageUseCase.java
│ │ │ ├── GetImageUrlByReferenceUseCase.java
│ │ │ ├── IssuePresignedUrlUseCase.java
│ │ │ ├── command/
│ │ │ │ └── IssuePresignedUrlCommand.java
│ │ │ └── result/
│ │ │ ├── ChangeImageResult.java
│ │ │ └── IssuePresignedUrlResult.java
│ │ └── out/ # 출력 포트 인터페이스
│ │ ├── DefaultImagePort.java
│ │ ├── ImagePort.java
│ │ ├── ImageRefPort.java
│ │ ├── ImageS3KeyPort.java
│ │ ├── ImageStoragePort.java
│ │ ├── ObjectMetadataPort.java
│ │ ├── PresignedUrlPort.java
│ │ └── PublicUrlPort.java
│ └── service/ # 유스케이스 구현체
│ ├── ActivateImageService.java
│ ├── ChangeImageService.java
│ ├── DeleteImageService.java
│ ├── GetImageUrlByReferenceService.java
│ └── IssuePresignedUrlService.java
│
├── domain/
│ ├── model/
│ │ ├── BaseEntity.java
│ │ ├── image/
│ │ │ ├── Image.java # 이미지 핵심 도메인 (hash, s3Key, mimeType 등)
│ │ │ └── ImageMeta.java
│ │ └── reference/
│ │ ├── ImageRef.java # 이미지-참조 연결 (유저/그룹/카드셋)
│ │ ├── Reference.java
│ │ └── ReferenceType.java # USER | GROUP | CARD_SET
│ └── policy/
│ └── ImageNamingPolicy.java
│
└── infrastructure/
├── config/
│ ├── AuditingConfig.java
│ ├── QuerydslConfig.java
│ └── S3Config.java
├── persistence/
│ ├── jpa/
│ │ ├── ImageRepository.java
│ │ └── ImageRefRepository.java
│ └── querydsl/
│ ├── ImageRepositoryCustom.java
│ ├── ImageRepositoryImpl.java
│ ├── ImageRefRepositoryCustom.java
│ └── ImageRefRepositoryImpl.java
└── s3/
(AWS S3 클라이언트 설정)
src/main/proto/
├── image.proto # ImageCommandService (URL 조회, 이미지 활성화/변경/삭제)
└── group.proto # GroupCommandService (그룹명 조회)
src/main/resources/
└── application.yml