Skip to content

feat: 온보딩 나이대 응답에 "잘 모르겠어요"(UNDECIDED) 추가 - #138

Merged
SinnoLn merged 5 commits into
devfrom
feat/136-onboarding-age-band-undecided
Aug 8, 2026
Merged

feat: 온보딩 나이대 응답에 "잘 모르겠어요"(UNDECIDED) 추가#138
SinnoLn merged 5 commits into
devfrom
feat/136-onboarding-age-band-undecided

Conversation

@SinnoLn

@SinnoLn SinnoLn commented Aug 8, 2026

Copy link
Copy Markdown
Member

🔗 관련 이슈

Closes #136

📝 작업 내용

  • 온보딩 연령대 응답에 "잘 모르겠어요"(AgeBand.UNDECIDED) 추가, 다른 연령대와 함께 선택 시 거부 (ONB-011)
  • AWS 스케줄러 해제 (상시 서버 가동 되도록)
  • AdPerformance 생성자를 Lombok 빌더로 변경
  • OnboardingNotFoundException 추가, 온보딩 조회 실패 시 메시지 조립 중복 제거 (컨벤션에 맞도록 수정)

✅ 체크리스트

  • 로컬에서 빌드 및 테스트가 통과했습니다.
  • 컨벤션(브랜치/커밋 메시지)을 준수했습니다.
  • 관련 문서를 수정했습니다. (Swagger 예시 갱신)

💬 리뷰 참고 사항

  • 서버는 이제 안내려갑니다! 참고해주세요

Summary by CodeRabbit

  • 새로운 기능

    • 온보딩 연령대에서 ‘미정’을 선택할 수 있습니다.
    • ‘미정’은 다른 연령대와 함께 선택할 수 없도록 검증됩니다.
  • 버그 수정

    • 잘못된 연령대 조합 제출 시 명확한 400 오류가 제공됩니다.
    • 존재하지 않거나 권한이 없는 온보딩 정보 조회 시 404 오류가 일관되게 표시됩니다.
  • 문서

    • 온보딩 API의 연령대 선택 제약과 오류 응답 예시를 업데이트했습니다.
  • 운영

    • AWS 운영 서버의 자동 정지·기동 일정이 비활성화되었습니다.

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@SinnoLn, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b95c32cc-fddf-4539-a1d3-036e955bbdf4

📥 Commits

Reviewing files that changed from the base of the PR and between 4ed2173 and ed4ec18.

📒 Files selected for processing (6)
  • src/test/java/chaeso/zip/server/common/config/CreatedAtAuditingTest.java
  • src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java
  • src/test/java/chaeso/zip/server/onboarding/domain/OnboardingRepositoryTest.java
  • src/test/java/chaeso/zip/server/performance/domain/entity/AdPerformanceTest.java
  • src/test/java/chaeso/zip/server/support/AdPerformanceFixture.java
  • src/test/java/chaeso/zip/server/support/OnboardingFixture.java
📝 Walkthrough

Walkthrough

온보딩에 UNDECIDED 연령대를 추가하고 중복 선택 검증을 적용했습니다. 광고 성과 생성은 빌더 방식으로 변경했습니다. 추천 서비스는 온보딩 조회 실패 시 전용 예외를 사용합니다. AWS Scheduler는 비활성화되었습니다.

Changes

온보딩 기능 변경

Layer / File(s) Summary
연령대 선택 검증
src/main/java/chaeso/zip/server/channel/domain/vo/AgeBand.java, src/main/java/chaeso/zip/server/onboarding/..., src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java
AgeBand.UNDECIDED를 추가했습니다. UNDECIDED와 다른 연령대를 함께 선택하면 INVALID_AGE_BAND_SELECTION 오류를 반환합니다. API 문서와 제출 테스트를 갱신했습니다.
광고 성과 빌더 생성
src/main/java/chaeso/zip/server/performance/domain/entity/AdPerformance.java, src/main/java/chaeso/zip/server/onboarding/application/OnboardingServiceImpl.java, src/test/java/chaeso/zip/server/...
AdPerformance에 빌더 생성을 적용하고 fromOnboarding을 제거했습니다. 온보딩 서비스와 저장·감사 테스트는 빌더를 사용합니다.
온보딩 조회 실패 예외
src/main/java/chaeso/zip/server/onboarding/domain/OnboardingNotFoundException.java, src/main/java/chaeso/zip/server/recommendation/..., src/test/java/chaeso/zip/server/recommendation/...
온보딩을 찾지 못하거나 소유권 검증에 실패하면 OnboardingNotFoundException을 발생시킵니다. 서비스 및 컨트롤러 테스트가 새 예외 타입을 검증합니다.

AWS 스케줄 변경

Layer / File(s) Summary
정지·기동 스케줄 비활성화
infra/modules/aws/app/schedule.tf, docs/infra.md
AWS 정지·기동 Scheduler의 stateDISABLED로 설정했습니다. 운영 문서에 자동 정지 안내가 중단되었음을 표시했습니다.

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

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant OnboardingServiceImpl
  participant OnboardingRepository
  Client->>OnboardingServiceImpl: targetAgeBands 제출
  OnboardingServiceImpl->>OnboardingServiceImpl: UNDECIDED 선택 검증
  OnboardingServiceImpl->>OnboardingRepository: 유효한 온보딩 저장
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.88% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed 연령대 ENUM 추가, 단독 선택 검증, AWS 스케줄러 해제, AdPerformance 빌더 적용을 모두 구현했습니다. [#136]
Out of Scope Changes check ✅ Passed 예외 분리, Swagger 갱신, 테스트 변경은 온보딩 기능과 리팩토링을 지원하며 제공된 목표와 관련됩니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 온보딩 연령대에 UNDECIDED를 추가하고 단독 선택을 검증하는 주요 변경을 명확하게 설명합니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/136-onboarding-age-band-undecided

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.

@codecov-commenter

codecov-commenter commented Aug 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.58%. Comparing base (3f93331) to head (ed4ec18).
⚠️ Report is 1 commits behind head on dev.

Additional details and impacted files
@@             Coverage Diff              @@
##                dev     #138      +/-   ##
============================================
+ Coverage     88.55%   88.58%   +0.03%     
- Complexity      491      493       +2     
============================================
  Files           107      108       +1     
  Lines          1546     1560      +14     
  Branches        119      120       +1     
============================================
+ Hits           1369     1382      +13     
- Misses          130      132       +2     
+ Partials         47       46       -1     
Files with missing lines Coverage Δ
...a/chaeso/zip/server/channel/domain/vo/AgeBand.java 100.00% <100.00%> (ø)
.../onboarding/application/OnboardingServiceImpl.java 95.29% <100.00%> (+0.77%) ⬆️
.../server/onboarding/domain/OnboardingErrorCode.java 100.00% <100.00%> (ø)
...onboarding/domain/OnboardingNotFoundException.java 100.00% <100.00%> (ø)
...erver/performance/domain/entity/AdPerformance.java 90.90% <ø> (+3.95%) ⬆️
...ndation/application/RecommendationServiceImpl.java 95.49% <100.00%> (ø)

... and 1 file with indirect coverage changes

Components Coverage Δ
auth 93.65% <ø> (ø)
channel 52.54% <100.00%> (ø)
onboarding 87.32% <100.00%> (-0.05%) ⬇️
estimation 93.08% <ø> (ø)
performance 91.66% <ø> (+3.66%) ⬆️
simulation 93.08% <ø> (ø)
user 89.65% <ø> (ø)

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@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: 2

🧹 Nitpick comments (2)
infra/modules/aws/app/schedule.tf (1)

26-27: 🩺 Stability & Availability | 🔵 Trivial

스케줄 비활성화 전에 인스턴스 상태 전환을 보장하세요.

stopstart를 모두 DISABLED로 변경하면, 적용 시점에 aws_instance.thisstopped 상태여도 다시 시작할 이벤트가 없습니다. 특히 00:00~09:00 사이에 적용하면 운영 서버가 계속 중단될 수 있습니다. 적용 전에 인스턴스를 running으로 전환하고, 적용 후 상태를 확인하는 배포 절차를 추가하거나 기존 절차를 검증해 주세요.

Also applies to: 46-47

🤖 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 `@infra/modules/aws/app/schedule.tf` around lines 26 - 27, Update the
deployment procedure for the schedules around the stop and start resource
definitions so the target aws_instance.this is transitioned to running before
both schedules are disabled, and verify its running state after applying the
change. Reuse or validate the existing deployment mechanism rather than relying
solely on the Terraform state transition.
src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java (1)

153-172: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

UNDECIDED 단독 선택의 성공 경로도 테스트하세요.

현재 테스트는 혼합 선택 거부만 검증합니다. List.of(AgeBand.UNDECIDED)로 제출하고 saveAndFlush가 호출되며 저장된 targetAgeBands가 단일 값인지 검증하세요. 이 테스트가 있어야 허용된 응답 값이 이후 검증 변경으로 차단되지 않습니다.

🤖 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
`@src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java`
around lines 153 - 172, Extend the TargetAgeBands tests around
rejectsUndecidedWithOtherAgeBands with a success-case test that submits
List.of(AgeBand.UNDECIDED) through onboardingService.submit. Verify the
submission succeeds, onboardingRepository.saveAndFlush is called, and the
persisted entity’s targetAgeBands contains exactly the single UNDECIDED value.
🤖 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 `@docs/infra.md`:
- Around line 94-96: Update the AWS automatic stop scheduling section in
docs/infra.md to explicitly show both StopInstances and StartInstances schedules
as DISABLED. Preserve the existing cron values while stating that they are
retained configuration and are not currently executed automatically.

In
`@src/main/java/chaeso/zip/server/recommendation/application/RecommendationServiceImpl.java`:
- Around line 99-105: 추천 조회 흐름의 recommendationService.recommend 호출이 온보딩 존재 여부만
확인하지 않도록 수정하세요. 인증된 principal의 userId를 함께 전달하고, recommend 내부에서는 findOnboarding
대신 findOwnedOnboarding(userId, onboardingId)를 사용해 소유자가 아닌 요청은 기존처럼 404로 처리되게
하세요.

---

Nitpick comments:
In `@infra/modules/aws/app/schedule.tf`:
- Around line 26-27: Update the deployment procedure for the schedules around
the stop and start resource definitions so the target aws_instance.this is
transitioned to running before both schedules are disabled, and verify its
running state after applying the change. Reuse or validate the existing
deployment mechanism rather than relying solely on the Terraform state
transition.

In
`@src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java`:
- Around line 153-172: Extend the TargetAgeBands tests around
rejectsUndecidedWithOtherAgeBands with a success-case test that submits
List.of(AgeBand.UNDECIDED) through onboardingService.submit. Verify the
submission succeeds, onboardingRepository.saveAndFlush is called, and the
persisted entity’s targetAgeBands contains exactly the single UNDECIDED value.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b4ae6b1b-fef5-4e78-add7-e3f41f38c4e6

📥 Commits

Reviewing files that changed from the base of the PR and between 3f93331 and 4ed2173.

📒 Files selected for processing (15)
  • docs/infra.md
  • infra/modules/aws/app/schedule.tf
  • src/main/java/chaeso/zip/server/channel/domain/vo/AgeBand.java
  • src/main/java/chaeso/zip/server/onboarding/application/OnboardingServiceImpl.java
  • src/main/java/chaeso/zip/server/onboarding/domain/OnboardingErrorCode.java
  • src/main/java/chaeso/zip/server/onboarding/domain/OnboardingNotFoundException.java
  • src/main/java/chaeso/zip/server/onboarding/presentation/OnboardingApiDocs.java
  • src/main/java/chaeso/zip/server/onboarding/presentation/dto/SubmitOnboardingRequest.java
  • src/main/java/chaeso/zip/server/performance/domain/entity/AdPerformance.java
  • src/main/java/chaeso/zip/server/recommendation/application/RecommendationServiceImpl.java
  • src/test/java/chaeso/zip/server/common/config/CreatedAtAuditingTest.java
  • src/test/java/chaeso/zip/server/onboarding/application/OnboardingServiceSubmitTest.java
  • src/test/java/chaeso/zip/server/onboarding/domain/OnboardingRepositoryTest.java
  • src/test/java/chaeso/zip/server/recommendation/application/RecommendationServiceImplTest.java
  • src/test/java/chaeso/zip/server/recommendation/presentation/RecommendationControllerTest.java

Comment thread docs/infra.md
@claude

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown

코드 리뷰 요약 (자동 머지 게이트)

🔴 Blocker

없음

🟠 Major

  • AgeBand.UNDECIDED 추가가 채널 추천 매칭 로직에 반영되지 않음ChannelMatcher.overlapsAgeBand(src/main/java/chaeso/zip/server/recommendation/domain/ChannelMatcher.java:59-65)는 onboarding.getTargetAgeBands()channel.getAgeBandCodes()의 교집합 여부로 AGE_BAND 축(가중치 20점, MatchAxis.java:21)을 매칭한다. 채널 데이터의 age_band_codesAGE_10S~AGE_50S_PLUS만 존재하므로(V5__create_channel_tables.sql:58 주석 참고), 사용자가 "잘 모르겠어요"(UNDECIDED)만 선택한 경우 어떤 채널과도 AGE_BAND 축이 매칭되지 않는다. 즉 이 옵션을 선택한 사용자는 항상 추천 점수에서 20점을 손해 보게 되어, "모르겠다"는 응답이 "전 연령 채널과 매칭"이 아니라 "모든 채널과 비매칭"으로 처리된다. 이 PR의 의도(잘 모르겠어요 허용)와 실제 추천 결과가 어긋나므로, overlapsAgeBand에서 targetAgeBandsUNDECIDED만 포함할 때는 전 연령대와 매칭되도록 처리하거나, 최소한 의도적으로 미룬 것이라면 후속 이슈로 명시해야 한다. 관련 테스트(ChannelMatcherTest, RecommendationServiceImplTest)에도 UNDECIDED 케이스가 없다.

🟡 Minor

  • src/test/java/chaeso/zip/server/common/config/CreatedAtAuditingTest.java:18import java.time.*; 와일드카드 임포트. 저장소 전체에서 이 파일이 유일하게 와일드카드 임포트를 사용하고 있어 기존 컨벤션(명시적 임포트)과 어긋난다. 명시적 임포트로 되돌리는 것을 권장.

🤖 Generated with Claude Code — automated PR review gate

Comment thread src/main/java/chaeso/zip/server/channel/domain/vo/AgeBand.java
Comment thread src/test/java/chaeso/zip/server/common/config/CreatedAtAuditingTest.java Outdated
@SinnoLn
SinnoLn merged commit df368c6 into dev Aug 8, 2026
3 checks passed
@SinnoLn
SinnoLn deleted the feat/136-onboarding-age-band-undecided branch August 8, 2026 08:19
SinnoLn added a commit that referenced this pull request Aug 8, 2026
* chore: AWS S3 공개 버킷 추가 (#126)

* feat(infra): add public S3 bucket and upload commands for static assets

* docs: document public static assets S3 bucket

* chore: remove unused region field from onboarding S3 test config

* chore(infra): increase EC2 root volume to 30GB and switch to gp3

* fix: address review feedback on public assets bucket

* fix(infra): scope down public bucket permissions and fix access log delivery

* feat: 저장된 시뮬레이션 목록 및 상세 조회 API 구현 (#130)

* fix(simulation): mark optional response fields NOT_REQUIRED instead of nullable

* feat(simulation): add saved simulation detail API

* feat(simulation): add paginated my-simulations list API

* chore(simulation): drop unused SimulationNotFoundException import

* fix(simulation): omit null fields from simulation item responses

* fix(simulation): count only funded channels in list summaries

* docs(simulation): add a page/size example to the list API 400 response

* feat: 채널 추천 결과 저장 API 구현 (#133)

* fix(security): scope the public recommendations path to GET

* fix(openapi): publish data and error as required on response wrappers

* feat(recommendation): add channel recommendation save API

* fix(recommendation): serialize saves per onboarding

* feat: add flyway migration v16

* feat(channel): filter the channel list by primary category (#134)

* feat: 온보딩 나이대 응답에 "잘 모르겠어요"(UNDECIDED) 추가 (#138)

* feat(infra): disable aws scheduler

* refactor(performance): build AdPerformance via Lombok builder instead of positional constructor

* feat(onboarding): let users answer "don't know" for target age band

* refactor(onboarding): extract OnboardingNotFoundException for id-based lookups

* test(onboarding): cover UNDECIDED-alone and AdPerformance ratio branches

---------

Co-authored-by: Yelim Lee <142207312+1117mg@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 온보딩 나이 ENUM 필드 추가, AWS 스케줄러 해제 및 기타 리팩토링

3 participants