Skip to content

[FEAT] 학습, 백킹트랙, 알림, 구독 도메인 관련 엔티티 구현(#16)#24

Merged
rkdehdrbs7885-oss merged 17 commits into
developfrom
feat/#16-learning-entity
Jul 21, 2026
Merged

[FEAT] 학습, 백킹트랙, 알림, 구독 도메인 관련 엔티티 구현(#16)#24
rkdehdrbs7885-oss merged 17 commits into
developfrom
feat/#16-learning-entity

Conversation

@rkdehdrbs7885-oss

@rkdehdrbs7885-oss rkdehdrbs7885-oss commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

📍 개요

소셜 로그인 구현

⛓️‍💥 관련 이슈


🛠️ 작업 내용

  • 학습, 백킹트랙, 알림, 구독 도메인 관련 엔티티

🔥 리뷰 요청 사항

리뷰어가 중점적으로 확인해주었으면 하는 내용을 작성해주세요.

  • 예외 코드 처리 방식

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 코드 및 import를 제거했습니다.
  • 예외 처리를 적용했습니다.
  • 테스트를 완료했습니다.
  • 관련 Issue를 연결했습니다.

📎 참고 사항

Summary by CodeRabbit

  • 새 기능
    • 백킹 트랙과 코드 진행 정보를 관리할 수 있습니다.
    • 트랙의 장르, 조성, 박자, BPM, 난이도, 공개 범위 및 오디오·MIDI 정보를 지원합니다.
    • 학습 과정, 단계별 콘텐츠, 코드 예제와 연주 예제를 관리할 수 있습니다.
    • 학습 활성화, 진행률 및 알림 읽음 상태를 관리할 수 있습니다.
    • 구독 기간 유효성 확인, 기간 연장 및 요금제 변경을 지원합니다.
  • 개선 사항
    • 트랙 재생 횟수와 학습 콘텐츠 정보를 업데이트할 수 있습니다.
    • 구독 기간 관련 잘못된 입력을 안내합니다.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

백킹 트랙, 학습 콘텐츠와 진행 상태, 알림, 구독을 위한 JPA 엔티티·열거형·도메인 메서드를 추가했다. 각 엔티티에 테이블 매핑, 관계, 인덱스, 기본값, 생성 및 수정 동작을 정의했다.

Changes

백킹 트랙 모델

Layer / File(s) Summary
백킹 트랙 및 코드 진행
src/main/java/com/mr/domain/backingTrack/entity/*
BackingTrack, ChordProgression 엔티티와 접근 수준·난이도·스케일 열거형을 추가하고, 생성·메타데이터 수정·재생 횟수 증가·접근 수준 변경 동작을 정의했다.

학습 콘텐츠 모델

Layer / File(s) Summary
학습 콘텐츠 및 예제
src/main/java/com/mr/domain/learning/entity/Learning.java, LearningStep.java, ChordExample.java, PlayingExample.java, enums/*
학습, 단계, 코드 예제, 연주 예제 엔티티와 분류·난이도 열거형을 추가하고 생성 및 수정 메서드를 정의했다.

학습 진행 상태

Layer / File(s) Summary
사용자 학습 진행
src/main/java/com/mr/domain/learning/entity/UserLearningProgress.java
사용자·학습·단계별 진행 상태, 점수와 마지막 학습 시각을 저장하고 갱신하는 엔티티를 추가했다.

알림 모델

Layer / File(s) Summary
알림 생성 및 읽음 처리
src/main/java/com/mr/domain/notification/entity/Notification.java
알림 테이블 매핑, 사용자별 인덱스, 알림 생성 팩토리와 읽음 처리 메서드를 추가했다.

구독 모델

Layer / File(s) Summary
구독 기간 검증 및 변경
src/main/java/com/mr/domain/subscriptions/entity/Subscription.java, src/main/java/com/mr/domain/subscriptions/entity/enums/SubscriptionErrorStatus.java, src/main/java/com/mr/domain/subscriptions/exception/SubscriptionException.java
구독 생성·활성 상태 확인·기간 연장·등급 변경과 날짜 검증용 오류 상태 및 예외를 추가했다.

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

Possibly related PRs

  • Musereview/BE#2: SubscriptionException이 해당 PR의 GeneralException 및 공통 오류 코드 체계를 사용한다.
  • Musereview/BE#6: 신규 엔티티들이 해당 PR에서 추가된 시간·삭제 감사 베이스 엔티티를 상속한다.

Poem

트랙엔 코드가 춤을 추고,
학습은 차곡차곡 자라며,
알림은 살짝 손을 들고,
구독 날짜는 선을 지켜,
도메인 별들이 반짝인다. ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 이슈 #16 범위를 벗어난 백킹트랙, 구독 및 관련 엔티티가 함께 추가되어 있습니다. 학습·학습 진행 상태·알림 관련 변경만 남기고, 백킹트랙·구독 도메인은 별도 PR로 분리하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 31.82% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 학습·백킹트랙·알림·구독 엔티티 추가라는 핵심 변경을 정확히 요약합니다.
Linked Issues check ✅ Passed 이슈 #16의 학습, 학습 진행 상태, 알림 엔티티 구현 요구를 모두 충족합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#16-learning-entity

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.

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

🧹 Nitpick comments (6)
src/main/java/com/mr/domain/notification/entity/Notification.java (2)

25-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

무분별한 상태 변경을 막기 위해 @Setter를 제거해 주세요.

엔티티 클래스 전체에 @Setter를 열어두면 애플리케이션 어디서든 상태가 변경될 위험이 있어 객체의 캡슐화가 깨질 수 있습니다. 객체의 상태 변경은 비즈니스 의도가 명확히 드러나는 메서드를 통해서만 이루어지는 것이 도메인 주도 설계(DDD) 관점에서도 안전하고 유지보수하기 좋습니다. 이미 알림 읽음 처리를 위한 메서드를 별도로 구현하셨으므로 @Setter는 제거하는 것을 추천합니다.

♻️ 제안하는 수정안
 `@Getter`
-@Setter
 public class Notification extends BaseTimeDeletedEntity{
🤖 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/main/java/com/mr/domain/notification/entity/Notification.java` around
lines 25 - 27, Remove the class-level `@Setter` annotation from Notification,
keeping `@Getter` unchanged. Preserve state changes through the existing
notification-read handling method rather than exposing generic setters.

56-59: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

비즈니스 의도가 잘 드러나는 훌륭한 메서드 설계입니다!

상태를 단순한 Setter로 두지 않고 의미 있는 메서드로 분리하신 점이 아주 좋습니다. 한 걸음 더 나아가, 영어 관용 표현에 더 자연스러운 markAsRead()로 이름을 변경하시면 동료 개발자들이 코드를 읽을 때 의도를 더욱 직관적으로 파악할 수 있을 것입니다.

✨ 제안하는 수정안
-    public void readTrue(){
+    public void markAsRead(){
         this.isRead = true;
     }
🤖 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/main/java/com/mr/domain/notification/entity/Notification.java` around
lines 56 - 59, Rename the Notification method readTrue() to the more idiomatic
markAsRead(), keeping its behavior of setting isRead to true unchanged, and
update all callers to use the new method name.
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java (1)

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

패키지명 오타(enitity -> entity)를 수정해 주세요.

도메인을 잘 분리하여 패키지를 구성하셨습니다! 다만 패키지 경로 중 enitity에 오타가 포함되어 있습니다. 프로젝트 전반의 일관성을 유지하고 다른 팀원들의 혼동을 방지하기 위해 entity로 수정하는 것을 권장합니다.

  • src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java#L1-L1: 패키지명을 com.mr.domain.subscriptions.entity로 변경해 주세요. (디렉토리 이름도 함께 변경해야 합니다.)
  • src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java#L1-L1: 패키지명을 com.mr.domain.subscriptions.entity.enums로 변경해 주세요.
🤖 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/main/java/com/mr/domain/subscriptions/enitity/Subscription.java` at line
1, Rename the misspelled package directory from enitity to entity and update
Subscription.java in
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java:1-1 to use
com.mr.domain.subscriptions.entity; update SubscriptionTier.java in
src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java:1-1
to use com.mr.domain.subscriptions.entity.enums, and adjust all affected imports
and references.
src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java (1)

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

엔티티 클래스명 오탈자(Typo)를 수정해 주세요.

클래스명에 약간의 오탈자가 있습니다. UserLearingProgress 대신 UserLearningProgress로 변경하는 것을 제안합니다. 초기 단계에서 이름을 바로잡으면 이후 다른 코드나 DB 테이블명과의 혼동을 줄일 수 있습니다!

✨ 클래스명 수정 제안
-public class UserLearingProgress extends BaseTimeEntity {
+public class UserLearningProgress extends BaseTimeEntity {
🤖 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/main/java/com/mr/domain/learning/entity/UserLearingProgress.java` at line
30, UserLearingProgress 엔티티 클래스명을 오탈자가 수정된 UserLearningProgress로 변경하고, 프로젝트 내 해당
클래스의 모든 참조와 파일명을 새 이름에 맞게 갱신하세요.
src/main/java/com/mr/domain/learning/entity/ChordExample.java (1)

24-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

식별자 필드명 일관성 유지

다른 엔티티들(Learning, LearningStep, PlayingExample)은 식별자 필드명으로 통일성 있게 id를 사용하고 있습니다.
chordExampleid보다 id로 통일하면 코드의 가독성이 높아지고, 소문자 id의 오타(id -> Id)도 함께 깔끔하게 수정할 수 있어요! ✨

🛠️ 개선 제안
     `@Id`
     `@Column`(name = "chord_example_id")
-    private Long chordExampleid;
+    private Long id;
🤖 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/main/java/com/mr/domain/learning/entity/ChordExample.java` around lines
24 - 26, Rename the identifier field in ChordExample from chordExampleid to id,
preserving its `@Id` and `@Column` mapping so the entity matches the naming
convention used by Learning, LearningStep, and PlayingExample.
src/main/java/com/mr/domain/learning/entity/PlayingExample.java (1)

20-22: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

식별자 컬럼명과 테이블명의 불일치

테이블명은 playing_example로 지정되어 있는데, 기본 키 컬럼명은 @Column(name = "learning_example_id")로 되어 있습니다.
관례상 테이블명과 식별자 이름을 일치시키는 것이 추후 DB 스키마 파악 및 유지보수에 유리합니다. playing_example_id로 수정하는 것을 고려해 보세요! 🧹

🛠️ 개선 제안
     `@Id`
-    `@Column`(name = "learning_example_id")
+    `@Column`(name = "playing_example_id")
     private Long id;
🤖 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/main/java/com/mr/domain/learning/entity/PlayingExample.java` around lines
20 - 22, Update the `@Column` mapping for the id field in PlayingExample so its
name uses playing_example_id instead of learning_example_id, matching the
playing_example table naming.
🤖 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 `@src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java`:
- Around line 33-34: Replace `@JoinColumn` with `@Column` for the primitive
foreign-key fields: update BackingTrack.java lines 33-34,
UserLearingProgress.java lines 37-38, and UserLearingProgress.java lines 46-47,
preserving the existing column names and nullable=false settings.

In `@src/main/java/com/mr/domain/learning/entity/ChordExample.java`:
- Around line 37-45: Update the comments above noteNumbers to describe the
actual `@ElementCollection` mapping: Integer values are stored in the
chord_example_note auxiliary table, not a database INTEGER[] column. Keep the
existing auxiliary-table mapping unchanged.

In `@src/main/java/com/mr/domain/learning/entity/Learning.java`:
- Around line 69-112: Learning loses the subtitle and diagramUrl values because
they are accepted but not stored. Add JPA-mapped subtitle and diagramUrl fields
to Learning, then assign both values in the private Learning constructor and
updateContent; preserve their existing create-to-builder flow.
- Around line 28-30: Learning, LearningStep, ChordExample, and PlayingExample의
Long 식별자 필드에 GenerationType.IDENTITY 전략의 `@GeneratedValue를` 추가하고 필요한 Jakarta
Persistence import를 보완하세요. 적용 대상은
src/main/java/com/mr/domain/learning/entity/Learning.java 28-30,
src/main/java/com/mr/domain/learning/entity/LearningStep.java 25-27,
src/main/java/com/mr/domain/learning/entity/ChordExample.java 24-26,
src/main/java/com/mr/domain/learning/entity/PlayingExample.java 20-22이며, 각 엔티티의
기존 `@Id` 매핑은 유지하세요.
- Around line 17-26: Update the Learning entity with a protected no-argument
constructor using `@NoArgsConstructor`(access = AccessLevel.PROTECTED) to satisfy
JPA requirements. Reconcile the subtitle and diagramUrl parameters in create()
and updateContent() by adding corresponding persistent fields and mappings if
they are stored values; otherwise remove those parameters and their related
handling.

In `@src/main/java/com/mr/domain/learning/entity/PlayingExample.java`:
- Around line 33-35: PlayingExample의 midiFileUrl 매핑을 단일 URL 저장 방식에 맞게 정리하세요.
JSON 구조를 사용하지 않으므로 `@Column의` columnDefinition="JSON"을 제거하고 VARCHAR 또는 TEXT 타입과
적절한 length를 지정하되, 필드명과 nullable=false 설정은 유지하세요.

In `@src/main/java/com/mr/domain/notification/entity/Notification.java`:
- Around line 29-31: Notification.java의 id 필드와 Subscription.java의 id 필드에
GenerationType.IDENTITY를 사용하는 `@GeneratedValue` 전략을 각각 추가하여 데이터베이스가 식별자를 자동 생성하도록
수정하세요. 대상은 Notification의 id(29-31행)와 Subscription의 id(16-18행)이며, 두 엔티티의 기존 `@Id` 및
컬럼 매핑은 유지하세요.
- Line 12: Update the Notification entity to provide a protected no-argument
constructor for JPA instantiation, using Lombok’s no-args constructor support
and the appropriate access-level configuration alongside the existing
builder-based constructor.
- Around line 33-35: Notification 엔티티의 userId 필드에서 연관관계용 `@JoinColumn을` 제거하고 동일한
컬럼명(user_id)과 nullable 제약을 유지한 `@Column으로` 변경하세요.
- Line 1: Notification 클래스 파일 최상단에 com.mr.domain.notification.entity 패키지 선언을
추가하고, 기존 import 문보다 앞에 배치하세요.

In `@src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java`:
- Around line 24-27: Update the tier field in the Subscription entity to use the
SubscriptionTier enum instead of String, and annotate it with
`@Enumerated`(EnumType.STRING) so values remain stored as readable database
strings. Add the required JPA imports and preserve the existing column
constraints.

---

Nitpick comments:
In `@src/main/java/com/mr/domain/learning/entity/ChordExample.java`:
- Around line 24-26: Rename the identifier field in ChordExample from
chordExampleid to id, preserving its `@Id` and `@Column` mapping so the entity
matches the naming convention used by Learning, LearningStep, and
PlayingExample.

In `@src/main/java/com/mr/domain/learning/entity/PlayingExample.java`:
- Around line 20-22: Update the `@Column` mapping for the id field in
PlayingExample so its name uses playing_example_id instead of
learning_example_id, matching the playing_example table naming.

In `@src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java`:
- Line 30: UserLearingProgress 엔티티 클래스명을 오탈자가 수정된 UserLearningProgress로 변경하고,
프로젝트 내 해당 클래스의 모든 참조와 파일명을 새 이름에 맞게 갱신하세요.

In `@src/main/java/com/mr/domain/notification/entity/Notification.java`:
- Around line 25-27: Remove the class-level `@Setter` annotation from
Notification, keeping `@Getter` unchanged. Preserve state changes through the
existing notification-read handling method rather than exposing generic setters.
- Around line 56-59: Rename the Notification method readTrue() to the more
idiomatic markAsRead(), keeping its behavior of setting isRead to true
unchanged, and update all callers to use the new method name.

In `@src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java`:
- Line 1: Rename the misspelled package directory from enitity to entity and
update Subscription.java in
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java:1-1 to use
com.mr.domain.subscriptions.entity; update SubscriptionTier.java in
src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java:1-1
to use com.mr.domain.subscriptions.entity.enums, and adjust all affected imports
and references.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 7ecf5193-bb0e-44ed-a601-91501da3cfe1

📥 Commits

Reviewing files that changed from the base of the PR and between 444519b and a558736.

📒 Files selected for processing (17)
  • src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
  • src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/AccessLevel.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/Level.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/ScaleType.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/TrackType.java
  • src/main/java/com/mr/domain/learning/entity/ChordExample.java
  • src/main/java/com/mr/domain/learning/entity/Learning.java
  • src/main/java/com/mr/domain/learning/entity/LearningStep.java
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java
  • src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java
  • src/main/java/com/mr/domain/learning/entity/enums/LearningCategory.java
  • src/main/java/com/mr/domain/learning/entity/enums/LearningDifficulty.java
  • src/main/java/com/mr/domain/learning/entity/enums/UserLearningStatus.java
  • src/main/java/com/mr/domain/notification/entity/Notification.java
  • src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java
  • src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java

Comment thread src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java Outdated
Comment thread src/main/java/com/mr/domain/learning/entity/ChordExample.java Outdated
Comment thread src/main/java/com/mr/domain/learning/entity/Learning.java
Comment thread src/main/java/com/mr/domain/learning/entity/Learning.java
Comment thread src/main/java/com/mr/domain/learning/entity/Learning.java
Comment thread src/main/java/com/mr/domain/notification/entity/Notification.java
Comment thread src/main/java/com/mr/domain/notification/entity/Notification.java
Comment thread src/main/java/com/mr/domain/notification/entity/Notification.java
Comment thread src/main/java/com/mr/domain/notification/entity/Notification.java
Comment thread src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java Outdated
@rkdehdrbs7885-oss rkdehdrbs7885-oss changed the title Feat/#16 learning entity [FEAT] 학습, 백킹트랙, 알림, 구독 도메인 관련 엔티티 구현(#16) Jul 20, 2026

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

♻️ Duplicate comments (4)
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java (1)

32-35: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

문자열 대신 Enum 타입을 활용해 타입 안정성을 확보해 주세요.

구독 등급 정보를 잘 정의해 주셨습니다! 하지만 현재 tier 필드가 String 타입으로 되어 있어, 오타로 인한 잘못된 데이터 입력의 위험이 있습니다.
새로 생성하신 SubscriptionTier 열거형(Enum)과 JPA의 @Enumerated(EnumType.STRING) 어노테이션을 활용하면 DB에는 직관적인 문자열로 저장되면서도 애플리케이션 코드에서는 완벽한 타입 안정성을 누릴 수 있습니다. JPA 공식 문서의 열거형 매핑 가이드를 함께 참고해 보세요.

🛠️ 제안하는 수정안

상단에 import jakarta.persistence.Enumerated;import jakarta.persistence.EnumType;, 그리고 import com.mr.domain.subscriptions.enitity.enums.SubscriptionTier;를 추가해 주시고, 아래와 같이 변경해 주세요.

     // 구독 등급
+    `@Enumerated`(EnumType.STRING)
     `@Column`(name = "tier", nullable = false, length = 20)
-    private String tier;
+    private SubscriptionTier tier;
🤖 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/main/java/com/mr/domain/subscriptions/enitity/Subscription.java` around
lines 32 - 35, Update the tier field in Subscription to use the existing
SubscriptionTier enum instead of String, and annotate it with
`@Enumerated`(EnumType.STRING) so the database continues storing readable enum
names while application code gains type safety. Add the required JPA and
SubscriptionTier imports.
src/main/java/com/mr/domain/notification/entity/Notification.java (1)

1-1: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

패키지 선언 누락을 수정해 주세요.

파일 최상단에 패키지 선언이 누락되어 있습니다. 패키지 선언이 없으면 컴파일 오류가 발생하거나 클래스 경로를 제대로 찾지 못합니다. 간단히 패키지 경로를 추가하는 것으로 문제를 해결할 수 있습니다! 관련 Java 언어 스펙에서 패키지 선언의 중요성을 확인해보시면 좋습니다.

🛠️ 제안하는 수정안
+package com.mr.domain.notification.entity;
+
 import com.mr.global.entity.BaseTimeDeletedEntity;
🤖 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/main/java/com/mr/domain/notification/entity/Notification.java` at line 1,
Notification 클래스 파일 최상단에 com.mr.domain.notification.entity 패키지 선언을 추가하세요. 기존
import 선언보다 앞에 배치하고, BaseTimeDeletedEntity import 및 클래스 구현은 변경하지 마세요.
src/main/java/com/mr/domain/learning/entity/PlayingExample.java (1)

39-41: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

String URL에 대한 잘못된 JSON 컬럼 매핑

midiFileUrl 필드는 URL 형식의 일반 문자열을 저장하는 용도인데, @ColumncolumnDefinition = "JSON"으로 매핑되어 있습니다. 일반 문자열을 DB의 JSON 컬럼에 저장하려고 하면 데이터베이스에서 파싱 오류가 발생할 수 있습니다!

단일 문자열(URL)을 저장하신다면 JSON 매핑을 제거하는 것이 안전합니다. JPA와 Hibernate의 다양한 매핑 타입 문서를 참고해 보시면 더 적절한 타입을 찾을 수 있을 거예요. (이전 리뷰에서도 언급되었던 부분입니다!)

🛠️ 제안하는 수정안
-    `@Column`(name = "midi_file_url", nullable = false, columnDefinition = "JSON")
+    `@Column`(name = "midi_file_url", nullable = false, length = 255)
     private String midiFileUrl;
🤖 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/main/java/com/mr/domain/learning/entity/PlayingExample.java` around lines
39 - 41, Update the midiFileUrl field mapping in PlayingExample by removing the
JSON column definition and retaining a standard non-JSON string column mapping
suitable for a URL value; keep the field’s required nullable constraint
unchanged.
src/main/java/com/mr/domain/learning/entity/Learning.java (1)

74-117: 🗄️ Data Integrity & Integration | 🔴 Critical | ⚡ Quick win

엔티티 필드 누락으로 인한 데이터 유실 (subtitle, diagramUrl)

생성자와 updateContent 메서드에서 훌륭하게 subtitlediagramUrl 파라미터를 받고 있습니다! 하지만 이 데이터를 담아둘 엔티티 클래스 필드가 선언되어 있지 않아서 기껏 받아온 값이 그대로 유실되고 있습니다. 🥲

JPA 엔티티는 데이터베이스 컬럼에 대응하는 데이터를 반드시 필드로 선언하고 매핑해야 합니다. (이전에 언급되었던 내용이기도 하네요!) JPA 엔티티 기본 작성법을 참고하여 필드를 추가해 보세요.

🛠️ 제안하는 수정안 (필드 추가 및 할당)

엔티티 상단에 다음과 같이 필드를 선언해 주세요:

    // 부제목
    `@Column`(name = "subtitle", length = 100)
    private String subtitle;

    // 다이어그램 URL
    `@Column`(name = "diagram_url", length = 255)
    private String diagramUrl;

그리고 생성자와 updateContent 내부에서 다음과 같이 할당해 주시면 됩니다.

     private Learning(String title, String subtitle, LearningCategory category, LearningDifficulty difficulty,
                      String summary, String content, String practiceTip, String diagramUrl, Boolean isActive) {
         this.title = title;
+        this.subtitle = subtitle;
         this.category = category != null ? category : LearningCategory.THEORY;
         this.difficulty = difficulty != null ? difficulty : LearningDifficulty.BEGINNER; // Default: BEGINNER
         this.summary = summary;
         this.content = content;
         this.practiceTip = practiceTip;
+        this.diagramUrl = diagramUrl;
         this.isActive = isActive != null ? isActive : true;
     }

     public void updateContent(String title, String subtitle, LearningCategory category, LearningDifficulty difficulty,
                               String summary, String content, String practiceTip, String diagramUrl) {
         this.title = title;
+        this.subtitle = subtitle;
         this.category = category;
         this.difficulty = difficulty;
         this.summary = summary;
         this.content = content;
         this.practiceTip = practiceTip;
+        this.diagramUrl = diagramUrl;
     }
🤖 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/main/java/com/mr/domain/learning/entity/Learning.java` around lines 74 -
117, Learning 엔티티에 subtitle과 diagramUrl 필드 및 대응하는 JPA `@Column` 매핑을 추가하고, private
Learning 생성자와 create 경로에서 전달된 값을 필드에 저장하세요. 또한 updateContent에서 두 필드를 갱신해 기존 값이
유실되지 않도록 하며, 제안된 컬럼명과 길이를 사용하세요.
🧹 Nitpick comments (5)
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java (1)

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

패키지 경로의 오타(enitity)를 수정해 주세요.

패키지 경로에 enitity라는 오타가 포함되어 있습니다. 디렉토리 명을 entity로 수정하고 각 파일의 패키지 선언을 맞춰주시면 패키지 구조의 일관성을 높일 수 있습니다. 명확한 네이밍은 유지보수성을 높이는 훌륭한 습관입니다!

  • src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java#L1-L1: package com.mr.domain.subscriptions.enitity;entity로 수정해 주세요.
  • src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java#L1-L1: package com.mr.domain.subscriptions.enitity.enums;entity로 수정해 주세요.
🤖 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/main/java/com/mr/domain/subscriptions/enitity/Subscription.java` at line
1, Rename the subscriptions package directory from enitity to entity and update
the package declarations in Subscription.java and SubscriptionTier.java
accordingly, including the nested enums package, so all references use
com.mr.domain.subscriptions.entity consistently. Apply the changes at
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java lines 1-1
and
src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java
lines 1-1.
src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java (1)

33-33: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

클래스명 오타 수정 (UserLearingProgress -> UserLearningProgress)

클래스 이름에 귀여운 오타(Learing -> Learning)가 숨어 있네요! 애플리케이션 전반에서 널리 참조되기 전에 바로잡는 것이 유지보수에 유리합니다. 파일명도 함께 변경해 주시면 완벽합니다. 👍

✨ 제안하는 수정안
-public class UserLearingProgress extends BaseTimeEntity {
+public class UserLearningProgress extends BaseTimeEntity {
🤖 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/main/java/com/mr/domain/learning/entity/UserLearingProgress.java` at line
33, Rename the UserLearingProgress class to UserLearningProgress and update the
corresponding filename and all references throughout the application to use the
corrected symbol.
src/main/java/com/mr/domain/learning/entity/PlayingExample.java (1)

27-28: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

기본키 컬럼명 확인

엔티티 이름은 PlayingExample인데, 매핑된 컬럼명은 learning_example_id로 지정되어 있습니다. 특별한 의도가 있는 것이 아니라면 테이블 명명 규칙과의 일관성을 위해 playing_example_id로 맞추는 것을 추천합니다. 깔끔한 네이밍은 나중에 헷갈리지 않는 든든한 보험이 되니까요! 👍

✨ 제안하는 수정안
-    `@Column`(name = "learning_example_id")
+    `@Column`(name = "playing_example_id")
     private Long id;
🤖 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/main/java/com/mr/domain/learning/entity/PlayingExample.java` around lines
27 - 28, Update the id column mapping in the PlayingExample entity so the
`@Column` name uses playing_example_id instead of learning_example_id, keeping the
primary-key naming consistent with the entity name.
src/main/java/com/mr/domain/learning/entity/ChordExample.java (1)

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

식별자 필드명 일관성 유지

엔티티의 식별자 필드명이 chordExampleid로 되어 있습니다. 다른 엔티티들(Learning, PlayingExample 등)은 모두 id를 사용하고 있으므로, id로 통일하거나 카멜 케이스에 맞춰 chordExampleId로 변경하는 것이 좋습니다. 사소한 일관성들이 모여 훌륭한 코드베이스를 만듭니다! 🌟

✨ 제안하는 수정안
     `@Column`(name = "chord_example_id")
-    private Long chordExampleid;
+    private Long id;
🤖 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/main/java/com/mr/domain/learning/entity/ChordExample.java` around lines
31 - 32, Rename the ChordExample entity identifier field chordExampleid to the
project-standard id (or consistently camel-cased chordExampleId), and update all
references, accessors, and persistence mappings tied to that field while
preserving the existing chord_example_id column mapping.
src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java (1)

82-90: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

데이터베이스 종속적인 DDL 대신 Java 필드 초기화를 활용해 보세요.

columnDefinition에 특정 데이터베이스(MySQL 등)의 ENUM 문법과 DEFAULT 값을 하드코딩하면, H2 기반의 테스트 환경이나 다른 RDBMS(PostgreSQL 등)로 변경할 때 스키마 자동 생성 오류가 발생할 수 있습니다.
JPA의 이식성을 높이기 위해 데이터베이스 방언(Dialect)에 의존하지 않고 Java 객체 레벨에서 기본값을 설정하는 방법을 추천합니다. 하이버네이트의 이식성(Portability) 관련 가이드를 참고해 보세요. 코드가 한결 깔끔해지고 유지보수성도 좋아집니다! 👍

💡 제안하는 수정안
     // 공개 범위
     `@Enumerated`(EnumType.STRING)
-    `@Column`(name = "access_level", nullable = false, columnDefinition = "ENUM('PRIVATE', 'ACADEMY', 'PUBLIC') DEFAULT 'PRIVATE'")
-    private AccessLevel accessLevel;
+    `@Column`(name = "access_level", nullable = false)
+    private AccessLevel accessLevel = AccessLevel.PRIVATE;

     // 난이도
     `@Enumerated`(EnumType.STRING)
-    `@Column`(name = "level", nullable = false, columnDefinition = "ENUM('BASIC', 'MED', 'ADVANCED') DEFAULT 'BASIC'")
-    private Level level;
+    `@Column`(name = "level", nullable = false)
+    private Level level = Level.BASIC;
🤖 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/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java` around
lines 82 - 90, Update the accessLevel and level fields in BackingTrack to remove
the database-specific columnDefinition ENUM and DEFAULT clauses, while retaining
`@Enumerated`(EnumType.STRING) and nullable constraints. Initialize these Java
fields with AccessLevel.PRIVATE and Level.BASIC so new entities receive the
intended defaults independent of the database dialect.
🤖 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 `@src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java`:
- Around line 30-32: BackingTrack의 id 식별자에 자동 생성 전략이 누락되어 있습니다. `id` 필드의 `@Id`
선언에 환경에 맞는 `@GeneratedValue`를 추가하고, 데이터베이스 자동 증가를 사용하는 `GenerationType.IDENTITY`
전략을 설정하세요.

In `@src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java`:
- Around line 48-50: Replace the `@JoinColumn` annotation on the scalar
learningStepId field in UserLearingProgress with `@Column`, preserving the
learning_step_id column name and non-null constraint.
- Around line 35-37: UserLearingProgress 엔티티의 id 식별자 필드에 데이터베이스 자동 증가를 사용하는 기본키
생성 전략을 명시적으로 추가하세요. 기존 `@Id` 및 `@Column` 매핑은 유지하고, 수동 ID 할당 없이 저장되는 동작을 보장하세요.

---

Duplicate comments:
In `@src/main/java/com/mr/domain/learning/entity/Learning.java`:
- Around line 74-117: Learning 엔티티에 subtitle과 diagramUrl 필드 및 대응하는 JPA `@Column`
매핑을 추가하고, private Learning 생성자와 create 경로에서 전달된 값을 필드에 저장하세요. 또한 updateContent에서
두 필드를 갱신해 기존 값이 유실되지 않도록 하며, 제안된 컬럼명과 길이를 사용하세요.

In `@src/main/java/com/mr/domain/learning/entity/PlayingExample.java`:
- Around line 39-41: Update the midiFileUrl field mapping in PlayingExample by
removing the JSON column definition and retaining a standard non-JSON string
column mapping suitable for a URL value; keep the field’s required nullable
constraint unchanged.

In `@src/main/java/com/mr/domain/notification/entity/Notification.java`:
- Line 1: Notification 클래스 파일 최상단에 com.mr.domain.notification.entity 패키지 선언을
추가하세요. 기존 import 선언보다 앞에 배치하고, BaseTimeDeletedEntity import 및 클래스 구현은 변경하지 마세요.

In `@src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java`:
- Around line 32-35: Update the tier field in Subscription to use the existing
SubscriptionTier enum instead of String, and annotate it with
`@Enumerated`(EnumType.STRING) so the database continues storing readable enum
names while application code gains type safety. Add the required JPA and
SubscriptionTier imports.

---

Nitpick comments:
In `@src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java`:
- Around line 82-90: Update the accessLevel and level fields in BackingTrack to
remove the database-specific columnDefinition ENUM and DEFAULT clauses, while
retaining `@Enumerated`(EnumType.STRING) and nullable constraints. Initialize
these Java fields with AccessLevel.PRIVATE and Level.BASIC so new entities
receive the intended defaults independent of the database dialect.

In `@src/main/java/com/mr/domain/learning/entity/ChordExample.java`:
- Around line 31-32: Rename the ChordExample entity identifier field
chordExampleid to the project-standard id (or consistently camel-cased
chordExampleId), and update all references, accessors, and persistence mappings
tied to that field while preserving the existing chord_example_id column
mapping.

In `@src/main/java/com/mr/domain/learning/entity/PlayingExample.java`:
- Around line 27-28: Update the id column mapping in the PlayingExample entity
so the `@Column` name uses playing_example_id instead of learning_example_id,
keeping the primary-key naming consistent with the entity name.

In `@src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java`:
- Line 33: Rename the UserLearingProgress class to UserLearningProgress and
update the corresponding filename and all references throughout the application
to use the corrected symbol.

In `@src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java`:
- Line 1: Rename the subscriptions package directory from enitity to entity and
update the package declarations in Subscription.java and SubscriptionTier.java
accordingly, including the nested enums package, so all references use
com.mr.domain.subscriptions.entity consistently. Apply the changes at
src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java lines 1-1
and
src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java
lines 1-1.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ccdffa73-6cd6-458f-9a33-1b483ba6ea3f

📥 Commits

Reviewing files that changed from the base of the PR and between 444519b and d2ad998.

📒 Files selected for processing (17)
  • src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
  • src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/AccessLevel.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/Level.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/ScaleType.java
  • src/main/java/com/mr/domain/backingTrack/entity/enums/TrackType.java
  • src/main/java/com/mr/domain/learning/entity/ChordExample.java
  • src/main/java/com/mr/domain/learning/entity/Learning.java
  • src/main/java/com/mr/domain/learning/entity/LearningStep.java
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java
  • src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java
  • src/main/java/com/mr/domain/learning/entity/enums/LearningCategory.java
  • src/main/java/com/mr/domain/learning/entity/enums/LearningDifficulty.java
  • src/main/java/com/mr/domain/learning/entity/enums/UserLearningStatus.java
  • src/main/java/com/mr/domain/notification/entity/Notification.java
  • src/main/java/com/mr/domain/subscriptions/enitity/Subscription.java
  • src/main/java/com/mr/domain/subscriptions/enitity/enums/SubscriptionTier.java

Comment thread src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
Comment thread src/main/java/com/mr/domain/learning/entity/UserLearingProgress.java Outdated

@ownue ownue 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.

코드래빗 리뷰 반영 끝나신 건지 궁금합니다!

반영 완료된 항목들은 resolve 해주시거나, 반영할 필요 없는 것들은 해당 코멘트에 답글 기능으로 왜 반영할 필요가 없는지 작성해주시면 다시 리뷰 남기겠습니당

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java (1)

79-80: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

midiFileUrl 필드의 데이터 타입과 컬럼 정의가 불일치해 보입니다.

멋진 엔티티 설계입니다! 👍 다만, 필드명은 단일 URL을 의미하는 midiFileUrl인데, 데이터베이스 컬럼 타입은 JSON으로 설정되어 있어 의도가 조금 모호합니다.

  • 단순한 URL 문자열을 저장하는 것이라면 audioFileUrl처럼 length를 지정하는 일반 VARCHAR 매핑을 사용하는 것이 적절합니다.
  • 만약 다양한 MIDI 관련 데이터를 담은 JSON 형식의 메타데이터를 저장하는 것이 목적이라면, 필드명을 midiFileMetadata 등으로 변경하는 것이 좋습니다. 또한 Spring Boot 3.2(Hibernate 6)부터는 단순 String 대신 @JdbcTypeCode(SqlTypes.JSON)을 활용해 자바 레코드(Record)나 객체로 직접 매핑할 수 있으니 Hibernate JSON Mapping 가이드를 참고해 보세요!
💡 제안하는 수정안 (단순 URL일 경우)
-    `@Column`(name = "midi_file_url", columnDefinition = "JSON")
+    `@Column`(name = "midi_file_url", length = 255)
     private String midiFileUrl;
🤖 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/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java` around
lines 79 - 80, Resolve the mismatch in the BackingTrack entity’s midiFileUrl
mapping by treating it as a single URL: remove the JSON column definition and
use the project’s standard bounded VARCHAR/String mapping with an appropriate
length. Keep the field name midiFileUrl unless the implementation is
intentionally changed to store structured metadata, in which case rename it
consistently and apply explicit Hibernate JSON typing.
🧹 Nitpick comments (4)
src/main/java/com/mr/domain/notification/entity/Notification.java (1)

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

클래스 선언부 끝에 공백을 추가해 주세요.

사소한 부분이지만, BaseTimeDeletedEntity{ 사이에 공백이 누락되어 있습니다. 코드의 가독성과 일관성을 위해 띄어쓰기를 추가해 주세요! 🌟

🛠️ 제안하는 수정안
-public class Notification extends BaseTimeDeletedEntity{
+public class Notification extends BaseTimeDeletedEntity {
🤖 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/main/java/com/mr/domain/notification/entity/Notification.java` at line
31, Notification 클래스 선언부에서 상속 타입 BaseTimeDeletedEntity와 여는 중괄호 사이에 공백을 추가하여 기존
코드 스타일과 일관되게 정리하세요.
src/main/java/com/mr/domain/learning/entity/Learning.java (1)

90-104: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

팩토리 메서드의 매개변수 사용 의도를 명확히 해주세요

create 메서드에서 isActive 매개변수를 받고 있지만, 내부 빌더 호출 시에는 이를 무시하고 항상 true로 하드코딩하고 있습니다.
항상 활성화된 상태로 생성하는 것이 비즈니스 규칙이라면 혼란을 줄이기 위해 매개변수에서 isActive를 제거하는 것을 추천합니다. 외부의 값을 반영하는 것이 의도라면 파라미터를 그대로 .isActive(isActive)로 연결해 주세요.

✨ 파라미터 제거 시 제안하는 수정안
-    public static Learning create(String title, LearningCategory category, LearningDifficulty difficulty,
-                                  String summary, String content, String practiceTip,
-                                  Integer estimatedMinutes, String instrumentType, Boolean isActive) {
+    public static Learning create(String title, LearningCategory category, LearningDifficulty difficulty,
+                                  String summary, String content, String practiceTip,
+                                  Integer estimatedMinutes, String instrumentType) {
         return Learning.builder()
                 .title(title)
                 .category(category)
                 .difficulty(difficulty)
                 .summary(summary)
                 .content(content)
                 .practiceTip(practiceTip)
                 .estimatedMinutes(estimatedMinutes)
                 .instrumentType(instrumentType)
                 .isActive(true)
                 .build();
     }
🤖 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/main/java/com/mr/domain/learning/entity/Learning.java` around lines 90 -
104, Update the Learning.create factory method so the isActive parameter is no
longer ignored: either remove it from the method signature and callers if
creation must always activate records, or bind the provided value with
.isActive(isActive) if callers should control the state. Keep the chosen
behavior consistent with the factory’s intended business rule.
src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java (1)

69-74: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

필수 필드에 대한 검증 로직 추가를 고려해 보세요.

깔끔한 업데이트 메서드입니다! 👏 BackingTrack 엔티티와 마찬가지로, 이 필드들 역시 데이터베이스 스키마 상 nullable = false이므로 도메인 객체 레벨에서 null 검증 로직을 추가해 주시면 데이터 무결성을 더욱 든든하게 지킬 수 있습니다.

💡 제안하는 수정안 (전체 업데이트로 가정한 검증 예시)
     public void updateChordInfo(Integer sequenceNo, Integer measureNo, String chordName) {
+        java.util.Objects.requireNonNull(sequenceNo, "sequenceNo must not be null");
+        java.util.Objects.requireNonNull(measureNo, "measureNo must not be null");
+        java.util.Objects.requireNonNull(chordName, "chordName must not be null");
         this.sequenceNo = sequenceNo;
         this.measureNo = measureNo;
         this.chordName = chordName;
     }
🤖 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/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java` around
lines 69 - 74, Update ChordProgression.updateChordInfo to validate that
sequenceNo, measureNo, and chordName are non-null before assigning them, using
the entity’s existing validation convention if available; reject invalid input
without mutating the current state.
src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java (1)

140-152: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

일관된 Null 체크 또는 빠른 실패(Fail-fast) 검증 로직 추가를 권장합니다.

현재 accessLevellevelnull인지 확인 후 업데이트를 진행하지만, title이나 genre 등 다른 nullable = false 필드들은 체크 없이 값을 덮어쓰고 있습니다. 이 경우 null이 전달되면 데이터베이스 플러시 시점에 뒤늦게 예외가 발생할 수 있습니다.

이 메서드가 부분 업데이트(PATCH)를 위한 것이라면 모든 필드에 null 체크를 추가해 주시고, 전체 업데이트(PUT)를 위한 것이라면 Objects.requireNonNull()이나 Assert.notNull()을 통해 도메인 계층에서 즉시 예외를 던지도록 하여 디버깅을 쉽게 만드는 것을 추천합니다. JPA 엔티티 내에서의 방어적 복사 및 검증(Defensive Programming) 패턴을 활용하면 데이터 무결성을 높일 수 있습니다.

💡 제안하는 수정안 (부분 업데이트를 가정할 경우)
     public void updateTrackInfo(String title, String genre, String keySignature,
                                 ScaleType scaleType, String time, Integer bpm,
                                 Integer playtimeSec, AccessLevel accessLevel, Level level) {
-        this.title = title;
-        this.genre = genre;
-        this.keySignature = keySignature;
-        this.scaleType = scaleType;
-        this.time = time;
-        this.bpm = bpm;
-        this.playtimeSec = playtimeSec;
+        if (title != null) this.title = title;
+        if (genre != null) this.genre = genre;
+        if (keySignature != null) this.keySignature = keySignature;
+        if (scaleType != null) this.scaleType = scaleType;
+        if (time != null) this.time = time;
+        if (bpm != null) this.bpm = bpm;
+        if (playtimeSec != null) this.playtimeSec = playtimeSec;
         if (accessLevel != null) this.accessLevel = accessLevel;
         if (level != null) this.level = level;
     }
🤖 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/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java` around
lines 140 - 152, Update BackingTrack.updateTrackInfo to apply a consistent
null-handling policy across all parameters: if this is a partial update, guard
every field before assignment; otherwise fail fast with the project’s
established validation utility for all non-nullable fields. Preserve the
existing conditional behavior for accessLevel and level while preventing null
values from reaching persistence.
🤖 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 `@src/main/java/com/mr/domain/learning/entity/ChordExample.java`:
- Around line 77-83: Update updateChordExample so noteNumbers is modified in
place: when a non-null list is provided, clear the existing collection and add
all elements from the new list instead of assigning a new collection reference.
Preserve the existing chordName and description updates and the current
null-input behavior.

In `@src/main/java/com/mr/domain/learning/entity/Learning.java`:
- Around line 76-88: Update the estimatedMinutes assignment in the private
Learning constructor to handle a null Integer explicitly and assign the
appropriate default int value before unboxing; preserve the provided value when
non-null.

In `@src/main/java/com/mr/domain/subscriptions/entity/Subscription.java`:
- Around line 33-82: Subscription의 tier 필드와 관련 생성·변경 메서드에서 String 대신
SubscriptionTier를 사용하도록 변경하고, 필드에 `@Enumerated`(EnumType.STRING)을 적용해 데이터베이스에는 열거형
이름으로 저장되게 하세요. create와 changeTier를 포함해 tier를 다루는 모든 시그니처와 할당을 SubscriptionTier에
맞게 수정하고 필요한 import를 추가하세요.

---

Outside diff comments:
In `@src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java`:
- Around line 79-80: Resolve the mismatch in the BackingTrack entity’s
midiFileUrl mapping by treating it as a single URL: remove the JSON column
definition and use the project’s standard bounded VARCHAR/String mapping with an
appropriate length. Keep the field name midiFileUrl unless the implementation is
intentionally changed to store structured metadata, in which case rename it
consistently and apply explicit Hibernate JSON typing.

---

Nitpick comments:
In `@src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java`:
- Around line 140-152: Update BackingTrack.updateTrackInfo to apply a consistent
null-handling policy across all parameters: if this is a partial update, guard
every field before assignment; otherwise fail fast with the project’s
established validation utility for all non-nullable fields. Preserve the
existing conditional behavior for accessLevel and level while preventing null
values from reaching persistence.

In `@src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java`:
- Around line 69-74: Update ChordProgression.updateChordInfo to validate that
sequenceNo, measureNo, and chordName are non-null before assigning them, using
the entity’s existing validation convention if available; reject invalid input
without mutating the current state.

In `@src/main/java/com/mr/domain/learning/entity/Learning.java`:
- Around line 90-104: Update the Learning.create factory method so the isActive
parameter is no longer ignored: either remove it from the method signature and
callers if creation must always activate records, or bind the provided value
with .isActive(isActive) if callers should control the state. Keep the chosen
behavior consistent with the factory’s intended business rule.

In `@src/main/java/com/mr/domain/notification/entity/Notification.java`:
- Line 31: Notification 클래스 선언부에서 상속 타입 BaseTimeDeletedEntity와 여는 중괄호 사이에 공백을
추가하여 기존 코드 스타일과 일관되게 정리하세요.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d491ea2f-2c19-41a5-8ba0-299d0108a774

📥 Commits

Reviewing files that changed from the base of the PR and between cb0769d and eb93eb7.

📒 Files selected for processing (10)
  • src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
  • src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java
  • src/main/java/com/mr/domain/learning/entity/ChordExample.java
  • src/main/java/com/mr/domain/learning/entity/Learning.java
  • src/main/java/com/mr/domain/learning/entity/LearningStep.java
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java
  • src/main/java/com/mr/domain/learning/entity/UserLearningProgress.java
  • src/main/java/com/mr/domain/notification/entity/Notification.java
  • src/main/java/com/mr/domain/subscriptions/entity/Subscription.java
  • src/main/java/com/mr/domain/subscriptions/entity/enums/SubscriptionTier.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java

Comment thread src/main/java/com/mr/domain/learning/entity/ChordExample.java
Comment thread src/main/java/com/mr/domain/learning/entity/Learning.java
Comment thread src/main/java/com/mr/domain/subscriptions/entity/Subscription.java
@rkdehdrbs7885-oss

Copy link
Copy Markdown
Contributor Author

네, 코드래빗 리뷰 반영 모두 완료했습니다!
지적해 준 피드백 및 Resolve 처리도 마쳐두었으니 다시 리뷰 부탁드립니다!

@rkdehdrbs7885-oss
rkdehdrbs7885-oss requested a review from ownue July 20, 2026 10:55

@kimyw1018 kimyw1018 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.

수고하셨습니다

pr내용에 이슈번호 close 달아주세요

Comment thread src/main/java/com/mr/domain/subscriptions/entity/Subscription.java
Comment thread src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
@ownue ownue added the ✨feat label Jul 21, 2026

@ownue ownue 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.

전체적으로 엔티티 생성 방식과 수정 메서드가 일관되게 구성되어 있어 확인하기 편했습니다!

다만 생성해두신 enum들이 실제 코드에 반영되지 않은 것이나, 사용자별 학습 단계/학습 단계 순서/코드 진행 순서처럼 중복되면 안 될 것으로 보이는 조합에 unique constraint가 없는 부분은 확인이 필요할 것 같습니다!

또한, 난이도 enum 명칭을 BASIC, MED, ADVANCED로 쓴 곳과 BEGINNER, INTERMEDIATE, ADVANCED 쓴 곳이 있는데 후자로 통일하면 좋지 않을지 여쭙습니다.

원시 타입과 래퍼 타입 사용을 혼용하셨는데, 이 부분도 의도하신 건지 한 번씩 확인 부탁드립니다!

마지막으로, 불필요한 주석(의미가 명확하거나 이해하고 있는 분야인데 작성한 것들)들은 삭제하시는 게 좋을 것 같습니다!

Comment thread src/main/java/com/mr/domain/learning/entity/PlayingExample.java
Comment on lines +42 to +45
// 미디 파일 데이터
@JdbcTypeCode(SqlTypes.JSON)
@Column(name = "midi_file_url", nullable = false, columnDefinition = "JSON")
private String midiFileUrl;

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.

필드명은 midiFileUrl인데 DB 타입은 JSON으로 지정되어 있어 저장하려는 값의 형태를 한 번 확인해야 할 것 같습니다!

MIDI 파일 경로를 저장하는 필드라면 VARCHAR로 두는 것이 맞고, MIDI 이벤트 등의 실제 JSON 데이터를 저장하려는 목적이라면 midiData 등으로 이름을 변경하고 JsonNode 또는 별도 데이터 객체로 매핑하는 편이 명확할 것 같습니다.

Comment thread src/main/java/com/mr/domain/backingTrack/entity/enums/TrackType.java Outdated
Comment on lines +53 to +61
// 정적 팩토리 메서드 (구독 생성)
public static Subscription create(Long userId, String tier, LocalDateTime startDate, LocalDateTime endDate) {
return Subscription.builder()
.userId(userId)
.tier(tier)
.startDate(startDate)
.endDate(endDate)
.build();
}

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.

구독 생성 시 startDate가 endDate보다 이후인 값도 현재는 그대로 저장될 수 있을 것 같습니다! 엔티티 생성 시 종료일이 시작일 이후인지 검증하고, 유효하지 않은 경우 구독 도메인 예외를 발생시키는 방식은 어떨까요? 검증 메서드가 있으면 좋겠습니다~!

Comment on lines +69 to +74
// 구독 기간 연장
public void extendSubscription(LocalDateTime newEndDate) {
if (newEndDate != null && newEndDate.isAfter(this.endDate)) {
this.endDate = newEndDate;
}
}

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.

현재는 newEndDate가 null이거나 기존 종료일보다 빠르면 아무 동작 없이 종료되어 호출 측에서 연장 실패를 확인하기 어려울 것 같습니다! PR 리뷰 요청 사항에 예외 코드 처리 방식이 포함되어 있는데, 유효하지 않은 연장 요청에는 도메인 예외를 발생시키는 방향을 고려하신 건지 궁금합니다.

// 현재 구독 유효 여부 확인 (현재 시간이 시작일과 종료일 사이인지)
public boolean isActive() {
LocalDateTime now = LocalDateTime.now();
return !now.isBefore(this.startDate) && !now.isAfter(this.endDate);

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.

이건 별 건 아니지만... 현재 isActive()는 now가 endDate와 정확히 같은 경우에도 활성 상태로 판단하고 있는데용 구독 기간을 시작일 이상~종료일 미만으로 관리하는 건지, endDate도 포함하는 건지 정책에 명확히 정하고 가면 좋겠습니당 (endDate를 어떻게 저장할 건지 / 이미 정해져 있다면... 앞으로 코드 짤 때 잘 반영하는 걸루....)

Comment on lines +154 to +157
// 재생 수 1 증가
public void incrementPlayCount() {
this.playCount++;
}

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.

재생 수가 동시에 증가할 경우 두 요청이 같은 값을 읽고 저장하면서 증가한 수치가 잘못 반영될 수 있을 것 같습니다!

당장 필요한 건 아니지만, 고도화나... 정확성 이런 걸 고려하면 엔티티 조회 후 증가시키기보다 Repository에서 play_count = play_count + 1 형태의 원자적 UPDATE를 사용하는 방식을 고려해도 좋을 것 같아요!

Comment thread src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java Outdated

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/java/com/mr/domain/learning/entity/Learning.java (1)

114-125: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

필수 필드 null 대입을 막아주세요.
깔끔한 엔티티인데, updateContent()nullable = falsetitle, category, difficulty, content를 그대로 덮어써서 부분 수정 시 null이 들어오면 무효 상태가 됩니다. 전체 갱신이면 Objects.requireNonNull(...)로 즉시 막고, 부분 갱신이면 null일 때 기존 값을 유지하도록 정책을 통일해 주세요. @Column(nullable = false)와 메서드 계약을 같이 맞추는 게 안전합니다.

🤖 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/main/java/com/mr/domain/learning/entity/Learning.java` around lines 114 -
125, Update Learning.updateContent so nullable=false fields title, category,
difficulty, and content cannot be assigned null: either require non-null values
for full updates or preserve existing values for partial updates, applying one
consistent policy. Align the method’s behavior with the entity’s
`@Column`(nullable = false) contract while keeping nullable optional fields
unchanged.
🧹 Nitpick comments (2)
src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java (1)

63-76: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

엔티티 생성 및 수정 시 Fail-fast 검증을 추가해 보세요.

팩토리 메서드와 빌더의 접근 제어자를 조합하여 캡슐화를 철저하게 유지하신 설계는 정말 훌륭합니다! 🔒 여기에 든든한 문지기(유효성 검증)만 추가하면 완벽할 것 같습니다.

현재 엔티티 필드에 @Column(nullable = false)가 선언되어 있지만, 이는 DB 스키마 생성 및 DB 레벨의 방어막일 뿐 자바 객체 상태를 보호해 주지는 않습니다. 유효하지 않은 null 값이 들어왔을 때 JPA 영속화(flush) 시점까지 가서야 DB 에러로 터지기보다는, 객체가 생성/수정되는 즉시 예외를 던지는 Fail-fast 패턴을 적용하는 것이 좋습니다.

도메인 불변성(Domain Invariants)을 애플리케이션 레벨에서 보장할 수 있도록 Objects.requireNonNull이나 Spring의 Assert를 활용한 검증 로직 추가를 권장합니다.

🛡️ 검증 로직 추가 제안 (java.util.Objects 활용)
-    public static ChordProgression create(BackingTrack backingTrack, Integer sequenceNo, Integer measureNo, String chordName) {
+    public static ChordProgression create(BackingTrack backingTrack, Integer sequenceNo, Integer measureNo, String chordName) {
+        Objects.requireNonNull(backingTrack, "backingTrack은 필수입니다.");
+        Objects.requireNonNull(sequenceNo, "sequenceNo는 필수입니다.");
+        Objects.requireNonNull(measureNo, "measureNo는 필수입니다.");
+        Objects.requireNonNull(chordName, "chordName은 필수입니다.");
         return ChordProgression.builder()
                 .backingTrack(backingTrack)
                 .sequenceNo(sequenceNo)
                 .measureNo(measureNo)
                 .chordName(chordName)
                 .build();
     }

-    public void updateChordInfo(Integer sequenceNo, Integer measureNo, String chordName) {
-        this.sequenceNo = sequenceNo;
-        this.measureNo = measureNo;
-        this.chordName = chordName;
+    public void updateChordInfo(Integer sequenceNo, Integer measureNo, String chordName) {
+        this.sequenceNo = Objects.requireNonNull(sequenceNo, "sequenceNo는 필수입니다.");
+        this.measureNo = Objects.requireNonNull(measureNo, "measureNo는 필수입니다.");
+        this.chordName = Objects.requireNonNull(chordName, "chordName은 필수입니다.");
     }
🤖 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/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java` around
lines 63 - 76, Update ChordProgression.create and updateChordInfo to fail fast
when sequenceNo, measureNo, or chordName is null by validating each input before
assigning or passing it to the builder, using Objects.requireNonNull or the
project’s established assertion utility. Preserve the existing creation and
update behavior for valid values.
src/main/java/com/mr/domain/subscriptions/entity/Subscription.java (1)

66-70: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

필수 값(Null)에 대해 빠른 실패(Fail-Fast)를 적용해 보세요.

현재 startDateendDate 필드는 @Column(nullable = false)로 설정되어 있습니다. 메서드 내부에서 null을 무시하고 넘어가면, 결국 데이터베이스 저장 시점에 예외가 발생하게 됩니다.
도메인 로직 내에서 Objects.requireNonNull() 등을 사용해 미리 검증하면 디버깅이 쉬워지고 예측 불가능한 에러를 방지할 수 있습니다! (참고: Fail-Fast 기법)

팀 리뷰 피드백을 반영해 멋지게 추가하신 예외 처리 로직에 꼼꼼함을 조금 더 더해보세요.

💡 빠른 실패를 적용한 리팩터링 제안
-    private static void validateDates(LocalDateTime startDate, LocalDateTime endDate) {
-        if (startDate != null && endDate != null && endDate.isBefore(startDate)) {
+    private static void validateDates(LocalDateTime startDate, LocalDateTime endDate) {
+        java.util.Objects.requireNonNull(startDate, "startDate는 필수입니다.");
+        java.util.Objects.requireNonNull(endDate, "endDate는 필수입니다.");
+        if (endDate.isBefore(startDate)) {
             throw new SubscriptionException(SubscriptionErrorStatus.INVALID_SUBSCRIPTION_DATE);
         }
     }
🤖 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/main/java/com/mr/domain/subscriptions/entity/Subscription.java` around
lines 66 - 70, Update validateDates in Subscription to fail fast when either
required date argument is null, using Objects.requireNonNull or the project’s
established null-validation approach before the chronological comparison.
Preserve the existing INVALID_SUBSCRIPTION_DATE exception for non-null dates
where endDate precedes startDate.
🤖 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.

Outside diff comments:
In `@src/main/java/com/mr/domain/learning/entity/Learning.java`:
- Around line 114-125: Update Learning.updateContent so nullable=false fields
title, category, difficulty, and content cannot be assigned null: either require
non-null values for full updates or preserve existing values for partial
updates, applying one consistent policy. Align the method’s behavior with the
entity’s `@Column`(nullable = false) contract while keeping nullable optional
fields unchanged.

---

Nitpick comments:
In `@src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java`:
- Around line 63-76: Update ChordProgression.create and updateChordInfo to fail
fast when sequenceNo, measureNo, or chordName is null by validating each input
before assigning or passing it to the builder, using Objects.requireNonNull or
the project’s established assertion utility. Preserve the existing creation and
update behavior for valid values.

In `@src/main/java/com/mr/domain/subscriptions/entity/Subscription.java`:
- Around line 66-70: Update validateDates in Subscription to fail fast when
either required date argument is null, using Objects.requireNonNull or the
project’s established null-validation approach before the chronological
comparison. Preserve the existing INVALID_SUBSCRIPTION_DATE exception for
non-null dates where endDate precedes startDate.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: e3fb24e2-0ace-434e-8620-1fe26af16bad

📥 Commits

Reviewing files that changed from the base of the PR and between 4ee86e5 and 3327c45.

📒 Files selected for processing (9)
  • src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java
  • src/main/java/com/mr/domain/backingTrack/entity/ChordProgression.java
  • src/main/java/com/mr/domain/learning/entity/Learning.java
  • src/main/java/com/mr/domain/learning/entity/LearningStep.java
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java
  • src/main/java/com/mr/domain/learning/entity/UserLearningProgress.java
  • src/main/java/com/mr/domain/subscriptions/entity/Subscription.java
  • src/main/java/com/mr/domain/subscriptions/entity/enums/SubscriptionErrorStatus.java
  • src/main/java/com/mr/domain/subscriptions/exception/SubscriptionException.java
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/main/java/com/mr/domain/learning/entity/PlayingExample.java
  • src/main/java/com/mr/domain/learning/entity/LearningStep.java
  • src/main/java/com/mr/domain/backingTrack/entity/BackingTrack.java

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.

Exception은 모든 도메인이 GeneralException을 사용하고, ErrorStatus를 exception 패키지 내에 넣는 게 컨벤션 상 적절한 것 같습니다!

@rkdehdrbs7885-oss
rkdehdrbs7885-oss requested a review from ownue July 21, 2026 11:55

@ownue ownue 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.

수고하셨습니다!

@rkdehdrbs7885-oss
rkdehdrbs7885-oss merged commit 15f82bb into develop Jul 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Feature - 학습, 학습 진행 상태, 알림 엔티티 구현

3 participants