Skip to content

feat/#50-app: 운세 카드 관련 코드 이관#52

Open
jher235 wants to merge 24 commits into
developfrom
feat/#50
Open

feat/#50-app: 운세 카드 관련 코드 이관#52
jher235 wants to merge 24 commits into
developfrom
feat/#50

Conversation

@jher235

@jher235 jher235 commented Jul 16, 2026

Copy link
Copy Markdown
Member

Related Issue 🚀

Work Description ✏️

fortune-api-controller

Method Endpoint Description
GET /api/v2/fortune/word 오늘의 운세 단어 조회
GET /api/v2/fortune/card/today 오늘의 운세 카드 조회

관련 작업:

  • domain-app: FortuneWord, FortuneCard, UserFortune 도메인 모델 추가
  • domain-app: FortuneService 유스케이스 구현
    • 오늘의 운세 단어 조회 (없거나 날짜가 지났으면 새로 뽑아 갱신)
    • 오늘의 운세 카드 조회
  • domain-app: FortuneFacade 추가 - 운세 단어에 유저 이름을 붙이는 조합만 담당하고 유저 조회는 domain-user의 AuthUserPort에 위임함
  • domain-app: FortuneCardRepositoryPort, FortuneWordRepositoryPort, UserFortuneRepositoryPort 및 FortuneException, FortuneFailure 추가
  • domain-app: soptamp 유저 port 계약 추가 (SoptampUser, SoptampUserQueryPort, SoptampPointUpdaterPort) - 구현 없이 인터페이스만 먼저 두어 soptamp 이관 작업이 이 계약에 대고 병렬로 진행되게 함
  • storage: FortuneCardEntity, FortuneWordEntity, UserFortuneEntity 및 adapter, querydsl 구현 추가
    • domain-app 소속 도메인의 storage 코드는 db/app/<도메인> 경로에 둠 (storage 패키지가 도메인 모듈 구조를 미러링하도록)
  • api: FortuneApi, FortuneController, response DTO 추가
  • api: AppExceptionHandler, AppFailureResponse 추가 - 앱 채널(controller/app)만 구 앱 서버의 FailureResponse({message, status, errors}) 에러 포맷으로 응답하게 함
  • flyway V1에 fortune 테이블 3개 추가 (fortune_card, fortune_word, user_fortune)

PR Point 📸

  • 앱 클라이언트가 아직 구 앱 서버 에러 포맷을 파싱하고 있어서, 앱 채널 에러 응답은 통합 표준 BaseResponse가 아니라 구 FailureResponse 모양을 그대로 보존했습니다. 이 부분 클라와 논의가 필요한데,, 사용하는 부분이 있다면, 다음 기수 앱팀의 개발자 풀이 많진 않을 것으로 예상되어서... 앱팀은 기존 응답 형태를 유지해야할 가능성이 높아보입니다. -> 에러 뿐만이 아니라 성공 응답도요...
  • 그리고 지금 컨트롤러는 app에서 출석 등의 코드가 들어가있고 storage에서는 공홈 팀으로 출석 레포지토리 등의 코드가 들어가있더라구요. 이 부분 의도된건가요?
  • 추가로 app은 storage 모듈에서 db/app/{domain}의 형태로 패키지를 가져가려 합니다..! (물론 민경이랑 얘기는 아직 안하긴 했는데.. ㅎㅎ) ++ dto에서 request, response도 나누고 싶었는데, 컨벤션에서 벗어나는 것 같아서 건드리진 않았어요!

@jher235 jher235 self-assigned this Jul 16, 2026
@jher235 jher235 added 🎁 feature 새로운 기능을 개발하거나 추가, 변경할 경우 💜 app labels Jul 16, 2026
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 74ad2053-b124-482e-8158-38ed4b33842e

📥 Commits

Reviewing files that changed from the base of the PR and between af67de3 and bede8be.

📒 Files selected for processing (1)
  • api/src/main/java/org/sopt/makers/api/common/exception/GlobalExceptionHandler.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • api/src/main/java/org/sopt/makers/api/common/exception/GlobalExceptionHandler.java

Summary by CodeRabbit

  • 새로운 기능
    • 앱에서 오늘의 솝마디(날짜 선택)와 오늘의 운세카드를 조회할 수 있습니다.
    • 운세카드의 이미지 및 색상 정보도 함께 제공됩니다.
    • 사용자별 오늘 운세가 자동으로 배정되며, 날짜가 바뀌면 새 운세로 갱신됩니다.
  • 버그 수정
    • 필수 파라미터 누락 또는 날짜 형식이 올바르지 않을 때 일관된 400 오류 응답을 제공합니다.
    • 사용자에게 오늘 운세가 없을 때 404 오류 응답을 제공합니다.

Walkthrough

운세 도메인, 사용자별 운세 갱신 로직, 운세 카드·단어 영속화, 앱 API와 오류 응답 및 테스트가 추가되었습니다. Soptamp 사용자 모델과 포트 계약도 함께 추가되었습니다.

Changes

운세 기능

Layer / File(s) Summary
운세 도메인과 갱신 로직
domain/domain-app/.../fortune/...
운세 모델, 저장소 포트, 예외 코드, 무작위 단어 선택과 사용자별 오늘 운세 생성·갱신 로직을 추가했습니다.
운세 영속화
api/src/main/resources/db/migration/V1__create_initial_schema.sql, storage/.../fortune/...
운세 테이블과 JPA 엔티티, 저장소 어댑터, Querydsl 기반 카드 조회를 추가했습니다.
앱 운세 API와 오류 응답
api/src/main/java/.../fortune/..., api/src/main/java/.../common/exception/...
오늘의 운세 단어·카드 엔드포인트, 응답 DTO, 성공 코드와 누락 파라미터 예외 처리를 추가했습니다.
운세 기능 검증
api/src/test/..., domain/domain-app/src/test/...
MockMvc 기반 API 응답과 서비스의 신규 할당·갱신·조회 동작을 검증했습니다.

Soptamp 포트 이관

Layer / File(s) Summary
Soptamp 계약
domain/domain-app/src/main/java/.../soptamp/...
Soptamp 사용자 레코드와 사용자 조회·포인트 갱신 포트 메서드 계약을 추가했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant FortuneController
  participant FortuneFacade
  participant FortuneService
  participant FortuneCardRepositoryAdapter
  Client->>FortuneController: GET /api/v2/fortune/word or /card/today
  FortuneController->>FortuneFacade: getTodayFortuneWord(userId, todayDate)
  FortuneFacade->>FortuneService: getTodayFortuneWord(userId, todayDate)
  FortuneService->>FortuneCardRepositoryAdapter: getTodayFortuneCard(userId)
  FortuneCardRepositoryAdapter-->>FortuneService: FortuneCard
  FortuneService-->>FortuneController: fortune result
  FortuneController-->>Client: 성공 응답
Loading

Suggested reviewers: sung-silver, kyoooooong

Poem

당근처럼 둥근 운세가 왔네
토끼는 오늘의 카드를 골랐네
단어는 새로, 날짜는 또렷
API 문도 활짝 열렸네
깡충! 테스트도 함께 뛰네

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 운세 관련 이관과 gradle/Soptamp user 포트는 반영됐지만, 이슈 #50의 Playground/Platform 포트 이관 근거는 보이지 않습니다. Playground/Platform 포트 이관 변경을 추가하거나, 이미 별도 PR이라면 이슈와의 연관성을 설명해 주세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 운세 관련 코드 이관이라는 핵심 변경을 잘 요약하고 있어 PR 내용과 대체로 일치합니다.
Description check ✅ Passed Related Issue, Work Description, PR Point가 모두 포함되어 템플릿 요구사항을 대부분 충족합니다.
Out of Scope Changes check ✅ Passed 추가된 변경은 운세 기능, 관련 포트/DB/테스트, 이관 지원 설정으로 PR 목적과 일치합니다.
✨ 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/#50

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@jher235 jher235 changed the title feat/#50-app 운세 카드 관련 코드 이관 feat/#50-app: 운세 카드 관련 코드 이관 Jul 16, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request migrates the fortune (운세) feature from the legacy app server, introducing new database schemas, domain entities, services, and a dedicated exception handler to preserve the legacy API contract. The review feedback highlights critical issues, including a potential application crash in FortuneWordIdGenerator if the database is unseeded, a logical bug in FortuneService that could return stale fortune cards, missing foreign key constraints in the migration script, and a missing exception handler for missing request parameters that could break the legacy response format.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +16 to +19
public Long generate() {
List<Long> ids = fortuneWordRepositoryPort.findAllIds();
return ids.get(random.nextInt(ids.size()));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

If the fortune_word table is empty (e.g., during initial setup or if seeding fails), fortuneWordRepositoryPort.findAllIds() will return an empty list. This will cause random.nextInt(0) to throw an IllegalArgumentException and crash the application. Additionally, calling findAllIds() on every generation loads all IDs into memory. Since fortune words are static master data, consider caching these IDs or using a more efficient query (e.g., count + offset) if the dataset grows large. For now, let's add a defensive check to handle the empty list case gracefully.

  public Long generate() {
    List<Long> ids = fortuneWordRepositoryPort.findAllIds();
    if (ids.isEmpty()) {
      throw new IllegalStateException("No fortune words found in the database. Please ensure the database is seeded.");
    }
    return ids.get(random.nextInt(ids.size()));
  }

Comment on lines +39 to +43
public FortuneCard getTodayFortuneCard(Long userId) {
return fortuneCardRepositoryPort
.findTodayCardByUserId(userId)
.orElseThrow(() -> new FortuneException(FortuneFailure.NOT_FOUND_FORTUNE_FROM_USER));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

In getTodayFortuneCard, the repository query findTodayCardByUserId fetches the card associated with the user's current user_fortune record. However, if the user has not checked their fortune today (i.e., checked_at is in the past), this will return yesterday's (or an older) card as today's card. To enforce the 'today' contract, we should verify that the user has actually checked their fortune today before returning the card.

  public FortuneCard getTodayFortuneCard(Long userId) {
    if (!isExistTodayFortune(userId)) {
      throw new FortuneException(FortuneFailure.NOT_FOUND_FORTUNE_FROM_USER);
    }
    return fortuneCardRepositoryPort
        .findTodayCardByUserId(userId)
        .orElseThrow(() -> new FortuneException(FortuneFailure.NOT_FOUND_FORTUNE_FROM_USER));
  }

Comment on lines +323 to +331
CREATE TABLE user_fortune
(
id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
user_id BIGINT NOT NULL,
fortune_word_id BIGINT NOT NULL,
checked_at DATE NOT NULL,
PRIMARY KEY (id),
CONSTRAINT uq_user_fortune_user_id UNIQUE (user_id)
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The newly added tables (fortune_word and user_fortune) lack foreign key constraints. To ensure referential integrity and prevent orphaned records, consider adding foreign key constraints:

  • fortune_word.fortune_card_id referencing fortune_card(id)
  • user_fortune.user_id referencing users(id)
  • user_fortune.fortune_word_id referencing fortune_word(id)

Comment on lines +34 to +41
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseEntity<AppFailureResponse> handleTypeMismatch(
MethodArgumentTypeMismatchException e) {
String value = e.getValue() == null ? "" : e.getValue().toString();
List<FieldError> errors = List.of(new FieldError(e.getName(), value, e.getErrorCode()));
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(AppFailureResponse.of(INVALID_PARAMETER_MESSAGE, HttpStatus.BAD_REQUEST, errors));
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Since todayDate in FortuneController.getTodayFortuneWord is a required request parameter, if the client fails to provide it, Spring will throw a MissingServletRequestParameterException. Currently, AppExceptionHandler does not handle this exception, meaning it will fall back to the global exception handler and return the new BaseResponse format instead of the legacy AppFailureResponse format. To preserve the legacy contract and prevent client-side parsing errors, consider adding a handler for MissingServletRequestParameterException.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (4)
api/src/main/resources/db/migration/V1__create_initial_schema.sql (1)

303-332: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value

스키마 제약 조건 및 식별자 생성 전략 강화 (선택 사항)

안정적인 데이터 모델링을 위해 다음 사항들을 선택적으로 고려해 볼 수 있습니다:

  1. 외래 키(Foreign Key) 추가: fortune_word.fortune_card_id, user_fortune.user_id, user_fortune.fortune_word_id는 논리적으로 다른 테이블을 참조하고 있습니다. 데이터 정합성을 강제하기 위해 FOREIGN KEY 제약 조건을 추가하는 것을 권장합니다 (단, 프로젝트의 데이터베이스 설계 컨벤션 상 외래 키를 생략하는 정책이라면 무시하셔도 됩니다).
  2. user_fortune 식별자 전략: 추가된 DDL 주석에 명시된 대로 user_fortune은 시드 데이터 없이 빈 상태로 시작합니다. 명시적인 ID 삽입을 통한 시드 주입이 필요하지 않다면, GENERATED BY DEFAULT 대신 명시적 할당을 막는 더 엄격한 GENERATED ALWAYS AS IDENTITY를 사용하는 것이 더 안전할 수 있습니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@api/src/main/resources/db/migration/V1__create_initial_schema.sql` around
lines 303 - 332, Strengthen the fortune schema by adding foreign-key constraints
for fortune_word.fortune_card_id, user_fortune.user_id, and
user_fortune.fortune_word_id, following the project’s existing database
convention. Since user_fortune starts empty and does not require seeded explicit
IDs, change its id identity definition to GENERATED ALWAYS AS IDENTITY while
leaving the seeded master-table strategies unchanged.
storage/src/main/java/org/sopt/makers/storage/db/app/fortune/querydsl/FortuneCardQuerydslRepositoryImpl.java (1)

27-32: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

명시적인 Inner Join을 사용하는 것을 권장합니다.

.from(A, B, C) 형태로 다중 엔티티를 선언하고 where 절로 조건을 주면, JPQL 생성 시 Cross Join(카테시안 곱)이 발생할 수 있습니다. DBMS 옵티마이저가 이를 최적화할 수는 있지만, 명시적으로 innerJoin을 사용하는 것이 쿼리 성능을 보장하고 가독성 측면에서도 안전한 권장 방식입니다.

♻️ 명시적 Join 적용 예시
-            .from(userFortune, fortuneWord, fortuneCard)
-            .where(
-                userFortune.userId.eq(userId),
-                userFortune.fortuneWordId.eq(fortuneWord.id),
-                fortuneWord.fortuneCardId.eq(fortuneCard.id))
+            .from(userFortune)
+            .innerJoin(fortuneWord).on(userFortune.fortuneWordId.eq(fortuneWord.id))
+            .innerJoin(fortuneCard).on(fortuneWord.fortuneCardId.eq(fortuneCard.id))
+            .where(userFortune.userId.eq(userId))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@storage/src/main/java/org/sopt/makers/storage/db/app/fortune/querydsl/FortuneCardQuerydslRepositoryImpl.java`
around lines 27 - 32, Update the QueryDSL query in
FortuneCardQuerydslRepositoryImpl to replace the comma-separated
`.from(userFortune, fortuneWord, fortuneCard)` with explicit inner joins,
preserving the existing relationships among userFortune, fortuneWord, and
fortuneCard and the userId filter. Keep the query’s returned result and
fetchFirst behavior unchanged.
domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneService.java (2)

32-50: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

시간 기준(Clock vs 파라미터)의 일관성을 맞추는 것을 고려해 보세요.

getTodayFortuneWord는 외부에서 todayDate를 파라미터로 주입받아 사용하지만, isExistTodayFortune은 내부적으로 주입받은 clock을 사용하여 날짜를 구하고 있습니다. 시간 기준을 한 가지 방식으로 통일하면 유지보수와 테스트 관점에서의 일관성을 더욱 높일 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneService.java`
around lines 32 - 50, Unify the date source used by getTodayFortuneWord and
isExistTodayFortune in FortuneService: either consistently derive today from the
injected clock or consistently accept it as a parameter. Update the affected
method signatures and callers as needed while preserving each method’s current
behavior and testability.

52-60: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

신규 사용자 동시성 처리(TOCTOU) 관련 스키마 제약조건 확인

resolveTodayUserFortune 메서드는 조회 후 데이터가 없으면 새로 생성하는 로직(orElseGet)을 사용하고 있습니다. 동일한 사용자에 대해 동시에 여러 번의 API 요청이 발생할 경우 DB에 중복된 UserFortune 데이터가 적재될 수 있는 레이스 컨디션이 발생합니다.

데이터 무결성을 위해 DB 스키마 레벨에서 user_id 컬럼에 Unique 제약 조건이 설정되어 있는지 확인해 주시기 바랍니다. 제약 조건이 설정되어 있다면 중복 적재 시 발생하는 DataIntegrityViolationException을 통해 자연스럽게 방어할 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneService.java`
around lines 52 - 60, Verify the database schema and migration for the
UserFortune entity used by resolveTodayUserFortune and ensure the user_id column
has a unique constraint. Preserve the existing findByUserId/orElseGet flow,
relying on the database constraint to prevent duplicate records during
concurrent creation and surface DataIntegrityViolationException on conflicts.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneWordIdGenerator.java`:
- Around line 14-19: Update FortuneWordIdGenerator.generate to use the
thread-safe ThreadLocalRandom instead of the shared RandomGenerator instance,
removing the singleton random field if no longer needed. Before selecting an ID,
explicitly handle an empty result from fortuneWordRepositoryPort.findAllIds() by
applying the project’s established exception behavior rather than calling
nextInt with a zero bound.

---

Nitpick comments:
In `@api/src/main/resources/db/migration/V1__create_initial_schema.sql`:
- Around line 303-332: Strengthen the fortune schema by adding foreign-key
constraints for fortune_word.fortune_card_id, user_fortune.user_id, and
user_fortune.fortune_word_id, following the project’s existing database
convention. Since user_fortune starts empty and does not require seeded explicit
IDs, change its id identity definition to GENERATED ALWAYS AS IDENTITY while
leaving the seeded master-table strategies unchanged.

In
`@domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneService.java`:
- Around line 32-50: Unify the date source used by getTodayFortuneWord and
isExistTodayFortune in FortuneService: either consistently derive today from the
injected clock or consistently accept it as a parameter. Update the affected
method signatures and callers as needed while preserving each method’s current
behavior and testability.
- Around line 52-60: Verify the database schema and migration for the
UserFortune entity used by resolveTodayUserFortune and ensure the user_id column
has a unique constraint. Preserve the existing findByUserId/orElseGet flow,
relying on the database constraint to prevent duplicate records during
concurrent creation and surface DataIntegrityViolationException on conflicts.

In
`@storage/src/main/java/org/sopt/makers/storage/db/app/fortune/querydsl/FortuneCardQuerydslRepositoryImpl.java`:
- Around line 27-32: Update the QueryDSL query in
FortuneCardQuerydslRepositoryImpl to replace the comma-separated
`.from(userFortune, fortuneWord, fortuneCard)` with explicit inner joins,
preserving the existing relationships among userFortune, fortuneWord, and
fortuneCard and the userId filter. Keep the query’s returned result and
fetchFirst behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f3f75983-730c-434d-94a9-729b8d15694f

📥 Commits

Reviewing files that changed from the base of the PR and between 6a4593e and 31b3a84.

📒 Files selected for processing (37)
  • api/src/main/java/org/sopt/makers/api/common/exception/AppExceptionHandler.java
  • api/src/main/java/org/sopt/makers/api/common/response/AppFailureResponse.java
  • api/src/main/java/org/sopt/makers/api/controller/app/fortune/FortuneApi.java
  • api/src/main/java/org/sopt/makers/api/controller/app/fortune/FortuneController.java
  • api/src/main/java/org/sopt/makers/api/controller/app/fortune/dto/FortuneCardResponse.java
  • api/src/main/java/org/sopt/makers/api/controller/app/fortune/dto/FortuneResponse.java
  • api/src/main/resources/db/migration/V1__create_initial_schema.sql
  • api/src/test/java/org/sopt/makers/api/controller/app/AppChannelMockMvc.java
  • api/src/test/java/org/sopt/makers/api/controller/app/fortune/FortuneControllerTest.java
  • api/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
  • domain/domain-app/build.gradle.kts
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/FortuneCard.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/FortuneWord.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/UserFortune.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/exception/FortuneException.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/exception/FortuneFailure.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/facade/FortuneFacade.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/port/FortuneCardRepositoryPort.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/port/FortuneWordRepositoryPort.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/port/UserFortuneRepositoryPort.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneService.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/fortune/service/FortuneWordIdGenerator.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/soptamp/SoptampUser.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/soptamp/port/SoptampPointUpdaterPort.java
  • domain/domain-app/src/main/java/org/sopt/makers/domain/app/soptamp/port/SoptampUserQueryPort.java
  • domain/domain-app/src/test/java/org/sopt/makers/domain/app/fortune/service/FortuneServiceTest.java
  • storage/build.gradle.kts
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/adapter/FortuneCardRepositoryAdapter.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/adapter/FortuneWordRepositoryAdapter.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/adapter/UserFortuneRepositoryAdapter.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/entity/FortuneCardEntity.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/entity/FortuneWordEntity.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/entity/UserFortuneEntity.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/querydsl/FortuneCardQuerydslRepository.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/querydsl/FortuneCardQuerydslRepositoryImpl.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/repository/FortuneWordJpaRepository.java
  • storage/src/main/java/org/sopt/makers/storage/db/app/fortune/repository/UserFortuneJpaRepository.java

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💜 app 🎁 feature 새로운 기능을 개발하거나 추가, 변경할 경우

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat-app: 운세 카드 관련 코드 이관

1 participant